From 8110e8f10bc702fc64be73e8ee5b2e5c87b04244 Mon Sep 17 00:00:00 2001 From: kiri Date: Sat, 28 Feb 2026 14:18:57 +0100 Subject: [PATCH] Initial commit --- README.md | 23 + facter-orion.json | 1913 +++++++++++++++++ flake.lock | 614 ++++++ flake.nix | 33 + modules/bitwarden.nix | 18 + modules/defaults.nix | 12 + modules/dendritic.nix | 15 + modules/dev.nix | 21 + modules/email.nix | 114 + modules/flake-file.nix | 6 + modules/helium.nix | 12 + modules/hosts.nix | 29 + modules/keys.nix | 32 + modules/kiri.nix | 16 + modules/neovim/default.nix | 180 ++ modules/neovim/lua-config/init.lua | 5 + modules/neovim/lua-config/lua/options.lua | 138 ++ .../neovim/lua-config/lua/plugins/coding.lua | 230 ++ .../neovim/lua-config/lua/plugins/editor.lua | 240 +++ modules/neovim/lua-config/lua/plugins/lsp.lua | 166 ++ modules/neovim/lua-config/lua/plugins/ui.lua | 202 ++ modules/niri.nix | 309 +++ modules/nix.nix | 26 + modules/noctalia.nix | 566 +++++ modules/nvf.nix | 246 +++ modules/orion-disk-config.nix | 65 + modules/orion-hardware.nix | 43 + modules/orion.nix | 134 ++ modules/pim.nix | 79 + modules/polaris-hardware.nix | 51 + modules/polaris.nix | 14 + modules/region.nix | 21 + modules/sddm.nix | 17 + modules/secrets/.sops.yaml | 11 + modules/secrets/secrets.yaml | 38 + modules/secrets/sops.nix | 26 + modules/shell.nix | 189 ++ modules/state.nix | 10 + modules/syncthing.nix | 49 + modules/terminal.nix | 88 + modules/users.nix | 21 + modules/vm.nix | 24 + modules/workstation.nix | 194 ++ modules/xdg.nix | 40 + programs/helium.nix | 101 + 45 files changed, 6381 insertions(+) create mode 100644 README.md create mode 100644 facter-orion.json create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 modules/bitwarden.nix create mode 100644 modules/defaults.nix create mode 100644 modules/dendritic.nix create mode 100644 modules/dev.nix create mode 100644 modules/email.nix create mode 100644 modules/flake-file.nix create mode 100644 modules/helium.nix create mode 100644 modules/hosts.nix create mode 100644 modules/keys.nix create mode 100644 modules/kiri.nix create mode 100644 modules/neovim/default.nix create mode 100644 modules/neovim/lua-config/init.lua create mode 100644 modules/neovim/lua-config/lua/options.lua create mode 100644 modules/neovim/lua-config/lua/plugins/coding.lua create mode 100644 modules/neovim/lua-config/lua/plugins/editor.lua create mode 100644 modules/neovim/lua-config/lua/plugins/lsp.lua create mode 100644 modules/neovim/lua-config/lua/plugins/ui.lua create mode 100644 modules/niri.nix create mode 100644 modules/nix.nix create mode 100644 modules/noctalia.nix create mode 100644 modules/nvf.nix create mode 100644 modules/orion-disk-config.nix create mode 100644 modules/orion-hardware.nix create mode 100644 modules/orion.nix create mode 100644 modules/pim.nix create mode 100644 modules/polaris-hardware.nix create mode 100644 modules/polaris.nix create mode 100644 modules/region.nix create mode 100644 modules/sddm.nix create mode 100644 modules/secrets/.sops.yaml create mode 100644 modules/secrets/secrets.yaml create mode 100644 modules/secrets/sops.nix create mode 100644 modules/shell.nix create mode 100644 modules/state.nix create mode 100644 modules/syncthing.nix create mode 100644 modules/terminal.nix create mode 100644 modules/users.nix create mode 100644 modules/vm.nix create mode 100644 modules/workstation.nix create mode 100644 modules/xdg.nix create mode 100644 programs/helium.nix diff --git a/README.md b/README.md new file mode 100644 index 0000000..edf3d18 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# Getting Started Guide + +Steps you can follow after cloning this template: + +- Be sure to read the [den documentation](https://vic.github.io/den) + +- Update den input. + +```console +nix flake update den +``` + +- Edit [modules/hosts.nix](modules/hosts.nix) + +- Run the VM + +We recommend to use a VM develop cycle so you can play with the system before applying to your hardware. + +See [modules/vm.nix](modules/vm.nix) + +```console +nix run .#vm +``` diff --git a/facter-orion.json b/facter-orion.json new file mode 100644 index 0000000..087afd1 --- /dev/null +++ b/facter-orion.json @@ -0,0 +1,1913 @@ +{ + "version": 1, + "system": "x86_64-linux", + "virtualisation": "kvm", + "hardware": { + "bios": { + "apm_info": { + "supported": false, + "enabled": false, + "version": 0, + "sub_version": 0, + "bios_flags": 0 + }, + "vbe_info": { + "version": 0, + "video_memory": 0 + }, + "pnp": true, + "pnp_id": 0, + "lba_support": false, + "low_memory_size": 654336, + "smbios_version": 520 + }, + "bridge": [ + { + "index": 11, + "attached_to": 0, + "class_list": [ + "pci", + "bridge" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 31 + }, + "base_class": { + "hex": "0006", + "name": "Bridge", + "value": 6 + }, + "sub_class": { + "hex": "0004", + "name": "PCI bridge", + "value": 4 + }, + "pci_interface": { + "hex": "0000", + "name": "Normal decode", + "value": 0 + }, + "vendor": { + "hex": "1b36", + "value": 6966 + }, + "device": { + "hex": "0001", + "value": 1 + }, + "model": "PCI bridge", + "sysfs_id": "/devices/pci0000:00/0000:00:1f.0", + "sysfs_bus_id": "0000:00:1f.0", + "resources": [ + { + "type": "irq", + "base": 11, + "triggered": 0, + "enabled": true + }, + { + "type": "mem", + "base": 61572651159552, + "range": 256, + "enabled": true, + "access": "read_write", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 259, + "header_type": 1, + "secondary_bus": 2, + "irq": 11, + "prog_if": 0 + }, + "module_alias": "pci:v00001B36d00000001sv00000000sd00000000bc06sc04i00" + }, + { + "index": 12, + "attached_to": 0, + "class_list": [ + "pci", + "bridge" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 1 + }, + "base_class": { + "hex": "0006", + "name": "Bridge", + "value": 6 + }, + "sub_class": { + "hex": "0001", + "name": "ISA bridge", + "value": 1 + }, + "vendor": { + "hex": "8086", + "name": "Intel Corporation", + "value": 32902 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "7000", + "value": 28672 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "model": "Intel ISA bridge", + "sysfs_id": "/devices/pci0000:00/0000:00:01.0", + "sysfs_bus_id": "0000:00:01.0", + "detail": { + "function": 0, + "command": 259, + "header_type": 0, + "secondary_bus": 0, + "irq": 0, + "prog_if": 0 + }, + "module_alias": "pci:v00008086d00007000sv00001AF4sd00001100bc06sc01i00" + }, + { + "index": 13, + "attached_to": 0, + "class_list": [ + "pci", + "bridge" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 30 + }, + "base_class": { + "hex": "0006", + "name": "Bridge", + "value": 6 + }, + "sub_class": { + "hex": "0004", + "name": "PCI bridge", + "value": 4 + }, + "pci_interface": { + "hex": "0000", + "name": "Normal decode", + "value": 0 + }, + "vendor": { + "hex": "1b36", + "value": 6966 + }, + "device": { + "hex": "0001", + "value": 1 + }, + "model": "PCI bridge", + "sysfs_id": "/devices/pci0000:00/0000:00:1e.0", + "sysfs_bus_id": "0000:00:1e.0", + "resources": [ + { + "type": "irq", + "base": 10, + "triggered": 0, + "enabled": true + }, + { + "type": "mem", + "base": 61572651155456, + "range": 256, + "enabled": true, + "access": "read_write", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 259, + "header_type": 1, + "secondary_bus": 1, + "irq": 10, + "prog_if": 0 + }, + "module_alias": "pci:v00001B36d00000001sv00000000sd00000000bc06sc04i00" + }, + { + "index": 14, + "attached_to": 0, + "class_list": [ + "pci", + "bridge" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 0 + }, + "base_class": { + "hex": "0006", + "name": "Bridge", + "value": 6 + }, + "sub_class": { + "hex": "0000", + "name": "Host bridge", + "value": 0 + }, + "vendor": { + "hex": "8086", + "name": "Intel Corporation", + "value": 32902 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "1237", + "value": 4663 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "revision": { + "hex": "0002", + "value": 2 + }, + "model": "Intel Host bridge", + "sysfs_id": "/devices/pci0000:00/0000:00:00.0", + "sysfs_bus_id": "0000:00:00.0", + "detail": { + "function": 0, + "command": 259, + "header_type": 0, + "secondary_bus": 0, + "irq": 0, + "prog_if": 0 + }, + "module_alias": "pci:v00008086d00001237sv00001AF4sd00001100bc06sc00i00" + }, + { + "index": 15, + "attached_to": 0, + "class_list": [ + "pci", + "bridge" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 1 + }, + "base_class": { + "hex": "0006", + "name": "Bridge", + "value": 6 + }, + "sub_class": { + "hex": "0080", + "name": "Bridge", + "value": 128 + }, + "vendor": { + "hex": "8086", + "name": "Intel Corporation", + "value": 32902 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "7113", + "value": 28947 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "revision": { + "hex": "0003", + "value": 3 + }, + "model": "Intel Bridge", + "sysfs_id": "/devices/pci0000:00/0000:00:01.3", + "sysfs_bus_id": "0000:00:01.3", + "resources": [ + { + "type": "irq", + "base": 9, + "triggered": 0, + "enabled": true + } + ], + "detail": { + "function": 3, + "command": 259, + "header_type": 0, + "secondary_bus": 0, + "irq": 9, + "prog_if": 0 + }, + "driver": "piix4_smbus", + "driver_module": "i2c_piix4", + "drivers": [ + "piix4_smbus" + ], + "driver_modules": [ + "i2c_piix4" + ], + "module_alias": "pci:v00008086d00007113sv00001AF4sd00001100bc06sc80i00" + } + ], + "cdrom": [ + { + "index": 26, + "attached_to": 18, + "class_list": [ + "cdrom", + "scsi", + "block_device" + ], + "bus_type": { + "hex": "0084", + "name": "SCSI", + "value": 132 + }, + "slot": { + "bus": 2, + "number": 0 + }, + "base_class": { + "hex": "0106", + "name": "Mass Storage Device", + "value": 262 + }, + "sub_class": { + "hex": "0002", + "name": "CD-ROM", + "value": 2 + }, + "pci_interface": { + "hex": "0003", + "name": "DVD", + "value": 3 + }, + "vendor": { + "hex": "0000", + "name": "QEMU", + "value": 0 + }, + "device": { + "hex": "0000", + "name": "QEMU DVD-ROM", + "value": 0 + }, + "revision": { + "hex": "0000", + "name": "2.5+", + "value": 0 + }, + "model": "QEMU DVD-ROM", + "sysfs_id": "/class/block/sr0", + "sysfs_bus_id": "2:0:0:0", + "sysfs_device_link": "/devices/pci0000:00/0000:00:01.1/ata2/host2/target2:0:0/2:0:0:0", + "unix_device_name": "/dev/sr0", + "unix_device_number": { + "type": 98, + "major": 11, + "minor": 0, + "range": 1 + }, + "unix_device_names": [ + "/dev/cdrom", + "/dev/disk/by-id/ata-QEMU_DVD-ROM_QM00003", + "/dev/disk/by-label/cidata", + "/dev/disk/by-path/pci-0000:00:01.1-ata-2", + "/dev/disk/by-path/pci-0000:00:01.1-ata-2.0", + "/dev/disk/by-uuid/2026-02-16-16-32-14-00", + "/dev/sr0" + ], + "unix_device_name2": "/dev/sg1", + "unix_device_number2": { + "type": 99, + "major": 21, + "minor": 1, + "range": 1 + }, + "driver": "ata_piix", + "driver_module": "ata_piix", + "drivers": [ + "ata_piix", + "sr" + ], + "driver_modules": [ + "ata_piix", + "sr_mod" + ] + } + ], + "cpu": [ + { + "architecture": "x86_64", + "vendor_name": "GenuineIntel", + "family": 6, + "model": 61, + "stepping": 2, + "features": [ + "fpu", + "vme", + "de", + "pse", + "tsc", + "msr", + "pae", + "mce", + "cx8", + "apic", + "sep", + "mtrr", + "pge", + "mca", + "cmov", + "pat", + "pse36", + "clflush", + "mmx", + "fxsr", + "sse", + "sse2", + "ht", + "syscall", + "nx", + "rdtscp", + "lm", + "constant_tsc", + "rep_good", + "nopl", + "xtopology", + "cpuid", + "tsc_known_freq", + "pni", + "pclmulqdq", + "ssse3", + "fma", + "cx16", + "pcid", + "sse4_1", + "sse4_2", + "x2apic", + "movbe", + "popcnt", + "tsc_deadline_timer", + "aes", + "xsave", + "avx", + "f16c", + "rdrand", + "hypervisor", + "lahf_lm", + "abm", + "3dnowprefetch", + "cpuid_fault", + "pti", + "ssbd", + "ibrs", + "ibpb", + "stibp", + "fsgsbase", + "bmi1", + "avx2", + "smep", + "bmi2", + "erms", + "invpcid", + "rdseed", + "adx", + "smap", + "xsaveopt", + "arat", + "md_clear" + ], + "bugs": [ + "cpu_meltdown", + "spectre_v1", + "spectre_v2", + "spec_store_bypass", + "l1tf", + "mds", + "swapgs", + "itlb_multihit", + "srbds", + "mmio_unknown", + "bhi", + "its" + ], + "bogo": 4399.99, + "cache": 16384, + "units": 6, + "physical_id": 0, + "siblings": 6, + "cores": 6, + "fpu": true, + "fpu_exception": true, + "cpuid_level": 13, + "write_protect": false, + "clflush_size": 64, + "cache_alignment": 64, + "address_sizes": { + "physical": "0x2e", + "virtual": "0x30" + } + } + ], + "disk": [ + { + "index": 27, + "attached_to": 21, + "class_list": [ + "disk", + "scsi", + "block_device" + ], + "bus_type": { + "hex": "0084", + "name": "SCSI", + "value": 132 + }, + "slot": { + "bus": 0, + "number": 0 + }, + "base_class": { + "hex": "0106", + "name": "Mass Storage Device", + "value": 262 + }, + "sub_class": { + "hex": "0000", + "name": "Disk", + "value": 0 + }, + "vendor": { + "hex": "0000", + "name": "QEMU", + "value": 0 + }, + "device": { + "hex": "0000", + "name": "QEMU HARDDISK", + "value": 0 + }, + "revision": { + "hex": "0000", + "name": "2.5+", + "value": 0 + }, + "model": "QEMU HARDDISK", + "sysfs_id": "/class/block/sda", + "sysfs_bus_id": "0:0:0:0", + "sysfs_device_link": "/devices/pci0000:00/0000:00:05.0/virtio1/host0/target0:0:0/0:0:0:0", + "unix_device_name": "/dev/sda", + "unix_device_number": { + "type": 98, + "major": 8, + "minor": 0, + "range": 16 + }, + "unix_device_names": [ + "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0", + "/dev/disk/by-path/pci-0000:00:05.0-scsi-0:0:0:0", + "/dev/sda" + ], + "unix_device_name2": "/dev/sg0", + "unix_device_number2": { + "type": 99, + "major": 21, + "minor": 0, + "range": 1 + }, + "rom_id": "0x80", + "resources": [ + { + "type": "disk_geo", + "cylinders": 26108, + "heads": 255, + "sectors": 63, + "size": "0x0", + "geo_type": "logical" + }, + { + "type": "size", + "unit": "sectors", + "value_1": 419430400, + "value_2": 512 + } + ], + "driver": "virtio_scsi", + "driver_module": "virtio_scsi", + "drivers": [ + "sd", + "virtio_scsi" + ], + "driver_modules": [ + "sd_mod", + "virtio_scsi" + ] + } + ], + "graphics_card": [ + { + "index": 19, + "attached_to": 0, + "class_list": [ + "graphics_card", + "pci" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 2 + }, + "base_class": { + "hex": "0003", + "name": "Display controller", + "value": 3 + }, + "sub_class": { + "hex": "0000", + "name": "VGA compatible controller", + "value": 0 + }, + "pci_interface": { + "hex": "0000", + "name": "VGA", + "value": 0 + }, + "vendor": { + "hex": "1234", + "value": 4660 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "1111", + "value": 4369 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "revision": { + "hex": "0002", + "value": 2 + }, + "model": "VGA compatible controller", + "sysfs_id": "/devices/pci0000:00/0000:00:02.0", + "sysfs_bus_id": "0000:00:02.0", + "resources": [ + { + "type": "mem", + "base": 4244635648, + "range": 16777216, + "enabled": true, + "access": "read_only", + "prefetch": "no" + }, + { + "type": "mem", + "base": 4272226304, + "range": 4096, + "enabled": true, + "access": "read_write", + "prefetch": "no" + }, + { + "type": "mem", + "base": 786432, + "range": 131072, + "enabled": false, + "access": "read_write", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 259, + "header_type": 0, + "secondary_bus": 0, + "irq": 0, + "prog_if": 0 + }, + "driver": "bochs-drm", + "driver_module": "bochs", + "drivers": [ + "bochs-drm" + ], + "driver_modules": [ + "bochs" + ], + "module_alias": "pci:v00001234d00001111sv00001AF4sd00001100bc03sc00i00" + } + ], + "hub": [ + { + "index": 28, + "attached_to": 10, + "class_list": [ + "usb", + "hub" + ], + "bus_type": { + "hex": "0086", + "name": "USB", + "value": 134 + }, + "slot": { + "bus": 0, + "number": 0 + }, + "base_class": { + "hex": "010a", + "name": "Hub", + "value": 266 + }, + "vendor": { + "hex": "1d6b", + "name": "Linux 6.14.10 uhci_hcd", + "value": 7531 + }, + "device": { + "hex": "0001", + "name": "UHCI Host Controller", + "value": 1 + }, + "revision": { + "hex": "0000", + "name": "6.14", + "value": 0 + }, + "serial": "0000:00:01.2", + "model": "Linux 6.14.10 uhci_hcd UHCI Host Controller", + "sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-0:1.0", + "sysfs_bus_id": "1-0:1.0", + "resources": [ + { + "type": "baud", + "speed": 12000000, + "bits": 0, + "stop_bits": 0, + "parity": 0, + "handshake": 0 + } + ], + "detail": { + "device_class": { + "hex": "0009", + "name": "hub", + "value": 9 + }, + "device_subclass": { + "hex": "0000", + "name": "per_interface", + "value": 0 + }, + "device_protocol": 0, + "interface_class": { + "hex": "0009", + "name": "hub", + "value": 9 + }, + "interface_subclass": { + "hex": "0000", + "name": "per_interface", + "value": 0 + }, + "interface_protocol": 0, + "interface_number": 0, + "interface_alternate_setting": 0 + }, + "hotplug": "usb", + "driver": "hub", + "driver_module": "usbcore", + "drivers": [ + "hub" + ], + "driver_modules": [ + "usbcore" + ], + "module_alias": "usb:v1D6Bp0001d0614dc09dsc00dp00ic09isc00ip00in00" + } + ], + "memory": [ + { + "index": 9, + "attached_to": 0, + "class_list": [ + "memory" + ], + "base_class": { + "hex": "0101", + "name": "Internally Used Class", + "value": 257 + }, + "sub_class": { + "hex": "0002", + "name": "Main Memory", + "value": 2 + }, + "model": "Main Memory", + "resources": [ + { + "type": "mem", + "base": 0, + "range": 12544561152, + "enabled": true, + "access": "read_write", + "prefetch": "unknown" + }, + { + "type": "phys_mem", + "range": 12884901888 + } + ] + } + ], + "monitor": [ + { + "index": 24, + "attached_to": 19, + "class_list": [ + "monitor" + ], + "base_class": { + "hex": "0100", + "name": "Monitor", + "value": 256 + }, + "sub_class": { + "hex": "0002", + "name": "LCD Monitor", + "value": 2 + }, + "vendor": { + "hex": "4914", + "value": 18708 + }, + "device": { + "hex": "1234", + "name": "QEMU Monitor", + "value": 4660 + }, + "serial": "0", + "model": "QEMU Monitor", + "resources": [ + { + "type": "monitor", + "width": 1024, + "height": 768, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 1280, + "height": 800, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 1600, + "height": 1200, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 1920, + "height": 1080, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 2048, + "height": 1152, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 640, + "height": 480, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "monitor", + "width": 800, + "height": 600, + "vertical_frequency": 60, + "interlaced": false + }, + { + "type": "size", + "unit": "mm", + "value_1": 325, + "value_2": 203 + } + ], + "detail": { + "manufacture_year": 2014, + "manufacture_week": 42, + "vertical_sync": { + "min": 50, + "max": 125 + }, + "horizontal_sync": { + "min": 30, + "max": 160 + }, + "horizontal_sync_timings": { + "disp": 1280, + "sync_start": 1600, + "sync_end": 1638, + "total": 1728 + }, + "vertical_sync_timings": { + "disp": 800, + "sync_start": 804, + "sync_end": 808, + "total": 828 + }, + "clock": 107300, + "width": 1280, + "height": 800, + "width_millimetres": 325, + "height_millimetres": 203, + "horizontal_flag": 45, + "vertical_flag": 45, + "vendor": "", + "name": "QEMU Monitor" + }, + "driver_info": { + "type": "display", + "width": 2048, + "height": 1152, + "vertical_sync": { + "min": 50, + "max": 125 + }, + "horizontal_sync": { + "min": 30, + "max": 160 + }, + "bandwidth": 0, + "horizontal_sync_timings": { + "disp": 1280, + "sync_start": 1600, + "sync_end": 1638, + "total": 1728 + }, + "vertical_sync_timings": { + "disp": 800, + "sync_start": 804, + "sync_end": 808, + "total": 828 + }, + "horizontal_flag": 45, + "vertical_flag": 45 + } + } + ], + "network_controller": [ + { + "index": 22, + "attached_to": 16, + "class_list": [ + "network_controller" + ], + "bus_type": { + "hex": "008f", + "name": "Virtio", + "value": 143 + }, + "slot": { + "bus": 0, + "number": 0 + }, + "base_class": { + "hex": "0002", + "name": "Network controller", + "value": 2 + }, + "sub_class": { + "hex": "0000", + "name": "Ethernet controller", + "value": 0 + }, + "vendor": "Virtio", + "device": "Ethernet Card 0", + "model": "Virtio Ethernet Card 0", + "sysfs_id": "/devices/pci0000:00/0000:00:12.0/virtio2", + "sysfs_bus_id": "virtio2", + "unix_device_name": "ens18", + "unix_device_names": [ + "ens18" + ], + "resources": [ + { + "type": "hwaddr", + "address": 48 + }, + { + "type": "phwaddr", + "address": 48 + } + ], + "driver": "virtio_net", + "driver_module": "virtio_net", + "drivers": [ + "virtio_net" + ], + "driver_modules": [ + "virtio_net" + ], + "module_alias": "virtio:d00000001v00001AF4" + } + ], + "network_interface": [ + { + "index": 29, + "attached_to": 22, + "class_list": [ + "network_interface" + ], + "base_class": { + "hex": "0107", + "name": "Network Interface", + "value": 263 + }, + "sub_class": { + "hex": "0001", + "name": "Ethernet", + "value": 1 + }, + "model": "Ethernet network interface", + "sysfs_id": "/class/net/ens18", + "sysfs_device_link": "/devices/pci0000:00/0000:00:12.0/virtio2", + "unix_device_name": "ens18", + "unix_device_names": [ + "ens18" + ], + "resources": [ + { + "type": "hwaddr", + "address": 48 + }, + { + "type": "phwaddr", + "address": 48 + } + ], + "driver": "virtio_net", + "driver_module": "virtio_net", + "drivers": [ + "virtio_net" + ], + "driver_modules": [ + "virtio_net" + ] + }, + { + "index": 30, + "attached_to": 0, + "class_list": [ + "network_interface" + ], + "base_class": { + "hex": "0107", + "name": "Network Interface", + "value": 263 + }, + "sub_class": { + "hex": "0000", + "name": "Loopback", + "value": 0 + }, + "model": "Loopback network interface", + "sysfs_id": "/class/net/lo", + "unix_device_name": "lo", + "unix_device_names": [ + "lo" + ] + } + ], + "pci": [ + { + "index": 16, + "attached_to": 0, + "class_list": [ + "pci", + "unknown" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 18 + }, + "base_class": { + "hex": "0002", + "name": "Network controller", + "value": 2 + }, + "sub_class": { + "hex": "0000", + "name": "Ethernet controller", + "value": 0 + }, + "vendor": { + "hex": "1af4", + "value": 6900 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "1000", + "value": 4096 + }, + "sub_device": { + "hex": "0001", + "value": 1 + }, + "model": "Ethernet controller", + "sysfs_id": "/devices/pci0000:00/0000:00:12.0", + "sysfs_bus_id": "0000:00:12.0", + "resources": [ + { + "type": "io", + "base": 57504, + "range": 32, + "enabled": true, + "access": "read_write" + }, + { + "type": "irq", + "base": 11, + "triggered": 0, + "enabled": true + }, + { + "type": "mem", + "base": 4271898624, + "range": 262144, + "enabled": false, + "access": "read_only", + "prefetch": "no" + }, + { + "type": "mem", + "base": 4272234496, + "range": 4096, + "enabled": true, + "access": "read_write", + "prefetch": "no" + }, + { + "type": "mem", + "base": 61675730403328, + "range": 16384, + "enabled": true, + "access": "read_only", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 1287, + "header_type": 0, + "secondary_bus": 0, + "irq": 11, + "prog_if": 0 + }, + "driver": "virtio-pci", + "driver_module": "virtio_pci", + "drivers": [ + "virtio-pci" + ], + "driver_modules": [ + "virtio_pci" + ], + "module_alias": "pci:v00001AF4d00001000sv00001AF4sd00000001bc02sc00i00" + }, + { + "index": 17, + "attached_to": 0, + "class_list": [ + "pci", + "unknown" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 3 + }, + "base_class": { + "hex": "0000", + "name": "Unclassified device", + "value": 0 + }, + "sub_class": { + "hex": "00ff", + "value": 255 + }, + "vendor": { + "hex": "1af4", + "value": 6900 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "1002", + "value": 4098 + }, + "sub_device": { + "hex": "0005", + "value": 5 + }, + "model": "Unclassified device", + "sysfs_id": "/devices/pci0000:00/0000:00:03.0", + "sysfs_bus_id": "0000:00:03.0", + "resources": [ + { + "type": "io", + "base": 57344, + "range": 64, + "enabled": true, + "access": "read_write" + }, + { + "type": "irq", + "base": 10, + "triggered": 0, + "enabled": true + }, + { + "type": "mem", + "base": 61675730370560, + "range": 16384, + "enabled": true, + "access": "read_only", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 263, + "header_type": 0, + "secondary_bus": 0, + "irq": 10, + "prog_if": 0 + }, + "driver": "virtio-pci", + "driver_module": "virtio_pci", + "drivers": [ + "virtio-pci" + ], + "driver_modules": [ + "virtio_pci" + ], + "module_alias": "pci:v00001AF4d00001002sv00001AF4sd00000005bc00scFFi00" + } + ], + "storage_controller": [ + { + "index": 18, + "attached_to": 0, + "class_list": [ + "storage_controller", + "pci" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 1 + }, + "base_class": { + "hex": "0001", + "name": "Mass storage controller", + "value": 1 + }, + "sub_class": { + "hex": "0001", + "name": "IDE interface", + "value": 1 + }, + "pci_interface": { + "hex": "0080", + "value": 128 + }, + "vendor": { + "hex": "8086", + "name": "Intel Corporation", + "value": 32902 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "7010", + "value": 28688 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "model": "Intel IDE interface", + "sysfs_id": "/devices/pci0000:00/0000:00:01.1", + "sysfs_bus_id": "0000:00:01.1", + "resources": [ + { + "type": "io", + "base": 1014, + "range": 1, + "enabled": true, + "access": "read_write" + }, + { + "type": "io", + "base": 368, + "range": 8, + "enabled": true, + "access": "read_write" + }, + { + "type": "io", + "base": 496, + "range": 8, + "enabled": true, + "access": "read_write" + }, + { + "type": "io", + "base": 57536, + "range": 16, + "enabled": true, + "access": "read_write" + }, + { + "type": "io", + "base": 886, + "range": 1, + "enabled": true, + "access": "read_write" + } + ], + "detail": { + "function": 1, + "command": 263, + "header_type": 0, + "secondary_bus": 0, + "irq": 0, + "prog_if": 128 + }, + "driver": "ata_piix", + "driver_module": "ata_piix", + "drivers": [ + "ata_piix" + ], + "driver_modules": [ + "ata_piix" + ], + "module_alias": "pci:v00008086d00007010sv00001AF4sd00001100bc01sc01i80" + }, + { + "index": 20, + "attached_to": 0, + "class_list": [ + "storage_controller", + "pci" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 5 + }, + "base_class": { + "hex": "0001", + "name": "Mass storage controller", + "value": 1 + }, + "sub_class": { + "hex": "0000", + "name": "SCSI storage controller", + "value": 0 + }, + "vendor": { + "hex": "1af4", + "value": 6900 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "1004", + "value": 4100 + }, + "sub_device": { + "hex": "0008", + "value": 8 + }, + "model": "SCSI storage controller", + "sysfs_id": "/devices/pci0000:00/0000:00:05.0", + "sysfs_bus_id": "0000:00:05.0", + "resources": [ + { + "type": "io", + "base": 57408, + "range": 64, + "enabled": true, + "access": "read_write" + }, + { + "type": "irq", + "base": 10, + "triggered": 0, + "enabled": true + }, + { + "type": "mem", + "base": 4272230400, + "range": 4096, + "enabled": true, + "access": "read_write", + "prefetch": "no" + }, + { + "type": "mem", + "base": 61675730386944, + "range": 16384, + "enabled": true, + "access": "read_only", + "prefetch": "no" + } + ], + "detail": { + "function": 0, + "command": 1287, + "header_type": 0, + "secondary_bus": 0, + "irq": 10, + "prog_if": 0 + }, + "driver": "virtio-pci", + "driver_module": "virtio_pci", + "drivers": [ + "virtio-pci" + ], + "driver_modules": [ + "virtio_pci" + ], + "module_alias": "pci:v00001AF4d00001004sv00001AF4sd00000008bc01sc00i00" + } + ], + "system": { + "form_factor": "desktop" + }, + "unknown": [ + { + "index": 21, + "attached_to": 20, + "class_list": [ + "unknown" + ], + "base_class": { + "hex": "0000", + "name": "Unclassified device", + "value": 0 + }, + "sub_class": { + "hex": "0000", + "name": "Unclassified device", + "value": 0 + }, + "vendor": "Virtio", + "device": "", + "model": "Virtio Unclassified device", + "sysfs_id": "/devices/pci0000:00/0000:00:05.0/virtio1", + "sysfs_bus_id": "virtio1", + "driver": "virtio_scsi", + "driver_module": "virtio_scsi", + "drivers": [ + "virtio_scsi" + ], + "driver_modules": [ + "virtio_scsi" + ], + "module_alias": "virtio:d00000008v00001AF4" + }, + { + "index": 23, + "attached_to": 17, + "class_list": [ + "unknown" + ], + "base_class": { + "hex": "0000", + "name": "Unclassified device", + "value": 0 + }, + "sub_class": { + "hex": "0000", + "name": "Unclassified device", + "value": 0 + }, + "vendor": "Virtio", + "device": "", + "model": "Virtio Unclassified device", + "sysfs_id": "/devices/pci0000:00/0000:00:03.0/virtio0", + "sysfs_bus_id": "virtio0", + "driver": "virtio_balloon", + "driver_module": "virtio_balloon", + "drivers": [ + "virtio_balloon" + ], + "driver_modules": [ + "virtio_balloon" + ], + "module_alias": "virtio:d00000005v00001AF4" + }, + { + "index": 25, + "attached_to": 0, + "class_list": [ + "unknown" + ], + "base_class": { + "hex": "0007", + "name": "Communication controller", + "value": 7 + }, + "sub_class": { + "hex": "0000", + "name": "Serial controller", + "value": 0 + }, + "pci_interface": { + "hex": "0002", + "name": "16550", + "value": 2 + }, + "device": { + "hex": "0000", + "name": "16550A", + "value": 0 + }, + "model": "16550A", + "unix_device_name": "/dev/ttyS0", + "unix_device_names": [ + "/dev/ttyS0" + ], + "resources": [ + { + "type": "io", + "base": 1016, + "range": 0, + "enabled": true, + "access": "read_write" + }, + { + "type": "irq", + "base": 4, + "triggered": 0, + "enabled": true + } + ] + } + ], + "usb_controller": [ + { + "index": 10, + "attached_to": 0, + "class_list": [ + "usb_controller", + "pci" + ], + "bus_type": { + "hex": "0004", + "name": "PCI", + "value": 4 + }, + "slot": { + "bus": 0, + "number": 1 + }, + "base_class": { + "hex": "000c", + "name": "Serial bus controller", + "value": 12 + }, + "sub_class": { + "hex": "0003", + "name": "USB Controller", + "value": 3 + }, + "pci_interface": { + "hex": "0000", + "name": "UHCI", + "value": 0 + }, + "vendor": { + "hex": "8086", + "name": "Intel Corporation", + "value": 32902 + }, + "sub_vendor": { + "hex": "1af4", + "value": 6900 + }, + "device": { + "hex": "7020", + "value": 28704 + }, + "sub_device": { + "hex": "1100", + "value": 4352 + }, + "revision": { + "hex": "0001", + "value": 1 + }, + "model": "Intel USB Controller", + "sysfs_id": "/devices/pci0000:00/0000:00:01.2", + "sysfs_bus_id": "0000:00:01.2", + "resources": [ + { + "type": "io", + "base": 57472, + "range": 32, + "enabled": true, + "access": "read_write" + }, + { + "type": "irq", + "base": 11, + "triggered": 0, + "enabled": true + } + ], + "detail": { + "function": 2, + "command": 263, + "header_type": 0, + "secondary_bus": 0, + "irq": 11, + "prog_if": 0 + }, + "driver": "uhci_hcd", + "driver_module": "uhci_hcd", + "drivers": [ + "uhci_hcd" + ], + "driver_modules": [ + "uhci_hcd" + ], + "driver_info": { + "type": "module", + "db_entry_0": [ + "uhci-hcd" + ], + "active": true, + "modprobe": true, + "names": [ + "uhci-hcd" + ], + "module_args": [ + "" + ], + "conf": "" + }, + "module_alias": "pci:v00008086d00007020sv00001AF4sd00001100bc0Csc03i00" + } + ] + }, + "smbios": { + "bios": { + "handle": 0, + "vendor": "SeaBIOS", + "version": "rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org", + "date": "04/01/2014", + "features": null, + "start_address": "0xe8000", + "rom_size": 65536 + }, + "chassis": [ + { + "handle": 768, + "manufacturer": "QEMU", + "version": "pc-i440fx-9.0", + "chassis_type": { + "hex": "0001", + "name": "Other", + "value": 1 + }, + "lock_present": false, + "bootup_state": { + "hex": "0003", + "name": "Safe", + "value": 3 + }, + "power_state": { + "hex": "0003", + "name": "Safe", + "value": 3 + }, + "thermal_state": { + "hex": "0003", + "name": "Safe", + "value": 3 + }, + "security_state": { + "hex": "0002", + "name": "Unknown", + "value": 2 + }, + "oem": "0x0" + } + ], + "memory_array": [ + { + "handle": 4096, + "location": { + "hex": "0001", + "name": "Other", + "value": 1 + }, + "usage": { + "hex": "0003", + "name": "System memory", + "value": 3 + }, + "ecc": { + "hex": "0006", + "name": "Multi-bit", + "value": 6 + }, + "max_size": "0xc00000", + "error_handle": 65534, + "slots": 1 + } + ], + "memory_array_mapped_address": [ + { + "handle": 4864, + "array_handle": 4096, + "start_address": "0x0", + "end_address": "0xc0000000", + "part_width": 1 + }, + { + "handle": 4865, + "array_handle": 4096, + "start_address": "0x100000000", + "end_address": "0x340000000", + "part_width": 1 + } + ], + "memory_device": [ + { + "handle": 4352, + "location": "DIMM 0", + "bank_location": "", + "manufacturer": "QEMU", + "part_number": "", + "array_handle": 4096, + "error_handle": 65534, + "width": 0, + "ecc_bits": 0, + "size": 12582912, + "form_factor": { + "hex": "0009", + "name": "DIMM", + "value": 9 + }, + "set": 0, + "memory_type": { + "hex": "0007", + "name": "RAM", + "value": 7 + }, + "memory_type_details": [ + "Other" + ], + "speed": 0 + } + ], + "processor": [ + { + "handle": 1024, + "socket": "CPU 0", + "socket_type": { + "hex": "0001", + "name": "Other", + "value": 1 + }, + "socket_populated": true, + "manufacturer": "QEMU", + "version": "pc-i440fx-9.0", + "part": "", + "processor_type": { + "hex": "0003", + "name": "CPU", + "value": 3 + }, + "processor_family": { + "hex": "00fe", + "name": "Other", + "value": 254 + }, + "processor_status": { + "hex": "0001", + "name": "Enabled", + "value": 1 + }, + "clock_ext": 0, + "clock_max": 2000, + "cache_handle_l1": 0, + "cache_handle_l2": 0, + "cache_handle_l3": 0 + } + ], + "system": { + "handle": 256, + "manufacturer": "QEMU", + "product": "Standard PC (i440FX + PIIX, 1996)", + "version": "pc-i440fx-9.0", + "wake_up": { + "hex": "0006", + "name": "Power Switch", + "value": 6 + } + } + } +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b3575ae --- /dev/null +++ b/flake.lock @@ -0,0 +1,614 @@ +{ + "nodes": { + "den": { + "locked": { + "lastModified": 1772159674, + "narHash": "sha256-VvxXwezDpZoOY0O0pu72n1tTChnkAdjRsM72FlphL+w=", + "owner": "vic", + "repo": "den", + "rev": "311d77a3afee7c0f3cd3d4f494b5129b17c12aa2", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "den", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1771881364, + "narHash": "sha256-A5uE/hMium5of/QGC6JwF5TGoDAfpNtW00T0s9u/PN8=", + "owner": "nix-community", + "repo": "disko", + "rev": "a4cb7bf73f264d40560ba527f9280469f1f081c6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "flake-aspects": { + "locked": { + "lastModified": 1772159060, + "narHash": "sha256-enmt9g1FJGIBVzPcLa208nLP9QTUbRrJUXWT40GTQho=", + "owner": "vic", + "repo": "flake-aspects", + "rev": "88bac0fd89f3d9ce8f157debc57875ca470535e8", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "flake-aspects", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1751685974, + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", + "ref": "refs/heads/main", + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", + "revCount": 92, + "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-file": { + "locked": { + "lastModified": 1772176329, + "narHash": "sha256-8MmT7QcVsRPlaJOSnJobqyDf3E/0q3kcgs6CJ6NkBw0=", + "owner": "vic", + "repo": "flake-file", + "rev": "1bf87eeb57ea517d4a6a96b4529f4f5d78a49e84", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "flake-file", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixpkgs-lib" + ] + }, + "locked": { + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1772164835, + "narHash": "sha256-zRcwrZDeBfYipqv/7K7TqsfPb87LFU6b7JhoNUGSnvQ=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "2a39b0828bbffce0d73769a61e46e780488d098b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "import-tree": { + "locked": { + "lastModified": 1772159371, + "narHash": "sha256-AkfVgWWxt1pa1SlfKzcL1oQpMzgP70U3fBtzXqEGOms=", + "owner": "vic", + "repo": "import-tree", + "rev": "78c35e32f2b499c25e0671e41662537a6b1edbf0", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "import-tree", + "type": "github" + } + }, + "mnw": { + "locked": { + "lastModified": 1770419553, + "narHash": "sha256-b1XqsH7AtVf2dXmq2iyRr2NC1yG7skY7Z6N2MpWHlK4=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "2aaffa8030d0b262176146adbb6b0e6374ce2957", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, + "ndg": { + "inputs": { + "nixpkgs": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1768214250, + "narHash": "sha256-hnBZDQWUxJV3KbtvyGW5BKLO/fAwydrxm5WHCWMQTbw=", + "owner": "feel-co", + "repo": "ndg", + "rev": "a6bd3c1ce2668d096e4fdaaa03ad7f03ba1fbca8", + "type": "github" + }, + "original": { + "owner": "feel-co", + "ref": "refs/tags/v2.6.0", + "repo": "ndg", + "type": "github" + } + }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": "nixpkgs_3", + "nixpkgs-stable": "nixpkgs-stable", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1772180467, + "narHash": "sha256-n6nZTXJRnpM4ST+poeynOasYm+XOASxHWXT/kLWI/lg=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "68dcbb4f04e6fd8e7072cee1b30dba669d1c47ca", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1756556321, + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.08", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1771849386, + "narHash": "sha256-CFvjBjS2LxbBMR3Lu6wZhME6ck3CXyKUufRoJA5tlmw=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "2dc6f4482c4eeed75ea8b133d89cad8658d38429", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, + "nix-auto-follow": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1754073254, + "narHash": "sha256-CQp/v2HQ7AtGJQqFGRZLHt4MZAK3NF94I6GDaRyhbsc=", + "owner": "fzakaria", + "repo": "nix-auto-follow", + "rev": "5baa00b79d4cc46523da0b8b3532c5163d151be4", + "type": "github" + }, + "original": { + "owner": "fzakaria", + "repo": "nix-auto-follow", + "type": "github" + } + }, + "nix-wrapper-modules": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1771743990, + "narHash": "sha256-KNTuqLytdRE0MVhM1hd3IJTlcOG6In/6klbiEDWYOaA=", + "owner": "BirdeeHub", + "repo": "nix-wrapper-modules", + "rev": "0ea455457dac3de9129498f5c50a35153ab56484", + "type": "github" + }, + "original": { + "owner": "BirdeeHub", + "repo": "nix-wrapper-modules", + "type": "github" + } + }, + "nixos-hardware": { + "locked": { + "lastModified": 1771969195, + "narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=", + "owner": "NixOS", + "repo": "nixos-hardware", + "rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1771207753, + "narHash": "sha256-b9uG8yN50DRQ6A7JdZBfzq718ryYrlmGgqkRm9OOwCE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d1c15b7d5806069da59e819999d70e1cec0760bf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1772047000, + "narHash": "sha256-7DaQVv4R97cii/Qdfy4tmDZMB2xxtyIvNGSwXBBhSmo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1267bb4920d0fc06ea916734c11b0bf004bbe17e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1770841267, + "narHash": "sha256-9xejG0KoqsoKEGp2kVbXRlEYtFFcDTHjidiuX8hGO44=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ec7c70d12ce2fc37cb92aff673dcdca89d187bae", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1771848320, + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1771207753, + "narHash": "sha256-b9uG8yN50DRQ6A7JdZBfzq718ryYrlmGgqkRm9OOwCE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d1c15b7d5806069da59e819999d70e1cec0760bf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1772082373, + "narHash": "sha256-OgUF+EoJ36hz3jo8qBuizb8suT0mu1n7mzmcGdeOjWE=", + "rev": "26eaeac4e409d7b5a6bf6f90a2a2dc223c78d915", + "type": "tarball", + "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre954674.26eaeac4e409/nixexprs.tar.xz" + }, + "original": { + "type": "tarball", + "url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1767767207, + "narHash": "sha256-Mj3d3PfwltLmukFal5i3fFt27L6NiKXdBezC1EBuZs4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5912c1772a44e31bf1c63c0390b90501e5026886", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1771008912, + "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a82ccc39b39b621151d6732718e3e250109076fa", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1771207753, + "narHash": "sha256-b9uG8yN50DRQ6A7JdZBfzq718ryYrlmGgqkRm9OOwCE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d1c15b7d5806069da59e819999d70e1cec0760bf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "noctalia": { + "inputs": { + "nixpkgs": "nixpkgs_6", + "noctalia-qs": "noctalia-qs" + }, + "locked": { + "lastModified": 1772163795, + "narHash": "sha256-1Y5IrQIJ3MKY+yd5FeZejnko1wEKpTaF2r5qt6Sn1HU=", + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "rev": "72cc11f98c7ccb75fe542a0034176de3710f1590", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "type": "github" + } + }, + "noctalia-qs": { + "inputs": { + "nixpkgs": [ + "noctalia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771796397, + "narHash": "sha256-lbZkAMNQl5Ymqhdvp46K8hubZ7n7KQRPnTP5bNJzMSk=", + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "rev": "1711c5a20b74a31b703394164c5d2d9561f13ee9", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "type": "github" + } + }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat", + "flake-parts": "flake-parts_2", + "mnw": "mnw", + "ndg": "ndg", + "nixpkgs": "nixpkgs_7", + "systems": "systems" + }, + "locked": { + "lastModified": 1772136464, + "narHash": "sha256-tkD/hT8goPEP4Jh03DzE7eqRqm74OzAjkRkbLKH4nM0=", + "owner": "notashelf", + "repo": "nvf", + "rev": "ace53a0ceea8bd5eb7325f63389ea4f28525db0c", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, + "root": { + "inputs": { + "den": "den", + "disko": "disko", + "flake-aspects": "flake-aspects", + "flake-file": "flake-file", + "flake-parts": "flake-parts", + "home-manager": "home-manager", + "import-tree": "import-tree", + "niri": "niri", + "nix-auto-follow": "nix-auto-follow", + "nix-wrapper-modules": "nix-wrapper-modules", + "nixos-hardware": "nixos-hardware", + "nixpkgs": "nixpkgs_5", + "nixpkgs-lib": [ + "nixpkgs" + ], + "noctalia": "noctalia", + "nvf": "nvf", + "sops-nix": "sops-nix", + "systems": "systems_2" + } + }, + "sops-nix": { + "inputs": { + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1772048434, + "narHash": "sha256-/wA0OaH6kZ/pFA+nXR/tvg5oupOmEDmMS5us79JT60o=", + "owner": "Mic92", + "repo": "sops-nix", + "rev": "334daa7c273dd8bf7a0cd370e4e16022b64e55e9", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "sops-nix", + "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" + } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1755491097, + "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "388d291e82ffbc73be18169d39470f340707edaa", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.7", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1771787042, + "narHash": "sha256-7bM6Y4KldhKnfopSALF8XALxcX7ehkomXH9sPl4MXp0=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "33c344fee50504089a447a8fef5878cf4f6215fc", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8c9c5b2 --- /dev/null +++ b/flake.nix @@ -0,0 +1,33 @@ +# DO-NOT-EDIT. This file was auto-generated using github:vic/flake-file. +# Use `nix run .#write-flake` to regenerate it. +{ + + outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } (inputs.import-tree ./modules); + + inputs = { + den.url = "github:vic/den"; + disko.url = "github:nix-community/disko"; + flake-aspects.url = "github:vic/flake-aspects"; + flake-file.url = "github:vic/flake-file"; + flake-parts = { + inputs.nixpkgs-lib.follows = "nixpkgs-lib"; + url = "github:hercules-ci/flake-parts"; + }; + home-manager.url = "github:nix-community/home-manager"; + import-tree.url = "github:vic/import-tree"; + niri.url = "github:sodiboo/niri-flake"; + nix-auto-follow = { + inputs.nixpkgs.follows = "nixpkgs"; + url = "github:fzakaria/nix-auto-follow"; + }; + nix-wrapper-modules.url = "github:BirdeeHub/nix-wrapper-modules"; + nixos-hardware.url = "github:NixOS/nixos-hardware/master"; + nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz"; + nixpkgs-lib.follows = "nixpkgs"; + noctalia.url = "github:noctalia-dev/noctalia-shell"; + nvf.url = "github:notashelf/nvf"; + sops-nix.url = "github:Mic92/sops-nix"; + systems.url = "github:nix-systems/default"; + }; + +} diff --git a/modules/bitwarden.nix b/modules/bitwarden.nix new file mode 100644 index 0000000..12c2175 --- /dev/null +++ b/modules/bitwarden.nix @@ -0,0 +1,18 @@ +{ pkgs, config, ... }: +{ + lux.bitwarden = { + homeManager = + { pkgs, ... }: + { + home.packages = [ pkgs.bitwarden-desktop ]; + programs.rbw = { + enable = true; + settings = { + base_url = "https://vault.jelles.net"; + email = "mail@jelles.net"; + pinentry = pkgs.pinentry-qt; + }; + }; + }; + }; +} diff --git a/modules/defaults.nix b/modules/defaults.nix new file mode 100644 index 0000000..1cfb946 --- /dev/null +++ b/modules/defaults.nix @@ -0,0 +1,12 @@ +{ den, ... }: +{ + den.default.includes = [ + den._.define-user + den._.home-manager + ]; + + den.default.nixos = { + users.mutableUsers = false; + home-manager.useGlobalPkgs = true; + }; +} diff --git a/modules/dendritic.nix b/modules/dendritic.nix new file mode 100644 index 0000000..90b4510 --- /dev/null +++ b/modules/dendritic.nix @@ -0,0 +1,15 @@ +{ inputs, ... }: +{ + imports = [ + (inputs.flake-file.flakeModules.dendritic or { }) + (inputs.den.flakeModules.dendritic or { }) + (inputs.den.namespace "lux" true) + ]; + + # other inputs may be defined at a module using them. + flake-file.inputs = { + den.url = "github:vic/den"; + flake-file.url = "github:vic/flake-file"; + home-manager.url = "github:nix-community/home-manager"; + }; +} diff --git a/modules/dev.nix b/modules/dev.nix new file mode 100644 index 0000000..6ca2a78 --- /dev/null +++ b/modules/dev.nix @@ -0,0 +1,21 @@ +{ + lux.dev = { + homeManager = { + programs.git = { + enable = true; + settings = { + # TODO: Don't hardcode name and mail + user.name = "kiri"; + user.email = "mail@jelles.net"; + init.defaultBranch = "main"; + }; + }; + + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; + }; + }; +} diff --git a/modules/email.nix b/modules/email.nix new file mode 100644 index 0000000..dc1c11d --- /dev/null +++ b/modules/email.nix @@ -0,0 +1,114 @@ +{ config, ... }: +{ + lux.email = { + homeManager = + { ... }: + { + programs.thunderbird = { + enable = true; + profiles.kiri = { + isDefault = true; + withExternalGnupg = true; + settings = { + # LAYOUT: Force 3-Pane Vertical View (Folders | List | Message) + "mail.ui.display.message_pane_vertical" = true; + + # APPEARANCE: Enable "Cards View" (modern multi-line list) + # Note: 'cards' is the value for the new view + "mail.ui.display.thread_pane_view_type" = "cards"; + + # DENSITY: "Compact" is usually cleaner for tech-savvy users + "mail.uidensity" = 1; # 0=Default, 1=Compact, 2=Touch + + # PRIVACY & CLEANUP + "privacy.donottrackheader.enabled" = true; + "mail.server.server2.hidden" = true; # Hide "Local Folders" + + # Start page disable for faster boot + "mailnews.start_page.enabled" = false; + + # Disable the "Get a new email address" feature in account manager + "mail.provider.enabled" = false; + + "layout.css.devPixelsPerPx" = 0.85; + }; + }; + }; + + accounts.email.accounts = { + main = { + enable = true; + primary = true; + address = "mail@jelles.net"; + imap = { + authentication = "plain"; + host = "taylor.mxrouting.net"; + port = 993; + tls.enable = true; + }; + realName = "Jelle Spreeuwenberg"; + smtp = { + authentication = "plain"; + host = "taylor.mxrouting.net"; + port = 465; + tls.enable = true; + }; + userName = "mail@jelles.net"; + + thunderbird.enable = true; + }; + + old = { + enable = true; + address = "mail@jellespreeuwenberg.nl"; + imap = { + authentication = "plain"; + host = "taylor.mxrouting.net"; + port = 993; + tls.enable = true; + }; + realName = "Jelle Spreeuwenberg"; + smtp = { + authentication = "plain"; + host = "taylor.mxrouting.net"; + port = 465; + tls.enable = true; + }; + userName = "mail@jellespreeuwenberg.nl"; + + thunderbird.enable = true; + }; + + uni = { + enable = true; + flavor = "outlook.office365.com"; + address = "j.spreeuwenberg@student.tue.nl"; + realName = "Jelle Spreeuwenberg"; + userName = "j.spreeuwenberg@student.tue.nl"; + thunderbird = { + enable = true; + settings = id: { + "mail.smtpserver.smtp_${id}.authMethod" = 10; + "mail.server.server_${id}.authMethod" = 10; + }; + }; + }; + + work = { + enable = true; + flavor = "outlook.office365.com"; + address = "jelle.spreeuwenberg@yookr.org"; + realName = "Jelle Spreeuwenberg"; + userName = "jelle.spreeuwenberg@yookr.org"; + thunderbird = { + enable = true; + settings = id: { + "mail.smtpserver.smtp_${id}.authMethod" = 10; + "mail.server.server_${id}.authMethod" = 10; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/flake-file.nix b/modules/flake-file.nix new file mode 100644 index 0000000..23bedef --- /dev/null +++ b/modules/flake-file.nix @@ -0,0 +1,6 @@ +{ inputs, ... }: +{ + imports = [ + inputs.flake-file.flakeModules.nix-auto-follow + ]; +} diff --git a/modules/helium.nix b/modules/helium.nix new file mode 100644 index 0000000..f51e5c1 --- /dev/null +++ b/modules/helium.nix @@ -0,0 +1,12 @@ +{ ... }: +{ + lux.helium = { + homeManager = + { pkgs, ... }: + { + home.packages = [ + (pkgs.callPackage ../programs/helium.nix { }) + ]; + }; + }; +} diff --git a/modules/hosts.nix b/modules/hosts.nix new file mode 100644 index 0000000..977c12e --- /dev/null +++ b/modules/hosts.nix @@ -0,0 +1,29 @@ +{ den, ... }: +{ + den.hosts.x86_64-linux = { + polaris.users.kiri = { + syncthingId = "6HBAKXB-DB3B4H2-BODCAXF-KD23H5W-6X5LGLC-ZJHZHLG-7U7YMGO-BB6IXQ3"; + }; + orion.users.kiri = { + syncthingId = "NNRNQKZ-OWPHSVA-B6KKBHE-SDYLSTV-7SVHGPR-NEWLKPL-4MWNJG4-G5FHUAI"; + }; + altair.users.kiri = { + syncthingId = ""; + }; + }; + + # Set hostname for each host + den.default.includes = + let + setHostname = + { host, ... }: + { + nixos = { + networking.hostName = host.hostName; + }; + }; + in + [ + setHostname + ]; +} diff --git a/modules/keys.nix b/modules/keys.nix new file mode 100644 index 0000000..0475de5 --- /dev/null +++ b/modules/keys.nix @@ -0,0 +1,32 @@ +{ ... }: +{ + lux.ssh = { + homeManager = + { config, pkgs, ... }: + { + programs.gpg = { + enable = true; + homedir = "${config.xdg.dataHome}/gnupg"; + }; + + services.gpg-agent = { + enable = true; + enableSshSupport = true; + enableZshIntegration = true; + pinentry.package = pkgs.pinentry-qt; + sshKeys = [ + "CD848796822630B280FC6DFA55F24A20040F22B5" + "B8FBDFBD7F42C444C17E086E0EE2E34FB43A7187" + ]; + }; + + programs.ssh = { + enable = true; + enableDefaultConfig = false; + includes = [ + "/home/kiri/.ssh/ssh-config-orion" + ]; + }; + }; + }; +} diff --git a/modules/kiri.nix b/modules/kiri.nix new file mode 100644 index 0000000..ba641ec --- /dev/null +++ b/modules/kiri.nix @@ -0,0 +1,16 @@ +{ den, ... }: +{ + den.aspects.kiri = { + includes = [ + den._.primary-user + (den._.user-shell "zsh") + den.ful.lux.syncthing + ]; + + nixos = + { config, ... }: + { + users.users.kiri.hashedPasswordFile = config.sops.secrets.hashed-password-kiri.path; + }; + }; +} diff --git a/modules/neovim/default.nix b/modules/neovim/default.nix new file mode 100644 index 0000000..5936fbb --- /dev/null +++ b/modules/neovim/default.nix @@ -0,0 +1,180 @@ +{ inputs, ... }: +{ + flake-file.inputs.nix-wrapper-modules.url = "github:BirdeeHub/nix-wrapper-modules"; + lux.neovim.homeManager = + { + pkgs, + lib, + config, + ... + }: + { + + imports = [ + (inputs.nix-wrapper-modules.lib.mkInstallModule { + name = "neovim"; + value = inputs.nix-wrapper-modules.lib.wrapperModules.neovim; + loc = [ + "home" + "packages" + ]; + }) + ]; + + wrappers.neovim = { + enable = true; + + # 1. Point to your existing Lua config directory + settings.config_directory = ./lua-config; + + # 2. Runtime Dependencies (from lspsAndRuntimeDeps) + # These are added to the PATH of the wrapper + extraPackages = with pkgs; [ + # Tools + universal-ctags + ripgrep + fd + tree-sitter + wl-clipboard + # LSPs & Formatters + stylua + lua-language-server + nixd + nix-doc + nixfmt + dafny + typescript + typescript-language-server + rustc + rust-analyzer + rustfmt + markdownlint-cli2 + astro-language-server + tinymist + typstyle + + # ty + # basedpyright + ty + ruff + ]; + + # 3. Plugins (from startupPlugins & optionalPlugins) + # Since you use lz.n in Lua, we just list them all here. + # The wrapper will add them to the packpath. + specs = { + # Core lazy-loading plugin + lz-n = { + data = pkgs.vimPlugins.lz-n; + }; + plenary = { + data = pkgs.vimPlugins.plenary-nvim; + }; + + # All other plugins + general = { + data = with pkgs.vimPlugins; [ + nvim-treesitter.withAllGrammars + nvim-treesitter-textobjects + nvim-treesitter-context + trouble-nvim + guess-indent-nvim + gitsigns-nvim + which-key-nvim + telescope-nvim + telescope-fzf-native-nvim + telescope-ui-select-nvim + conform-nvim + blink-cmp + luasnip + friendly-snippets + todo-comments-nvim + mini-nvim + nvim-lspconfig + lazydev-nvim + nvim-autopairs + indent-blankline-nvim + nvim-lint + render-markdown-nvim + colorful-menu-nvim + lualine-nvim + bufferline-nvim + zen-mode-nvim + kanagawa-nvim + project-nvim + ]; + }; + }; + + # 4. Passing Data to Lua (Replacing nixCats.extra) + # We put these in `settings` so they appear in require('nix-info').settings + settings = { + # Hostname/ConfigDir needed for nixd + # NOTE: Adjust these paths to match your actual denful/flake variables + nixdExtras = { + nixpkgs = "import ${pkgs.path} {}"; + # Assuming you have access to the flake path in your config, + # otherwise hardcode or pass via specialArgs + nixos_options = ''(builtins.getFlake "path://${config.home.homeDirectory}/.config/nixos").nixosConfigurations.polaris.config.networking.hostName}.options''; + home_manager_options = ''(builtins.getFlake "path://${config.home.homeDirectory}/.config/nixos").nixosConfigurations.polaris.config.networking.hostName}.options.home-manager.users.type.getSubOptions []''; + }; + + # TODO: Put in separate theme file + themeSetup = # lua + '' + 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") + ''; + + }; + + # 5. Wrapper Configuration + # Enable Python/Node providers + hosts.python3.nvim-host.enable = true; + hosts.node.nvim-host.enable = true; + + # Ensure the bin name matches what you expect + binName = "nvim"; + }; + }; +} diff --git a/modules/neovim/lua-config/init.lua b/modules/neovim/lua-config/init.lua new file mode 100644 index 0000000..5d2a5fe --- /dev/null +++ b/modules/neovim/lua-config/init.lua @@ -0,0 +1,5 @@ +require("options") +require("plugins.ui") +require("plugins.editor") +require("plugins.coding") +require("plugins.lsp") diff --git a/modules/neovim/lua-config/lua/options.lua b/modules/neovim/lua-config/lua/options.lua new file mode 100644 index 0000000..619dc96 --- /dev/null +++ b/modules/neovim/lua-config/lua/options.lua @@ -0,0 +1,138 @@ +-- Set as the leader key +-- See `:help mapleader` +-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +-- [[ Setting options ]] +-- See `:help vim.o` +-- NOTE: You can change these options as you wish! +-- For more options, you can see `:help option-list` + +vim.o.expandtab = true +vim.o.shiftwidth = 2 +vim.o.tabstop = 2 +vim.o.softtabstop = 2 + +-- Make line numbers default +vim.o.number = true +-- You can also add relative line numbers, to help with jumping. +-- Experiment for yourself to see if you like it! +-- vim.o.relativenumber = true + +-- Enable mouse mode, can be useful for resizing splits for example! +vim.o.mouse = "a" + +-- Don't show the mode, since it's already in the status line +vim.o.showmode = false + +vim.opt.shortmess:append("Wc") + +-- Sync clipboard between OS and Neovim. +-- Schedule the setting after `UiEnter` because it can increase startup-time. +-- Remove this option if you want your OS clipboard to remain independent. +-- See `:help 'clipboard'` +vim.schedule(function() + vim.o.clipboard = "unnamedplus" +end) + +-- Enable break indent +vim.o.breakindent = true + +-- Save undo history +vim.o.undofile = true + +-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term +vim.o.ignorecase = true +vim.o.smartcase = true + +-- Keep signcolumn on by default +vim.o.signcolumn = "yes" + +-- Decrease update time +vim.o.updatetime = 250 + +-- Decrease mapped sequence wait time +vim.o.timeoutlen = 300 + +-- Configure how new splits should be opened +vim.o.splitright = true +vim.o.splitbelow = true + +-- Sets how neovim will display certain whitespace characters in the editor. +-- See `:help 'list'` +-- and `:help 'listchars'` +-- +-- Notice listchars is set using `vim.opt` instead of `vim.o`. +-- It is very similar to `vim.o` but offers an interface for conveniently interacting with tables. +-- See `:help lua-options` +-- and `:help lua-options-guide` +vim.o.list = true +vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "␣" } + +-- Preview substitutions live, as you type! +vim.o.inccommand = "split" + +-- Show which line your cursor is on +vim.o.cursorline = true + +-- Minimal number of screen lines to keep above and below the cursor. +vim.o.scrolloff = 10 + +-- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), +-- instead raise a dialog asking if you wish to save the current file(s) +-- See `:help 'confirm'` +vim.o.confirm = true + +-- [[ Basic Keymaps ]] +-- See `:help vim.keymap.set()` + +-- Clear highlights on search when pressing in normal mode +-- See `:help hlsearch` +vim.keymap.set("n", "", "nohlsearch") + +-- Diagnostic keymaps +vim.keymap.set("n", "q", vim.diagnostic.setloclist, { desc = "Open diagnostic [Q]uickfix list" }) + +-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier +-- for people to discover. Otherwise, you normally need to press , which +-- is not what someone will guess without a bit more experience. +-- +-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping +-- or just use to exit terminal mode +vim.keymap.set("t", "", "", { desc = "Exit terminal mode" }) + +-- TIP: Disable arrow keys in normal mode +-- vim.keymap.set('n', '', 'echo "Use h to move!!"') +-- vim.keymap.set('n', '', 'echo "Use l to move!!"') +-- vim.keymap.set('n', '', 'echo "Use k to move!!"') +-- vim.keymap.set('n', '', 'echo "Use j to move!!"') + +-- Keybinds to make split navigation easier. +-- Use CTRL+ to switch between windows +-- +-- See `:help wincmd` for a list of all window commands +vim.keymap.set("n", "", "", { desc = "Move focus to the left window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the right window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the lower window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the upper window" }) + +-- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes +-- vim.keymap.set("n", "", "H", { desc = "Move window to the left" }) +-- vim.keymap.set("n", "", "L", { desc = "Move window to the right" }) +-- vim.keymap.set("n", "", "J", { desc = "Move window to the lower" }) +-- vim.keymap.set("n", "", "K", { desc = "Move window to the upper" }) + +-- [[ Basic Autocommands ]] +-- See `:help lua-guide-autocommands` + +-- Highlight when yanking (copying) text +-- Try it with `yap` in normal mode +-- See `:help vim.hl.on_yank()` +vim.api.nvim_create_autocmd("TextYankPost", { + desc = "Highlight when yanking (copying) text", + group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), + callback = function() + vim.hl.on_yank() + end, +}) diff --git a/modules/neovim/lua-config/lua/plugins/coding.lua b/modules/neovim/lua-config/lua/plugins/coding.lua new file mode 100644 index 0000000..e599b71 --- /dev/null +++ b/modules/neovim/lua-config/lua/plugins/coding.lua @@ -0,0 +1,230 @@ +require("lz.n").load({ + -- { + -- "nvim-treesitter-context", + -- event = "BufReadPost", + -- after = function() + -- require("treesitter-context").setup({ + -- enable = true, + -- max_lines = 3, -- How many lines the window should span + -- }) + -- end, + -- }, + { + "nvim-lint", + event = { "BufReadPre", "BufNewFile" }, + after = function() + local lint = require("lint") + lint.linters_by_ft = { + markdown = { "markdownlint-cli2" }, + } + + -- Create autocommand which carries out the actual linting + -- on the specified events. + local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) + vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, { + group = lint_augroup, + callback = function() + -- Only run the linter in buffers that you can modify in order to + -- avoid superfluous noise, notably within the handy LSP pop-ups that + -- describe the hovered symbol using Markdown. + if vim.bo.modifiable then + lint.try_lint() + end + end, + }) + end, + }, + { + "nvim-autopairs", + event = "InsertEnter", + after = function() + require("nvim-autopairs").setup({ + check_ts = true, + }) + end, + }, + { + "nvim-treesitter", + dep_of = "render-markdown.nvim", + -- cmd = { "" }, + event = "DeferredUIEnter", + -- ft = "", + -- keys = "", + -- colorscheme = "", + load = function(name) + vim.cmd.packadd(name) + end, + after = function() + -- [[ Configure Treesitter ]] + -- See `:help nvim-treesitter` + require("nvim-treesitter.configs").setup({ + highlight = { enable = true }, + indent = { enable = true }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "", + node_incremental = "", + scope_incremental = "", + node_decremental = "", + }, + }, + }) + end, + }, + { + "conform.nvim", + event = "BufWritePre", + cmd = "ConformInfo", + keys = { + { + "f", + function() + require("conform").format({ async = true, lsp_format = "fallback" }) + end, + mode = "", + desc = "[F]ormat buffer", + }, + }, + after = function() + require("conform").setup({ + notify_on_error = true, + format_on_save = function(bufnr) + -- Disable "format_on_save lsp_fallback" for languages that don't + -- have a well standardized coding style. You can add additional + -- languages here or re-enable it for the disabled ones. + local disable_filetypes = { c = true, cpp = true } + if disable_filetypes[vim.bo[bufnr].filetype] then + return nil + else + return { + timeout_ms = 500, + lsp_format = "fallback", + } + end + end, + formatters_by_ft = { + lua = { "stylua" }, + -- Conform can also run multiple formatters sequentially + python = { "isort", "black" }, + -- + -- You can use 'stop_after_first' to run the first available formatter from the list + -- javascript = { "prettierd", "prettier", stop_after_first = true }, + }, + formatters = { + stylua = { + prepend_args = { "--indent-type", "Spaces", "--indent-width", "2" }, + }, + }, + }) + end, + }, + { + "friendly-snippets", + }, + { + "luasnip", + before = function() + require("lz.n").trigger_load("friendly-snippets") + end, + after = function() + 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", "settings" }, path = "nix-info" }, + }, + }) + end, + }, + { + "blink.cmp", + before = function() + -- Trigger lazydev so it's ready for blink source + require("lz.n").trigger_load({ "lazydev.nvim", "luasnip" }) + end, + after = function() + require("blink.cmp").setup({ + keymap = { + preset = "default", + + -- [Up/Down] + [""] = { "select_next", "fallback" }, + [""] = { "select_prev", "fallback" }, -- Overrides Signature Help + + -- [Insert Suggestion] + [""] = { "select_and_accept", "fallback" }, + + -- [Remap Signature Help] + -- Since we took , let's move signature help to (optional) + [""] = { "show_signature", "hide_signature", "fallback" }, + }, + + appearance = { + nerd_font_variant = "mono", + }, + + completion = { + -- By default, you may press `` to show the documentation. + -- Optionally, set `auto_show = true` to show the documentation after a delay. + documentation = { + auto_show = true, + auto_show_delay_ms = 500, + }, + menu = { + draw = { + columns = { { "kind_icon" }, { "label", gap = 1 } }, + components = { + label = { + text = function(ctx) + return require("colorful-menu").blink_components_text(ctx) + end, + highlight = function(ctx) + return require("colorful-menu").blink_components_highlight(ctx) + end, + }, + }, + }, + }, + }, + + cmdline = { + completion = { + menu = { + auto_show = true, + }, + }, + keymap = { preset = "inherit" }, + }, + + sources = { + default = { + "lsp", + "path", + "snippets", + "lazydev", + }, + providers = { + lazydev = { module = "lazydev.integrations.blink", score_offset = 100 }, + }, + }, + + snippets = { preset = "luasnip" }, + + fuzzy = { implementation = "prefer_rust_with_warning" }, + + -- Shows a signature help window while you type arguments for a function + signature = { + enabled = true, + }, + }) + end, + }, +}) diff --git a/modules/neovim/lua-config/lua/plugins/editor.lua b/modules/neovim/lua-config/lua/plugins/editor.lua new file mode 100644 index 0000000..656aee1 --- /dev/null +++ b/modules/neovim/lua-config/lua/plugins/editor.lua @@ -0,0 +1,240 @@ +require("lz.n").load({ + { + "project.nvim", + name = "project-nvim", + event = { "VimEnter" }, -- Load early to set root correctly + after = function() + require("project").setup({ + -- 1. Automagically change directory to project root + manual_mode = false, + + -- Methods to detect the root directory + detection_methods = { "lsp", "pattern" }, + + -- Files/folders that indicate a root + patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", "flake.nix" }, + + -- Show hidden files in telescope + show_hidden = true, + + -- When the project scope changes, change the directory + scope_chdir = "global", + }) + end, + }, + { + "guess-indent.nvim", + event = { "BufReadPre", "BufNewFile" }, + after = function() + require("guess-indent").setup({}) + end, + }, + { + "gitsigns.nvim", + event = { "BufReadPre", "BufNewFile" }, + after = function() + require("gitsigns").setup({ + signs = { + add = { text = "▎" }, + change = { text = "▎" }, + delete = { text = "" }, + topdelete = { text = "" }, + changedelete = { text = "▎" }, + }, + on_attach = function(bufnr) + local gitsigns = require("gitsigns") + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map("n", "]c", function() + if vim.wo.diff then + vim.cmd.normal({ "]c", bang = true }) + else + gitsigns.nav_hunk("next") + end + end, { desc = "Jump to next git [c]hange" }) + + map("n", "[c", function() + if vim.wo.diff then + vim.cmd.normal({ "[c", bang = true }) + else + gitsigns.nav_hunk("prev") + end + end, { desc = "Jump to previous git [c]hange" }) + + -- Actions + -- visual mode + map("v", "hs", function() + gitsigns.stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, { desc = "git [s]tage hunk" }) + map("v", "hr", function() + gitsigns.reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, { desc = "git [r]eset hunk" }) + -- normal mode + map("n", "hs", gitsigns.stage_hunk, { desc = "git [s]tage hunk" }) + map("n", "hr", gitsigns.reset_hunk, { desc = "git [r]eset hunk" }) + map("n", "hS", gitsigns.stage_buffer, { desc = "git [S]tage buffer" }) + map("n", "hu", gitsigns.stage_hunk, { desc = "git [u]ndo stage hunk" }) + map("n", "hR", gitsigns.reset_buffer, { desc = "git [R]eset buffer" }) + map("n", "hp", gitsigns.preview_hunk, { desc = "git [p]review hunk" }) + map("n", "hb", gitsigns.blame_line, { desc = "git [b]lame line" }) + map("n", "hd", gitsigns.diffthis, { desc = "git [d]iff against index" }) + map("n", "hD", function() + gitsigns.diffthis("@") + end, { desc = "git [D]iff against last commit" }) + -- Toggles + map("n", "tb", gitsigns.toggle_current_line_blame, { desc = "[T]oggle git show [b]lame line" }) + map("n", "tD", gitsigns.preview_hunk_inline, { desc = "[T]oggle git show [D]eleted" }) + end, + }) + end, + }, + { + "telescope.nvim", + event = "VimEnter", + after = function() + local actions = require("telescope.actions") + + require("telescope").setup({ + defaults = { + path_display = { "truncate" }, + layout_strategy = "horizontal", + layout_config = { + prompt_position = "top", + }, + sorting_strategy = "ascending", + mappings = { + i = { + [""] = actions.move_selection_previous, -- Move up with Ctrl-k + [""] = actions.move_selection_next, -- Move down with Ctrl-j + [""] = actions.send_selected_to_qflist + actions.open_qflist, -- Send to quickfix + }, + }, + }, + extensions = { + ["ui-select"] = { + require("telescope.themes").get_dropdown(), + }, + }, + }) + + -- Enable Telescope extensions if they are installed + pcall(require("telescope").load_extension, "projects") + pcall(require("telescope").load_extension, "fzf") + pcall(require("telescope").load_extension, "ui-select") + + -- See `:help telescope.builtin` + local builtin = require("telescope.builtin") + vim.keymap.set("n", "sh", builtin.help_tags, { desc = "[S]earch [H]elp" }) + vim.keymap.set("n", "sk", builtin.keymaps, { desc = "[S]earch [K]eymaps" }) + vim.keymap.set("n", "sf", builtin.find_files, { desc = "[S]earch [F]iles" }) + vim.keymap.set("n", "ss", builtin.builtin, { desc = "[S]earch [S]elect Telescope" }) + vim.keymap.set("n", "sw", builtin.grep_string, { desc = "[S]earch current [W]ord" }) + vim.keymap.set("n", "sg", builtin.live_grep, { desc = "[S]earch by [G]rep" }) + vim.keymap.set("n", "sd", builtin.diagnostics, { desc = "[S]earch [D]iagnostics" }) + vim.keymap.set("n", "sr", builtin.resume, { desc = "[S]earch [R]esume" }) + vim.keymap.set("n", "s.", builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) + vim.keymap.set("n", "", builtin.buffers, { desc = "[ ] Find existing buffers" }) + vim.keymap.set("n", "sp", function() + require("telescope").extensions.projects.projects({}) + end, { desc = "[S]earch [P]rojects" }) + + -- Slightly advanced example of overriding default behavior and theme + vim.keymap.set("n", "/", function() + -- You can pass additional configuration to Telescope to change the theme, layout, etc. + builtin.current_buffer_fuzzy_find(require("telescope.themes").get_dropdown({ + winblend = 10, + previewer = false, + })) + end, { desc = "[/] Fuzzily search in current buffer" }) + + -- It's also possible to pass additional configuration options. + -- See `:help telescope.builtin.live_grep()` for information about particular keys + vim.keymap.set("n", "s/", function() + builtin.live_grep({ + grep_open_files = true, + prompt_title = "Live Grep in Open Files", + }) + end, { desc = "[S]earch [/] in Open Files" }) + + -- Shortcut for searching your Neovim configuration files + vim.keymap.set("n", "sn", function() + builtin.find_files({ cwd = vim.fn.stdpath("config") }) + end, { desc = "[S]earch [N]eovim files" }) + end, + }, + { + "trouble.nvim", + cmd = "Trouble", + keys = { + { "xx", "Trouble diagnostics toggle", desc = "Diagnostics (Trouble)" }, + { "xX", "Trouble diagnostics toggle filter.buf=0", desc = "Buffer Diagnostics (Trouble)" }, + }, + after = function() + require("trouble").setup({ + focus = true, + }) + end, + }, + { + "todo-comments.nvim", + event = { "BufReadPre", "BufNewFile" }, + keys = { + { "st", "TodoTelescope", desc = "[S]earch [T]odos" }, + { "xt", "TodoTrouble", desc = "Todo (Trouble)" }, + }, + after = function() + require("todo-comments").setup({ + signs = false, + }) + 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", "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, + }, +}) diff --git a/modules/neovim/lua-config/lua/plugins/lsp.lua b/modules/neovim/lua-config/lua/plugins/lsp.lua new file mode 100644 index 0000000..88cc8f1 --- /dev/null +++ b/modules/neovim/lua-config/lua/plugins/lsp.lua @@ -0,0 +1,166 @@ +require("lz.n").load({ + { + "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 + vim.lsp.inlay_hint.enable(true, { bufnr = bufnr }) + map("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] = "󰠠 ", + }, + }, + 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.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") + + local settings = require("nix-info").settings + + -- Nix + vim.lsp.config("nixd", { + settings = { + nixd = { + nixpkgs = { expr = settings.nixdExtras.nixpkgs }, + options = { + nixos = { expr = settings.nixdExtras.nixos_options }, + ["home-manager"] = { expr = settings.nixdExtras.home_manager_options }, + }, + formatting = { command = { "nixfmt" } }, + }, + }, + }) + vim.lsp.enable("nixd") + + -- Dafny + vim.lsp.enable("dafny") + + -- 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 = "recommended", + -- inlayHints = { + -- variableTypes = true, + -- callArgumentNames = true, + -- functionReturnTypes = true, + -- }, + -- }, + -- }, + -- }, + -- }) + -- vim.lsp.enable("basedpyright") + vim.lsp.enable("ty") + vim.lsp.enable("ruff") + + vim.lsp.enable("astro") + + vim.lsp.config("tinymist", { + settings = { + tinymist = { + formatterMode = "typstyle", + }, + }, + }) + vim.lsp.enable("tinymist") + end, + }, +}) diff --git a/modules/neovim/lua-config/lua/plugins/ui.lua b/modules/neovim/lua-config/lua/plugins/ui.lua new file mode 100644 index 0000000..b947e97 --- /dev/null +++ b/modules/neovim/lua-config/lua/plugins/ui.lua @@ -0,0 +1,202 @@ +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, + -- }, + { + "theme-loader", + event = "VimEnter", + load = function() + local settings = require("nix-info").settings + local theme_code = settings.themeSetup + + local func, err = loadstring(theme_code) + if func then + func() + else + print("Error loading theme code: " .. err) + end + + end, + }, + { + "colorful-menu.nvim", + after = function() + require("colorful-menu").setup({}) + end, + }, + { + "indent-blankline.nvim", + event = "User FileOpened", + after = function() + require("ibl").setup({ + indent = { char = "|" }, + scope = { + enabled = false, + show_start = false, + show_end = false, + }, + }) + end, + }, + { + "render-markdown.nvim", + before = function() + require("lz.n").trigger_load({ "nvim-treesitter", "mini.nvim" }) + end, + after = function() + require("render-markdown").setup({}) + end, + }, + { + "which-key.nvim", + event = "VimEnter", + before = function() + require("lz.n").trigger_load("nvim-web-devicons") + end, + after = function() + require("which-key").setup({ + preset = "modern", + delay = 200, + icons = { + -- set icon mappings to true if you have a Nerd Font + mappings = true, + -- If you are using a Nerd Font: set icons.keys to an empty table which will use the + -- default which-key.nvim defined Nerd Font icons, otherwise define a string table + keys = {}, + }, + + -- Document existing key chains + spec = { + { "s", group = "[S]earch" }, + { "t", group = "[T]oggle" }, + { "h", group = "Git [H]unk", mode = { "n", "v" } }, + }, + }) + end, + }, + { + "lualine.nvim", + event = "VimEnter", + after = function() + require("lualine").setup({ + options = { + icons_enabled = true, + globalstatus = true, + component_separators = "", + section_separators = "", + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { "branch", "diagnostics" }, + lualine_c = { "filename" }, + + 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", + + 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", + }, + }, + }) + end, + }, + { + "zen-mode.nvim", + after = function() + require("zen-mode").setup({ + window = { + options = { + linebreak = true, + }, + }, + }) + end, + }, +}) diff --git a/modules/niri.nix b/modules/niri.nix new file mode 100644 index 0000000..277917c --- /dev/null +++ b/modules/niri.nix @@ -0,0 +1,309 @@ +{ inputs, ... }: +{ + flake-file.inputs.niri.url = "github:sodiboo/niri-flake"; + + lux.niri = { + nixos = + { pkgs, ... }: + { + imports = [ inputs.niri.nixosModules.niri ]; + nixpkgs.overlays = [ inputs.niri.overlays.niri ]; + + programs.niri.enable = true; + programs.niri.package = pkgs.niri-unstable; + }; + + homeManager = + { config, pkgs, ... }: + { + # Needed for file picker + home.packages = with pkgs; [ + playerctl + nautilus + ]; + + programs.niri = { + settings = { + prefer-no-csd = true; + hotkey-overlay.skip-at-startup = true; + screenshot-path = "${config.xdg.userDirs.pictures}/screenshots/%Y-%m-%dT%H:%M:%S.png"; + + cursor = with config.home.pointerCursor; { + size = size; + theme = name; + + hide-after-inactive-ms = 3000; + hide-when-typing = true; + }; + + layout = { + always-center-single-column = true; + gaps = 16; + focus-ring.width = 3; + }; + + window-rules = [ + { + geometry-corner-radius = + let + radius = 15.0; + in + { + bottom-left = radius; + bottom-right = radius; + top-left = radius; + top-right = radius; + }; + clip-to-geometry = true; + } + ]; + + debug = { + honor-xdg-activation-with-invalid-serial = true; + }; + + input = { + focus-follows-mouse.enable = true; + keyboard = { + repeat-delay = 300; + repeat-rate = 50; + xkb.options = "caps:escape"; + }; + mouse.accel-speed = 0.4; + }; + + outputs."LG Electronics LG ULTRAGEAR 103NTYT8R290" = { + focus-at-startup = true; + position.x = 0; + position.y = 0; + }; + + outputs."LG Electronics LG ULTRAGEAR 103NTJJ8R332" = { + position.x = 2560; + position.y = 0; + }; + + binds = { + "Mod+Space".action.spawn-sh = "noctalia-shell ipc call launcher toggle"; + + # --- Helpful Overlays & Launchers --- + "Mod+Shift+Slash".action.show-hotkey-overlay = [ ]; + + "Mod+Return" = { + action.spawn = "kitty"; + hotkey-overlay.title = "Open a Terminal"; + }; + + "Mod+B" = { + action.spawn = "brave"; + hotkey-overlay.title = "Open a Browser"; + }; + + "Mod+D" = { + action.spawn = "fuzzel"; + hotkey-overlay.title = "Run an Application: fuzzel"; + }; + "Mod+Alt+S" = { + action.spawn-sh = "pkill orca || exec orca"; + allow-when-locked = true; + hotkey-overlay.hidden = true; # Equivalent to hotkey-overlay-title=null + }; + + # --- Audio & Media Controls --- + "XF86AudioPlay" = { + action.spawn-sh = "playerctl play-pause"; + allow-when-locked = true; + }; + "XF86AudioStop" = { + action.spawn-sh = "playerctl stop"; + allow-when-locked = true; + }; + "XF86AudioPrev" = { + action.spawn-sh = "playerctl previous"; + allow-when-locked = true; + }; + "XF86AudioNext" = { + action.spawn-sh = "playerctl next"; + allow-when-locked = true; + }; + "XF86AudioRaiseVolume" = { + action.spawn-sh = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"; + allow-when-locked = true; + }; + "XF86AudioLowerVolume" = { + action.spawn-sh = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"; + allow-when-locked = true; + }; + "XF86AudioMute" = { + action.spawn-sh = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + allow-when-locked = true; + }; + "XF86AudioMicMute" = { + action.spawn-sh = "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; + allow-when-locked = true; + }; + + # --- Overview & Window Management --- + "Mod+O" = { + action.toggle-overview = [ ]; + repeat = false; + }; + "Mod+Q" = { + action.close-window = [ ]; + repeat = false; + }; + + # Focus Movement + "Mod+H".action.focus-column-left = [ ]; + "Mod+J".action.focus-window-down = [ ]; + "Mod+K".action.focus-window-up = [ ]; + "Mod+L".action.focus-column-right = [ ]; + + # Window Movement + "Mod+Ctrl+Left".action.move-column-left = [ ]; + "Mod+Ctrl+Down".action.move-window-down = [ ]; + "Mod+Ctrl+Up".action.move-window-up = [ ]; + "Mod+Ctrl+Right".action.move-column-right = [ ]; + "Mod+Ctrl+H".action.move-column-left = [ ]; + "Mod+Ctrl+J".action.move-window-down = [ ]; + "Mod+Ctrl+K".action.move-window-up = [ ]; + "Mod+Ctrl+L".action.move-column-right = [ ]; + + # Column Focus & Movement + "Mod+Home".action.focus-column-first = [ ]; + "Mod+End".action.focus-column-last = [ ]; + "Mod+Ctrl+Home".action.move-column-to-first = [ ]; + "Mod+Ctrl+End".action.move-column-to-last = [ ]; + + # Monitor Focus + "Mod+Shift+Left".action.focus-monitor-left = [ ]; + "Mod+Shift+Down".action.focus-monitor-down = [ ]; + "Mod+Shift+Up".action.focus-monitor-up = [ ]; + "Mod+Shift+Right".action.focus-monitor-right = [ ]; + "Mod+Shift+H".action.focus-monitor-left = [ ]; + "Mod+Shift+J".action.focus-monitor-down = [ ]; + "Mod+Shift+K".action.focus-monitor-up = [ ]; + "Mod+Shift+L".action.focus-monitor-right = [ ]; + + # Monitor Movement + "Mod+Shift+Ctrl+Left".action.move-column-to-monitor-left = [ ]; + "Mod+Shift+Ctrl+Down".action.move-column-to-monitor-down = [ ]; + "Mod+Shift+Ctrl+Up".action.move-column-to-monitor-up = [ ]; + "Mod+Shift+Ctrl+Right".action.move-column-to-monitor-right = [ ]; + "Mod+Shift+Ctrl+H".action.move-column-to-monitor-left = [ ]; + "Mod+Shift+Ctrl+J".action.move-column-to-monitor-down = [ ]; + "Mod+Shift+Ctrl+K".action.move-column-to-monitor-up = [ ]; + "Mod+Shift+Ctrl+L".action.move-column-to-monitor-right = [ ]; + + # Workspace Focus + "Mod+Page_Down".action.focus-workspace-down = [ ]; + "Mod+Page_Up".action.focus-workspace-up = [ ]; + "Mod+U".action.focus-workspace-down = [ ]; + "Mod+I".action.focus-workspace-up = [ ]; + + # Workspace Movement (Column) + "Mod+Ctrl+Page_Down".action.move-column-to-workspace-down = [ ]; + "Mod+Ctrl+Page_Up".action.move-column-to-workspace-up = [ ]; + "Mod+Ctrl+U".action.move-column-to-workspace-down = [ ]; + "Mod+Ctrl+I".action.move-column-to-workspace-up = [ ]; + + # Workspace Movement (Entire Workspace) + "Mod+Shift+Page_Down".action.move-workspace-down = [ ]; + "Mod+Shift+Page_Up".action.move-workspace-up = [ ]; + "Mod+Shift+U".action.move-workspace-down = [ ]; + "Mod+Shift+I".action.move-workspace-up = [ ]; + + # --- Mouse Wheel Scrolling --- + "Mod+WheelScrollDown" = { + action.focus-workspace-down = [ ]; + cooldown-ms = 150; + }; + "Mod+WheelScrollUp" = { + action.focus-workspace-up = [ ]; + cooldown-ms = 150; + }; + "Mod+Ctrl+WheelScrollDown" = { + action.move-column-to-workspace-down = [ ]; + cooldown-ms = 150; + }; + "Mod+Ctrl+WheelScrollUp" = { + action.move-column-to-workspace-up = [ ]; + cooldown-ms = 150; + }; + + "Mod+WheelScrollRight".action.focus-column-right = [ ]; + "Mod+WheelScrollLeft".action.focus-column-left = [ ]; + "Mod+Ctrl+WheelScrollRight".action.move-column-right = [ ]; + "Mod+Ctrl+WheelScrollLeft".action.move-column-left = [ ]; + + "Mod+Shift+WheelScrollDown".action.focus-column-right = [ ]; + "Mod+Shift+WheelScrollUp".action.focus-column-left = [ ]; + "Mod+Ctrl+Shift+WheelScrollDown".action.move-column-right = [ ]; + "Mod+Ctrl+Shift+WheelScrollUp".action.move-column-left = [ ]; + + # --- Workspace Indices --- + "Mod+1".action.focus-workspace = 1; + "Mod+2".action.focus-workspace = 2; + "Mod+3".action.focus-workspace = 3; + "Mod+4".action.focus-workspace = 4; + "Mod+5".action.focus-workspace = 5; + "Mod+6".action.focus-workspace = 6; + "Mod+7".action.focus-workspace = 7; + "Mod+8".action.focus-workspace = 8; + "Mod+9".action.focus-workspace = 9; + + "Mod+Ctrl+1".action.move-column-to-workspace = 1; + "Mod+Ctrl+2".action.move-column-to-workspace = 2; + "Mod+Ctrl+3".action.move-column-to-workspace = 3; + "Mod+Ctrl+4".action.move-column-to-workspace = 4; + "Mod+Ctrl+5".action.move-column-to-workspace = 5; + "Mod+Ctrl+6".action.move-column-to-workspace = 6; + "Mod+Ctrl+7".action.move-column-to-workspace = 7; + "Mod+Ctrl+8".action.move-column-to-workspace = 8; + "Mod+Ctrl+9".action.move-column-to-workspace = 9; + + # --- Column/Window Reshaping & Organization --- + "Mod+BracketLeft".action.consume-or-expel-window-left = [ ]; + "Mod+BracketRight".action.consume-or-expel-window-right = [ ]; + "Mod+Comma".action.consume-window-into-column = [ ]; + "Mod+Period".action.expel-window-from-column = [ ]; + + "Mod+R".action.switch-preset-column-width = [ ]; + "Mod+Shift+R".action.switch-preset-window-height = [ ]; + "Mod+Ctrl+R".action.reset-window-height = [ ]; + "Mod+F".action.maximize-column = [ ]; + "Mod+Shift+F".action.fullscreen-window = [ ]; + "Mod+M".action.maximize-window-to-edges = [ ]; + "Mod+Ctrl+F".action.expand-column-to-available-width = [ ]; + "Mod+C".action.center-column = [ ]; + "Mod+Ctrl+C".action.center-visible-columns = [ ]; + + "Mod+Minus".action.set-column-width = "-10%"; + "Mod+Equal".action.set-column-width = "+10%"; + "Mod+Shift+Minus".action.set-window-height = "-10%"; + "Mod+Shift+Equal".action.set-window-height = "+10%"; + + "Mod+V".action.toggle-window-floating = [ ]; + "Mod+Shift+V".action.switch-focus-between-floating-and-tiling = [ ]; + "Mod+W".action.toggle-column-tabbed-display = [ ]; + + # --- Screenshots --- + "Print".action.screenshot = [ ]; + "Ctrl+Print".action.screenshot-screen = [ ]; + "Alt+Print".action.screenshot-window = [ ]; + + # --- System & Session --- + "Mod+Escape" = { + action.toggle-keyboard-shortcuts-inhibit = [ ]; + allow-inhibiting = false; + }; + + "Mod+Shift+E".action.quit = [ ]; + "Ctrl+Alt+Delete".action.quit = [ ]; + "Mod+Shift+P".action.power-off-monitors = [ ]; + }; + }; + }; + }; + }; +} diff --git a/modules/nix.nix b/modules/nix.nix new file mode 100644 index 0000000..a2bb744 --- /dev/null +++ b/modules/nix.nix @@ -0,0 +1,26 @@ +{ inputs, ... }: +{ + den.default = { + nixos = { + nixpkgs.config.allowUnfree = true; + + nix = { + gc.automatic = true; + optimise.automatic = true; + registry.nixpkgs.flake = inputs.nixpkgs; + channel.enable = false; + + settings = { + trusted-users = [ "@wheel" ]; + use-xdg-base-directories = true; + auto-optimise-store = true; + + experimental-features = [ + "nix-command" + "flakes" + ]; + }; + }; + }; + }; +} diff --git a/modules/noctalia.nix b/modules/noctalia.nix new file mode 100644 index 0000000..9b1b122 --- /dev/null +++ b/modules/noctalia.nix @@ -0,0 +1,566 @@ +{ inputs, ... }: +{ + flake-file.inputs.noctalia.url = "github:noctalia-dev/noctalia-shell"; + + lux.noctalia = { + homeManager = + { pkgs, ... }: + { + imports = [ inputs.noctalia.homeModules.default ]; + + programs.noctalia-shell = { + enable = true; + package = inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default.override { + calendarSupport = true; + }; + + systemd.enable = true; + settings = { + settingsVersion = 53; + bar = { + barType = "simple"; + position = "top"; + monitors = [ ]; + density = "default"; + showOutline = false; + showCapsule = true; + capsuleOpacity = 1; + capsuleColorKey = "none"; + backgroundOpacity = 0.93; + useSeparateOpacity = false; + floating = false; + marginVertical = 4; + marginHorizontal = 4; + frameThickness = 8; + frameRadius = 12; + outerCorners = true; + hideOnOverview = false; + displayMode = "always_visible"; + autoHideDelay = 500; + autoShowDelay = 150; + widgets = { + left = [ + { + icon = "rocket"; + iconColor = "none"; + id = "Launcher"; + } + { + clockColor = "none"; + customFont = ""; + formatHorizontal = "HH:mm ddd, MMM dd"; + formatVertical = "HH mm - dd MM"; + id = "Clock"; + tooltipFormat = "HH:mm ddd, MMM dd"; + useCustomFont = false; + } + { + characterCount = 2; + colorizeIcons = false; + emptyColor = "secondary"; + enableScrollWheel = true; + focusedColor = "primary"; + followFocusedScreen = false; + groupedBorderOpacity = 1; + hideUnoccupied = false; + iconScale = 0.8; + id = "Workspace"; + labelMode = "index"; + occupiedColor = "secondary"; + pillSize = 0.6; + reverseScroll = false; + showApplications = false; + showBadge = true; + showLabelsOnlyWhenOccupied = true; + unfocusedIconsOpacity = 1; + } + ]; + center = [ + { + colorizeIcons = false; + hideMode = "hidden"; + id = "ActiveWindow"; + maxWidth = 400; + scrollingMode = "hover"; + showIcon = true; + textColor = "none"; + useFixedWidth = false; + } + ]; + right = [ + { + compactMode = false; + compactShowAlbumArt = true; + compactShowVisualizer = false; + hideMode = "hidden"; + hideWhenIdle = false; + id = "MediaMini"; + maxWidth = 145; + panelShowAlbumArt = true; + panelShowVisualizer = true; + scrollingMode = "hover"; + showAlbumArt = true; + showArtistFirst = true; + showProgressRing = true; + showVisualizer = false; + textColor = "none"; + useFixedWidth = false; + visualizerType = "linear"; + } + { + blacklist = [ ]; + chevronColor = "none"; + colorizeIcons = false; + drawerEnabled = true; + hidePassive = false; + id = "Tray"; + pinned = [ ]; + } + { + hideWhenZero = false; + hideWhenZeroUnread = false; + iconColor = "none"; + id = "NotificationHistory"; + showUnreadBadge = true; + unreadBadgeColor = "primary"; + } + { + displayMode = "onhover"; + iconColor = "none"; + id = "Volume"; + middleClickCommand = "pwvucontrol || pavucontrol"; + textColor = "none"; + } + { + colorizeDistroLogo = false; + colorizeSystemIcon = "none"; + customIconPath = ""; + enableColorization = false; + icon = "noctalia"; + id = "ControlCenter"; + useDistroLogo = false; + } + ]; + }; + screenOverrides = [ ]; + }; + general = { + avatarImage = "/home/kiri/.face"; + dimmerOpacity = 0; + showScreenCorners = false; + forceBlackScreenCorners = false; + scaleRatio = 1; + radiusRatio = 1; + iRadiusRatio = 1; + boxRadiusRatio = 1; + screenRadiusRatio = 1; + animationSpeed = 1; + animationDisabled = false; + compactLockScreen = false; + lockScreenAnimations = false; + lockOnSuspend = true; + showSessionButtonsOnLockScreen = true; + showHibernateOnLockScreen = false; + enableShadows = true; + shadowDirection = "bottom_right"; + shadowOffsetX = 2; + shadowOffsetY = 3; + language = ""; + allowPanelsOnScreenWithoutBar = true; + showChangelogOnStartup = true; + telemetryEnabled = false; + enableLockScreenCountdown = true; + lockScreenCountdownDuration = 10000; + autoStartAuth = false; + allowPasswordWithFprintd = false; + clockStyle = "custom"; + clockFormat = "hh\\nmm"; + lockScreenMonitors = [ ]; + lockScreenBlur = 0; + lockScreenTint = 0; + keybinds = { + keyUp = [ + "Up" + ]; + keyDown = [ + "Down" + ]; + keyLeft = [ + "Left" + ]; + keyRight = [ + "Right" + ]; + keyEnter = [ + "Return" + ]; + keyEscape = [ + "Esc" + ]; + keyRemove = [ + "Del" + ]; + }; + }; + ui = { + fontDefault = "Comfortaa Medium"; + fontFixed = "FiraCode Nerd Font"; + fontDefaultScale = 1; + fontFixedScale = 1; + tooltipsEnabled = true; + panelBackgroundOpacity = 1; + panelsAttachedToBar = true; + settingsPanelMode = "attached"; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + networkPanelView = "wifi"; + bluetoothHideUnnamedDevices = false; + boxBorderEnabled = false; + }; + location = { + name = "Meterik, Limburg"; + weatherEnabled = true; + weatherShowEffects = true; + useFahrenheit = false; + use12hourFormat = false; + showWeekNumberInCalendar = true; + showCalendarEvents = true; + showCalendarWeather = true; + analogClockInCalendar = false; + firstDayOfWeek = -1; + hideWeatherTimezone = false; + hideWeatherCityName = false; + }; + calendar = { + cards = [ + { + enabled = true; + id = "calendar-header-card"; + } + { + enabled = true; + id = "calendar-month-card"; + } + { + enabled = true; + id = "weather-card"; + } + ]; + }; + wallpaper = { + enabled = true; + overviewEnabled = false; + directory = "/home/kiri/media/images/wallpapers"; + monitorDirectories = [ ]; + enableMultiMonitorDirectories = false; + showHiddenFiles = false; + viewMode = "recursive"; + setWallpaperOnAllMonitors = true; + fillMode = "crop"; + fillColor = "#000000"; + useSolidColor = false; + solidColor = "#1a1a2e"; + automationEnabled = false; + wallpaperChangeMode = "random"; + randomIntervalSec = 300; + transitionDuration = 1500; + transitionType = "random"; + skipStartupTransition = false; + transitionEdgeSmoothness = 0.05; + panelPosition = "follow_bar"; + hideWallpaperFilenames = false; + overviewBlur = 0.4; + overviewTint = 0.6; + useWallhaven = false; + wallhavenQuery = ""; + wallhavenSorting = "relevance"; + wallhavenOrder = "desc"; + wallhavenCategories = "111"; + wallhavenPurity = "100"; + wallhavenRatios = ""; + wallhavenApiKey = ""; + wallhavenResolutionMode = "atleast"; + wallhavenResolutionWidth = ""; + wallhavenResolutionHeight = ""; + sortOrder = "name"; + favorites = [ ]; + }; + appLauncher = { + enableClipboardHistory = true; + autoPasteClipboard = false; + enableClipPreview = true; + clipboardWrapText = true; + clipboardWatchTextCommand = "wl-paste --type text --watch cliphist store"; + clipboardWatchImageCommand = "wl-paste --type image --watch cliphist store"; + position = "top_center"; + pinnedApps = [ ]; + useApp2Unit = false; + sortByMostUsed = true; + terminalCommand = "kitty -e"; + customLaunchPrefixEnabled = false; + customLaunchPrefix = ""; + viewMode = "grid"; + showCategories = true; + iconMode = "tabler"; + showIconBackground = false; + enableSettingsSearch = true; + enableWindowsSearch = true; + enableSessionSearch = true; + ignoreMouseInput = false; + screenshotAnnotationTool = ""; + overviewLayer = false; + density = "default"; + }; + controlCenter = { + position = "close_to_bar_button"; + diskPath = "/"; + shortcuts = { + left = [ + { + id = "Network"; + } + { + id = "Bluetooth"; + } + { + id = "WallpaperSelector"; + } + { + id = "NoctaliaPerformance"; + } + ]; + right = [ + { + id = "Notifications"; + } + { + id = "PowerProfile"; + } + { + id = "KeepAwake"; + } + { + id = "NightLight"; + } + ]; + }; + cards = [ + { + enabled = true; + id = "profile-card"; + } + { + enabled = true; + id = "shortcuts-card"; + } + { + enabled = true; + id = "audio-card"; + } + { + enabled = false; + id = "brightness-card"; + } + { + enabled = true; + id = "weather-card"; + } + { + enabled = true; + id = "media-sysmon-card"; + } + ]; + }; + systemMonitor = { + cpuWarningThreshold = 80; + cpuCriticalThreshold = 90; + tempWarningThreshold = 80; + tempCriticalThreshold = 90; + gpuWarningThreshold = 80; + gpuCriticalThreshold = 90; + memWarningThreshold = 80; + memCriticalThreshold = 90; + swapWarningThreshold = 80; + swapCriticalThreshold = 90; + diskWarningThreshold = 80; + diskCriticalThreshold = 90; + diskAvailWarningThreshold = 20; + diskAvailCriticalThreshold = 10; + batteryWarningThreshold = 20; + batteryCriticalThreshold = 5; + enableDgpuMonitoring = false; + useCustomColors = false; + warningColor = ""; + criticalColor = ""; + externalMonitor = "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor"; + }; + dock = { + enabled = false; + position = "bottom"; + displayMode = "auto_hide"; + backgroundOpacity = 1; + floatingRatio = 1; + size = 1; + onlySameOutput = true; + monitors = [ ]; + pinnedApps = [ ]; + colorizeIcons = false; + pinnedStatic = false; + inactiveIndicators = false; + deadOpacity = 0.6; + animationSpeed = 1; + }; + network = { + wifiEnabled = true; + airplaneModeEnabled = false; + bluetoothRssiPollingEnabled = false; + bluetoothRssiPollIntervalMs = 60000; + wifiDetailsViewMode = "grid"; + bluetoothDetailsViewMode = "grid"; + bluetoothHideUnnamedDevices = false; + disableDiscoverability = false; + }; + sessionMenu = { + enableCountdown = true; + countdownDuration = 10000; + position = "center"; + showHeader = true; + showKeybinds = true; + largeButtonsStyle = true; + largeButtonsLayout = "single-row"; + powerOptions = [ + { + action = "lock"; + enabled = true; + keybind = "1"; + } + { + action = "suspend"; + enabled = true; + keybind = "2"; + } + { + action = "hibernate"; + enabled = true; + keybind = "3"; + } + { + action = "reboot"; + enabled = true; + keybind = "4"; + } + { + action = "logout"; + enabled = true; + keybind = "5"; + } + { + action = "shutdown"; + enabled = true; + keybind = "6"; + } + ]; + }; + notifications = { + enabled = true; + density = "default"; + monitors = [ ]; + location = "top_right"; + overlayLayer = true; + backgroundOpacity = 1; + respectExpireTimeout = false; + lowUrgencyDuration = 3; + normalUrgencyDuration = 8; + criticalUrgencyDuration = 15; + saveToHistory = { + low = true; + normal = true; + critical = true; + }; + sounds = { + enabled = false; + volume = 0.5; + separateSounds = false; + criticalSoundFile = ""; + normalSoundFile = ""; + lowSoundFile = ""; + excludedApps = "discord,firefox,chrome,chromium,edge"; + }; + enableMediaToast = false; + enableKeyboardLayoutToast = true; + enableBatteryToast = true; + }; + osd = { + enabled = true; + location = "top_right"; + autoHideMs = 2000; + overlayLayer = true; + backgroundOpacity = 1; + enabledTypes = [ + 0 + 1 + 2 + ]; + monitors = [ ]; + }; + audio = { + volumeStep = 5; + volumeOverdrive = false; + cavaFrameRate = 30; + visualizerType = "linear"; + mprisBlacklist = [ ]; + preferredPlayer = ""; + volumeFeedback = false; + }; + brightness = { + brightnessStep = 5; + enforceMinimum = true; + enableDdcSupport = false; + }; + colorSchemes = { + useWallpaperColors = false; + predefinedScheme = "Kanagawa"; + darkMode = true; + schedulingMode = "off"; + manualSunrise = "06:30"; + manualSunset = "18:30"; + generationMethod = "tonal-spot"; + monitorForColors = ""; + }; + templates = { + activeTemplates = [ ]; + enableUserTheming = false; + }; + nightLight = { + enabled = false; + forced = false; + autoSchedule = true; + nightTemp = "4000"; + dayTemp = "6500"; + manualSunrise = "06:30"; + manualSunset = "18:30"; + }; + hooks = { + enabled = false; + wallpaperChange = ""; + darkModeChange = ""; + screenLock = ""; + screenUnlock = ""; + performanceModeEnabled = ""; + performanceModeDisabled = ""; + startup = ""; + session = ""; + }; + plugins = { + autoUpdate = false; + }; + desktopWidgets = { + enabled = false; + gridSnap = false; + monitorWidgets = [ ]; + }; + }; + }; + }; + }; +} diff --git a/modules/nvf.nix b/modules/nvf.nix new file mode 100644 index 0000000..7d22dcb --- /dev/null +++ b/modules/nvf.nix @@ -0,0 +1,246 @@ +{ inputs, ... }: +{ + flake-file.inputs.nvf.url = "github:notashelf/nvf"; + + lux.nvf = { + homeManager = + { pkgs, ... }: + { + imports = [ inputs.nvf.homeManagerModules.default ]; + + programs.nvf = { + enable = true; + settings.vim = { + # extraPlugins.kanagawa = { + # package = pkgs.vimPlugins.kanagawa-nvim; + # setup = ''vim.cmd("colorscheme kanagawa")''; + # }; + + augroups = [ + { + clear = true; + name = "highlight-yank"; + } + ]; + + autocmds = [ + { + desc = "Highlight when yanking text"; + event = [ "TextYankPost" ]; + group = "highlight-yank"; + callback = inputs.nixpkgs.lib.generators.mkLuaInline /* lua */ '' + function() + vim.hl.on_yank() + end + ''; + } + ]; + + diagnostics = { + enable = true; + config = { + signs = true; + underline = true; + virtual_text = true; + }; + }; + + options = { + cursorline = true; + cursorlineopt = "both"; + splitright = true; + splitbelow = true; + scrolloff = 5; + number = true; + relativenumber = false; + + signcolumn = "yes"; + + list = true; + listchars = "tab:» ,trail:·,nbsp:␣"; + updatetime = 250; + timeoutlen = 300; + undofile = true; + confirm = true; + inccommand = "split"; + + ignorecase = true; + smartcase = true; + }; + + startPlugins = [ pkgs.vimPlugins.kanagawa-nvim ]; + luaConfigRC.theme-config = inputs.nvf.lib.nvim.dag.entryBefore [ "pluginConfigs" ] /* lua */ '' + require('kanagawa').setup({ + dimInactive = true, + }) + + vim.cmd("colorscheme kanagawa") + ''; + + extraPlugins.hmts = { + package = pkgs.vimPlugins.hmts-nvim; + }; + + languages = { + nix = { + enable = true; + format.enable = true; + treesitter.enable = true; + extraDiagnostics.enable = true; + + lsp.enable = true; + lsp.servers = [ "nixd" ]; + format.type = [ "nixfmt" ]; + }; + + qml = { + enable = true; + format.enable = true; + lsp.enable = true; + treesitter.enable = true; + }; + + python = { + enable = true; + format.enable = true; + lsp.enable = true; + treesitter.enable = true; + }; + }; + + formatter.conform-nvim.enable = true; + + lsp = { + enable = true; + formatOnSave = true; + inlayHints.enable = true; + lspconfig.enable = true; + lspkind.enable = true; + trouble.enable = true; + + servers.nixd.settings = + let + flake = ''(builtins.getFlake "/home/kiri/.config/nixos")''; + in + { + nixd = { + formatting.command = [ "nixfmt" ]; + nixpkgs.expr = "import ${flake}.inputs.nixpkgs {}"; + options = { + nixos.expr = "${flake}.nixosConfigurations.polaris.options"; + home-manager.expr = "${flake}.nixosConfigurations.polaris.options.home-manager.users.type.getSubOptions []"; + flake-parts.expr = "${flake}.debug.options"; + }; + }; + }; + }; + + projects.project-nvim = { + enable = true; + setupOpts = { + manual_mode = false; + }; + }; + + utility.sleuth.enable = true; + + telescope = { + enable = true; + setupOpts = { + defaults = { + color_devicons = true; + }; + }; + extensions = [ + { + name = "fzf"; + packages = [ pkgs.vimPlugins.telescope-fzf-native-nvim ]; + setup = { + fzf = { + fuzzy = true; + }; + }; + } + ]; + }; + + mini = { + ai.enable = true; + surround.enable = true; + files.enable = true; + hipatterns = { + enable = true; + setupOpts = { + highlighters = { + fixme = { + pattern = "%f[%w]()FIXME()%f[%W]"; + group = "MiniHipatternsFixme"; + }; + hack = { + pattern = "%f[%w]()HACK()%f[%W]"; + group = "MiniHipatternsHack"; + }; + todo = { + pattern = "%f[%w]()TODO()%f[%W]"; + group = "MiniHipatternsTodo"; + }; + note = { + pattern = "%f[%w]()NOTE()%f[%W]"; + group = "MiniHipatternsNote"; + }; + + hex_color = + inputs.nixpkgs.lib.mkLuaInline + /* lua */ "require('mini.hipatterns').gen_highlighter.hex_color()"; + }; + }; + + }; + icons.enable = true; + indentscope.enable = true; + indentscope.setupOpts = { + symbol = "│"; + }; + }; + + autopairs.nvim-autopairs.enable = true; + + ui = { + colorful-menu-nvim.enable = true; + }; + + luaConfigRC.mini-icons-mock = inputs.nvf.lib.nvim.dag.entryAfter [ "pluginConfigs" ] /* lua */ '' + require('mini.icons').mock_nvim_web_devicons() + ''; + + statusline.lualine.enable = true; + + binds.whichKey = { + enable = true; + }; + + autocomplete.blink-cmp = { + enable = true; + mappings = { + confirm = ""; + next = ""; + previous = ""; + }; + setupOpts = { + cmdline.keymap.preset = "inherit"; + cmdline.completion.menu.auto_show = true; + + sources.default = [ + "lsp" + "path" + "snippets" + ]; + + signature.enabled = true; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/orion-disk-config.nix b/modules/orion-disk-config.nix new file mode 100644 index 0000000..181c29a --- /dev/null +++ b/modules/orion-disk-config.nix @@ -0,0 +1,65 @@ +{ inputs, ... }: +{ + flake-file.inputs.disko.url = "github:nix-community/disko"; + + den.aspects.orion = { + nixos = + { lib, ... }: + { + imports = [ inputs.disko.nixosModules.disko ]; + + disko.devices = { + disk.disk1 = { + device = lib.mkDefault "/dev/sda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + boot = { + name = "boot"; + size = "1M"; + type = "EF02"; + }; + esp = { + name = "ESP"; + size = "500M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + name = "root"; + size = "100%"; + content = { + type = "lvm_pv"; + vg = "pool"; + }; + }; + }; + }; + }; + lvm_vg = { + pool = { + type = "lvm_vg"; + lvs = { + root = { + size = "100%FREE"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + mountOptions = [ + "defaults" + ]; + }; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/orion-hardware.nix b/modules/orion-hardware.nix new file mode 100644 index 0000000..21558b4 --- /dev/null +++ b/modules/orion-hardware.nix @@ -0,0 +1,43 @@ +# 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/system.nix instead. +{ ... }: +{ + den.aspects.orion = { + nixos = + { + config, + lib, + pkgs, + modulesPath, + ... + }: + + { + imports = [ + (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ + "ata_piix" + "uhci_hcd" + "virtio_pci" + "virtio_scsi" + "sd_mod" + "sr_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.ens18.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + }; + }; +} diff --git a/modules/orion.nix b/modules/orion.nix new file mode 100644 index 0000000..78e106c --- /dev/null +++ b/modules/orion.nix @@ -0,0 +1,134 @@ +{ den, lib, ... }: +{ + den.aspects.orion = { + includes = [ + ( + { host, ... }: + { + # Start all user services on boot not on login (useful for syncthing) + nixos.users.users = lib.mapAttrs (_: _: { linger = true; }) host.users; + } + ) + ]; + + nixos = + { config, pkgs, ... }: + { + environment.systemPackages = [ + pkgs.kitty + ]; + + networking = { + firewall.enable = true; + firewall.allowPing = false; + nftables.enable = true; + }; + + # Use ssh authorization for sudo instead of password + security.pam = { + sshAgentAuth.enable = true; + services.sudo.sshAgentAuth = true; + }; + + services = { + caddy = { + enable = true; + email = "mail@jelles.net"; + openFirewall = true; + }; + + openssh = { + enable = true; + settings = { + PermitRootLogin = "no"; + PasswordAuthentication = false; + # TODO: Retrieve usernames dynamically + AllowUsers = [ + "kiri" + "git" + ]; + }; + }; + + vaultwarden = { + enable = true; + backupDir = "/var/backup/vaultwarden"; + config = { + DOMAIN = "https://vault.jelles.net"; + SIGNUPS_ALLOWED = false; + ROCKET_PORT = 8100; + ROCKET_LOG = "critical"; + }; + }; + caddy.virtualHosts."vault.jelles.net".extraConfig = + "reverse_proxy :${toString config.services.vaultwarden.config.ROCKET_PORT}"; + + radicale = { + enable = true; + settings = { + server.hosts = [ "127.0.0.1:5232" ]; + + auth = { + type = "htpasswd"; + # TODO: Get password file from SOPS + htpasswd_filename = "/var/lib/radicale/users"; + htpasswd_encryption = "bcrypt"; + }; + + storage.filesystem_folder = "/var/lib/radicale/collections"; + }; + }; + + # TODO: Is this extensive config necessary? + caddy.virtualHosts."radicale.jelles.net".extraConfig = '' + reverse_proxy :5232 { + header_up X-Script-Name / + header_up X-Forwarded-For {remote} + header_up X-Remote-User {http.auth.user.id} + }''; + + actual = { + enable = true; + openFirewall = false; + settings = { + port = 3000; + hostname = "127.0.0.1"; + }; + }; + caddy.virtualHosts."finance.jelles.net".extraConfig = + "reverse_proxy :${toString config.services.actual.settings.port}"; + + gitea = { + enable = true; + + settings = { + server = { + DOMAIN = "git.jelles.net"; + ROOT_URL = "https://git.jelles.net/"; + HTTP_PORT = 3001; + HTTP_ADDR = "127.0.0.1"; + + START_SSH_SERVER = false; + SSH_PORT = 22; + }; + + service = { + DISABLE_REGISTRATION = true; + }; + }; + }; + + caddy.virtualHosts."git.jelles.net".extraConfig = + "reverse_proxy :${toString config.services.gitea.settings.server.HTTP_PORT}"; + + }; + + # TODO: Username dynamically + users.users.kiri = { + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAU2LydkXRTtNFY7oyX8JQURwXLVhB71DeK8XzrXeFX1 openpgp:0xA490D93A" + ]; + }; + }; + }; +} diff --git a/modules/pim.nix b/modules/pim.nix new file mode 100644 index 0000000..a711cc9 --- /dev/null +++ b/modules/pim.nix @@ -0,0 +1,79 @@ +{ ... }: +{ + lux.pim = { + homeManager = + { config, ... }: + let + calendarsPath = "${config.xdg.dataHome}/calendars"; + in + { + programs.pimsync.enable = true; + services.pimsync.enable = true; + + programs.khal = { + # FIXME: Temporarily disabled because of bug in nixpkgs-unstable (27-02-26) + enable = false; + locale = { + timeformat = "%H:%M"; + dateformat = "$m-$d"; + }; + }; + + 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 + ''; + }; + + accounts.calendar = { + basePath = calendarsPath; + accounts = { + "radicale" = { + primary = true; + primaryCollection = "personal"; + + local = { + type = "filesystem"; + fileExt = ".ics"; + }; + + remote = { + url = "https://radicale.jelles.net/"; + type = "caldav"; + userName = "kiri"; + passwordCommand = [ + "rbw" + "get" + "Radicale" + ]; + }; + + pimsync = { + enable = true; + extraPairDirectives = [ + { + name = "collections"; + params = [ "from b" ]; + } + ]; + }; + + khal = { + enable = true; + type = "discover"; + color = "light blue"; + }; + }; + }; + }; + + }; + }; +} diff --git a/modules/polaris-hardware.nix b/modules/polaris-hardware.nix new file mode 100644 index 0000000..c9af0cd --- /dev/null +++ b/modules/polaris-hardware.nix @@ -0,0 +1,51 @@ +{ inputs, den, ... }: +{ + den.aspects.polaris = { + nixos = + { + config, + lib, + modulesPath, + ... + }: + + { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ + "nvme" + "xhci_pci" + "ahci" + "usbhid" + "usb_storage" + "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/bda7f8b9-2b3d-4190-8518-baa50490227e"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/26FE-CA37"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" + ]; + }; + + swapDevices = [ ]; + + networking.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + }; + }; +} diff --git a/modules/polaris.nix b/modules/polaris.nix new file mode 100644 index 0000000..63ca090 --- /dev/null +++ b/modules/polaris.nix @@ -0,0 +1,14 @@ +{ inputs, den, ... }: +{ + flake-file.inputs.nixos-hardware.url = "github:NixOS/nixos-hardware/master"; + + den.aspects.polaris = { + includes = [ den.ful.lux.workstation ]; + nixos.imports = with inputs.nixos-hardware.nixosModules; [ + common-pc + common-pc-ssd + common-cpu-amd + common-gpu-amd + ]; + }; +} diff --git a/modules/region.nix b/modules/region.nix new file mode 100644 index 0000000..efc4637 --- /dev/null +++ b/modules/region.nix @@ -0,0 +1,21 @@ +{ + den.default.nixos = { + time.timeZone = "Europe/Amsterdam"; + + i18n.defaultLocale = "en_US.UTF-8"; + i18n.extraLocaleSettings = { + LC_MEASUREMENT = "nl_NL.UTF-8"; + LC_PAPER = "nl_NL.UTF-8"; + LC_ADDRESS = "nl_NL.UTF-8"; + LC_TELEPHONE = "nl_NL.UTF-8"; + LC_NAME = "nl_NL.UTF-8"; + + # Use '.' as decimal point and ',' as thouands separator + LC_NUMERIC = "en_IE.UTF-8"; + LC_MONETARY = "en_IE.UTF-8"; + + # English day and month names, YYYY-MM-DD format + LC_TIME = "en_IE.UTF-8"; + }; + }; +} diff --git a/modules/sddm.nix b/modules/sddm.nix new file mode 100644 index 0000000..664b243 --- /dev/null +++ b/modules/sddm.nix @@ -0,0 +1,17 @@ +{ inputs, ... }: +{ + lux.greeter = { + nixos = + { pkgs, ... }: + { + services.displayManager.sddm = { + enable = true; + wayland.enable = true; + theme = "${pkgs.sddm-astronaut}/share/sddm/themes/sddm-astronaut-theme"; + extraPackages = with pkgs; [ + kdePackages.qtmultimedia + ]; + }; + }; + }; +} diff --git a/modules/secrets/.sops.yaml b/modules/secrets/.sops.yaml new file mode 100644 index 0000000..2c935ef --- /dev/null +++ b/modules/secrets/.sops.yaml @@ -0,0 +1,11 @@ +keys: + - &polaris age122w85pqj508ukv0rd388mahecgfckmpgnsgz0zcyec37ljae2epsdnvxpl + - &altair age15mg7k37mc3ll60rfzx4zpzp50xjefzwy0ayjpstq5ce7raem3a7sef57w7 + - &orion age1l49tm85prcpm4q8e0hxxetv08jqv3gfty3pvzte956dng4h0xaeq0he5yd +creation_rules: + - path_regex: secrets.yaml$ + key_groups: + - age: + - *polaris + - *altair + - *orion diff --git a/modules/secrets/secrets.yaml b/modules/secrets/secrets.yaml new file mode 100644 index 0000000..51466fb --- /dev/null +++ b/modules/secrets/secrets.yaml @@ -0,0 +1,38 @@ +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] +hashed-password-kiri: ENC[AES256_GCM,data:xubN5stH4RPlHYl+Jzcu2BCepz3Hra3TxjiSspktzjgpEWrU79h3NbcPMrYC0MSjsv3oaWio/S7nBV3Tes3WBlI9EC9vq+6tyTVPynUqpB7c9CvvYSmqc9bAHOnIOBb+gP2RR6JB395UoQ==,iv:uN83RNTfCJdBDhFhywV5NbVBp4xcptqzoKVAoAnaiQk=,tag:x9yufiPdSJwBADT6QymExA==,type:str] +sops: + age: + - recipient: age122w85pqj508ukv0rd388mahecgfckmpgnsgz0zcyec37ljae2epsdnvxpl + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByTU9pQS92dlJKQzZjaHFN + SHFHaEJWWVNsMC9KN1hlc2NNTUtCY1pkREJnCm4yY20vYzFqZG1yZWJZN2JTSW5U + Q3dQUkJJalhhbFc4U2Q1dUhpWDRua1UKLS0tIHRuaGUvK2crQUFQRm1DK3UwelJy + N1NPUHdlcW1kSUJidi9Dc1R6N0oyYUUKnt3m3NQb3e+kEC4LRiJ2JW38Hnw8zpTM + hUITQQXZ6KmYoq+3AXJJbePcK+MAuS7VLlecVbhAq25FiDtZkdky5A== + -----END AGE ENCRYPTED FILE----- + - recipient: age15mg7k37mc3ll60rfzx4zpzp50xjefzwy0ayjpstq5ce7raem3a7sef57w7 + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrVCtUY2hMcUtaaXlPd3Zh + bXBtSjIxWUFUMnFCQUdWdk9pVlhRa0F0TWc0CjhEYVAwTHliV2sweUN3aytvS2lu + djdUeG9IYXYxMlBqdklRdGhtWlh0bzQKLS0tIFZpeld1bFArR3h1NXBIeS84eUxr + ZkVRcExsbmJBR1p3QVBwTzRGZ2NWbDgK3yBC0dGsiQKZ+f4eeMFQC//1ASacCkgJ + 0q0rH6YHyqX2ojqLqvpiQUIstCsdohlj36KLc+ziFAOOFyoe7tB7Kg== + -----END AGE ENCRYPTED FILE----- + - recipient: age1l49tm85prcpm4q8e0hxxetv08jqv3gfty3pvzte956dng4h0xaeq0he5yd + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwNUM2UE1sNUVyYncrY3Jr + OE5OWWJidEZqdWdJSkZSUUEzKzJSb2w1akZNClN4ZlhlSXBKVkJWL3NwazlNYjFR + dmhoaTArVmpKMjdQajJxZEF2a2dUT1EKLS0tIDdvRXhsYk5uN3gwbkViVEIxZksw + YlZ4VGIzaE5kQ3ZSczI2Wk5IU1UvOXcKqkj/OYP37+60Gr2xJmPE9O7HB7LCu4Tp + AvvoMQLkkvVJ30Y03pfEzIMnvJHKREy9zDOScfqUflDk79mcDaDhvg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2026-02-16T13:53:22Z" + mac: ENC[AES256_GCM,data:DuGE9Ovae5Y2Qpm5v8OYgFC2/u/Yzprv+ImmX1OVsh5KjGS26HaX1HLbzGu7NZCMfg2ZrJ5BeFNCO3UaZ7tXNoWGKxQZRNYpAH8PjI225l+GWozcva0on6S0UD2MhtKkpFPFUg1uEDSzqwMoXgPbWoB1W0VeAOkfAhKM9j/tggs=,iv:/Hsh9JvdcZMy7v4tLGaBwDlMIf5HBta3GeZC5gDUO9k=,tag:mtwqk41SA9qzIw+cVDSgQg==,type:str] + unencrypted_suffix: _unencrypted + version: 3.11.0 diff --git a/modules/secrets/sops.nix b/modules/secrets/sops.nix new file mode 100644 index 0000000..dd8736c --- /dev/null +++ b/modules/secrets/sops.nix @@ -0,0 +1,26 @@ +{ inputs, ... }: +{ + flake-file.inputs.sops-nix.url = "github:Mic92/sops-nix"; + + den.default = { + nixos = + { pkgs, ... }: + { + imports = [ inputs.sops-nix.nixosModules.sops ]; + + sops = { + age.keyFile = "/home/kiri/.config/sops/age/keys.txt"; + defaultSopsFile = ./secrets.yaml; + secrets = { + hashed-password-kiri.neededForUsers = true; + }; + }; + + environment.systemPackages = with pkgs; [ + sops + age + ]; + + }; + }; +} diff --git a/modules/shell.nix b/modules/shell.nix new file mode 100644 index 0000000..0e9c97d --- /dev/null +++ b/modules/shell.nix @@ -0,0 +1,189 @@ +{ inputs, ... }: +{ + lux.shell = { + homeManager = + { lib, config, ... }: + { + # Delete zcompdump on config switch, so that we regenerate completions + home.activation = { + clearZshCompDump = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + rm -f '${config.programs.zsh.dotDir}/.zcompdump*' + ''; + }; + + programs.zsh = { + enable = true; + dotDir = "${config.xdg.configHome}/zsh"; + + enableCompletion = true; + completionInit = '' + setopt EXTENDED_GLOB + + autoload -U compinit + local dump_path="${config.programs.zsh.dotDir}/.zcompdump" + local cache_check=( $dump_path(#qN.mh-24) ) + + if (( $#cache_check )); then + # Array has items: File exists and is new + compinit -C + else + # Array is empty: File is older than 24 hours OR doesn't exist + compinit + zcompile "$dump_path" & + fi + ''; + autosuggestion.enable = true; + + syntaxHighlighting = { + enable = true; + highlighters = [ + "main" + "brackets" + "pattern" + "regexp" + "root" + "line" + ]; + }; + + historySubstringSearch.enable = true; + + history = { + ignoreDups = true; + save = 10000; + size = 10000; + path = "${config.xdg.dataHome}/zsh_history"; + }; + + profileExtra = lib.optionalString (config.home.sessionPath != [ ]) '' + export PATH="$PATH''${PATH:+:}${lib.concatStringsSep ":" config.home.sessionPath}" + ''; + + initContent = + # bash + '' + bindkey -v + + export KEYTIMEOUT=1 + + # search history based on what's typed in the prompt + autoload -U history-search-end + zle -N history-beginning-search-backward-end history-search-end + zle -N history-beginning-search-forward-end history-search-end + bindkey "^[OA" history-beginning-search-backward-end + bindkey "^[OB" history-beginning-search-forward-end + + # General completion behavior + zstyle ':completion:*' completer _extensions _complete _approximate + + # Use cache + zstyle ':completion:*' use-cache on + zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache" + + # Complete the alias + zstyle ':completion:*' complete true + + # Autocomplete options + zstyle ':completion:*' complete-options true + + # Completion matching control + zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' + zstyle ':completion:*' keep-prefix true + + # Group matches and describe + zstyle ':completion:*' menu select + zstyle ':completion:*' list-grouped false + zstyle ':completion:*' list-separator ''' + zstyle ':completion:*' group-name ''' + zstyle ':completion:*' verbose yes + zstyle ':completion:*:matches' group 'yes' + zstyle ':completion:*:warnings' format '%F{red}%B-- No match for: %d --%b%f' + zstyle ':completion:*:messages' format '%d' + zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b' + zstyle ':completion:*:descriptions' format '[%d]' + + # Colors + zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} + + # case insensitive tab completion + zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories + zstyle ':completion:*:*:cd:*:directory-stack' menu yes select + zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand' + zstyle ':completion:*:*:-command-:*:*' group-order aliases builtins functions commands + zstyle ':completion:*' special-dirs true + zstyle ':completion:*' squeeze-slashes true + + # Sort + zstyle ':completion:*' sort false + zstyle ":completion:*:git-checkout:*" sort false + zstyle ':completion:*' file-sort modification + zstyle ':completion:*:eza' sort false + zstyle ':completion:complete:*:options' sort false + zstyle ':completion:files' sort false + + ${lib.optionalString config.services.gpg-agent.enable '' + gnupg_path=$(ls $XDG_RUNTIME_DIR/gnupg) + export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gnupg/$gnupg_path/S.gpg-agent.ssh" + ''} + ''; + }; + + programs.starship = { + enable = true; + enableZshIntegration = true; + settings = { + add_newline = true; + + format = lib.concatStrings [ + "$nix_shell" + "$hostname" + "$directory" + "$git_branch" + "$git_state" + "$git_status" + "$line_break" + "$character" + ]; + + directory = { + truncation_length = 99; + truncate_to_repo = false; + }; + + nix_shell = { + format = "[$symbol]($style) "; + symbol = "🐚"; + style = ""; + }; + + git_status = { + format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218)($ahead_behind$stashed)]($style)"; + style = "cyan"; + conflicted = ""; + renamed = ""; + deleted = ""; + stashed = "≡"; + }; + + git_state = { + format = "([$state( $progress_current/$progress_total)]($style)) "; + style = "bright-black"; + }; + + line_break = { + disabled = false; + }; + }; + }; + + programs.eza = { + enable = true; + }; + + programs.fzf = { + enable = true; + enableZshIntegration = true; + }; + }; + }; +} diff --git a/modules/state.nix b/modules/state.nix new file mode 100644 index 0000000..7a8368e --- /dev/null +++ b/modules/state.nix @@ -0,0 +1,10 @@ +{ + den.default = + let + configState = "24.05"; + in + { + nixos.system.stateVersion = configState; + homeManager.home.stateVersion = configState; + }; +} diff --git a/modules/syncthing.nix b/modules/syncthing.nix new file mode 100644 index 0000000..392a593 --- /dev/null +++ b/modules/syncthing.nix @@ -0,0 +1,49 @@ +{ + inputs, + den, + lib, + ... +}: +let + meshDevices = lib.listToAttrs ( + lib.concatMap ( + host: + lib.mapAttrsToList ( + userName: user: + let + name = "${userName}@${host.name}"; + in + { + inherit name; + value = { + inherit name; + id = user.syncthingId; + }; + } + ) (lib.filterAttrs (_: u: u ? syncthingId) host.users) + ) (lib.attrValues den.hosts.x86_64-linux) + ); +in +{ + lux.syncthing = { + homeManager = { + services.syncthing = { + enable = true; + + overrideDevices = true; + overrideFolders = true; + + settings = { + folders = { + sync = { + path = "~/sync"; + label = "sync"; + devices = lib.attrNames meshDevices; + }; + }; + devices = meshDevices; + }; + }; + }; + }; +} diff --git a/modules/terminal.nix b/modules/terminal.nix new file mode 100644 index 0000000..ba1bd4f --- /dev/null +++ b/modules/terminal.nix @@ -0,0 +1,88 @@ +{ inputs, ... }: +{ + lux.terminal = { + homeManager = + { pkgs, ... }: + { + programs.alacritty = { + enable = true; + theme = "kanagawa_wave"; + settings = { + window.padding = { + x = 5; + y = 5; + }; + }; + }; + + programs.kitty = { + enable = true; + font = { + name = "JetBrains Mono"; + size = 11; + }; + settings = { + # Fonts + disable_ligatures = "always"; + + # Scrollback + scrollback_lines = 10000; + + # Terminal bell + enable_audio_bell = false; + + # Window layout + confirm_os_window_close = 0; + window_padding_width = 5; + + # Advanced + update_check_interval = 0; + }; + extraConfig = '' + ## 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 + ''; + }; + }; + }; +} diff --git a/modules/users.nix b/modules/users.nix new file mode 100644 index 0000000..e4c0747 --- /dev/null +++ b/modules/users.nix @@ -0,0 +1,21 @@ +{ inputs, ... }: +let + den-lib = inputs.den.lib; +in +{ + # Functions exist in den already but good practice to write it myself + lux.utils.provides = { + define-user = + { + user, + ... + }: + { + nixos = { + users.users."${user}" = { + isNormalUser = true; + }; + }; + }; + }; +} diff --git a/modules/vm.nix b/modules/vm.nix new file mode 100644 index 0000000..9db2fbd --- /dev/null +++ b/modules/vm.nix @@ -0,0 +1,24 @@ +# enables `nix run .#vm`. it is very useful to have a VM +# you can edit your config and launch the VM to test stuff +# instead of having to reboot each time. +{ inputs, den, ... }: +{ + + # USER TODO: remove this tty-autologin used for the VM + den.aspects.igloo.includes = [ (den.provides.tty-autologin "tux") ]; + + perSystem = + { pkgs, ... }: + { + packages.vm = pkgs.writeShellApplication { + name = "vm"; + text = + let + host = inputs.self.nixosConfigurations.igloo.config; + in + '' + ${host.system.build.vm}/bin/run-${host.networking.hostName}-vm "$@" + ''; + }; + }; +} diff --git a/modules/workstation.nix b/modules/workstation.nix new file mode 100644 index 0000000..1ee396c --- /dev/null +++ b/modules/workstation.nix @@ -0,0 +1,194 @@ +{ den, ... }: +{ + lux.workstation = { + includes = [ + den.ful.lux.greeter + den.ful.lux.niri + den.ful.lux.xdg + den.ful.lux.dev + den.ful.lux.terminal + den.ful.lux.shell + den.ful.lux.noctalia + den.ful.lux.pim + # den.ful.lux.nvf + den.ful.lux.neovim + den.ful.lux.email + den.ful.lux.bitwarden + den.ful.lux.ssh + den.ful.lux.helium + ]; + + homeManager = + { pkgs, config, ... }: + { + home.packages = with pkgs; [ + brave + localsend + postman + wl-clipboard + spotify + gemini-cli + qbittorrent + planify + ]; + + programs.mpv = { + enable = true; + bindings = { + D = "cycle deband"; + }; + config = { + profile = "high-quality"; + + osc = "no"; + border = "no"; + + vo = "gpu-next"; + gpu-api = "vulkan"; + hwdec = "vulkan"; + + demuxer-mkv-subtitle-preroll = "yes"; + sub-auto = "fuzzy"; + + sub-gauss = 1.0; + sub-gray = "yes"; + + tone-mapping = "bt.2446a"; + + keep-open = "yes"; + save-position-on-quit = "yes"; + + volume-max = 150; + + deband = "yes"; + deband-iterations = 2; + deband-threshold = 64; + deband-range = 17; + deband-grain = 12; + }; + scripts = with pkgs.mpvScripts; [ + modernz + thumbfast + mpris + autosub + ]; + }; + + programs.ripgrep.enable = true; + programs.uv.enable = true; + + home.pointerCursor = { + name = "phinger-cursors-light"; + package = pkgs.phinger-cursors; + size = 32; + gtk.enable = true; + }; + + # Make electron use wayland + home.sessionVariables = { + NIXOS_OZONE_WL = "1"; + + BROWSER = "brave"; + EDITOR = "nvim"; + VISUAL = "nvim"; + + CARGO_HOME = "${config.xdg.dataHome}/cargo"; + STARSHIP_CACHE = "${config.xdg.cacheHome}/starship"; + + GEMINI_CONFIG_DIR = "${config.xdg.configHome}/gemini"; + + }; + + services.cliphist.enable = true; + services.wl-clip-persist.enable = true; + }; + + nixos = + { + config, + pkgs, + lib, + ... + }: + { + # More modern version of dbus + services.dbus.implementation = "broker"; + + programs.nix-ld.enable = true; + environment.localBinInPath = true; + + # For localsend + networking.firewall.allowedTCPPorts = [ 53317 ]; + + # Audio + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + pulse.enable = true; + jack.enable = true; + wireplumber.enable = true; + }; + + # Bluetooth + hardware.bluetooth.enable = true; + services.blueman.enable = true; + + # Fonts + fonts = { + enableDefaultPackages = false; + packages = with pkgs; [ + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + iosevka + jetbrains-mono + fira-code + ]; + }; + + # Printing + services.printing = { + enable = true; + drivers = with pkgs; [ + cups-filters + cups-browsed + cnijfilter2 + ]; + }; + + # Bootloader + boot = { + loader = { + efi.canTouchEfiVariables = true; + systemd-boot = { + enable = true; + consoleMode = "auto"; + configurationLimit = 5; + + # Convert boot entry to a more readable name + extraInstallCommands = '' + ENTRIES="${config.boot.loader.efi.efiSysMountPoint}/loader/entries" + PROFILES="/nix/var/nix/profiles" + + for file in "$ENTRIES"/nixos-generation-*.conf; do + generation=$(${pkgs.coreutils}/bin/basename "$file" | ${pkgs.gnugrep}/bin/grep -o -E '[0-9]+') + timestamp=$(${pkgs.coreutils}/bin/stat -c %y "$PROFILES/system-$generation-link" 2>/dev/null | ${pkgs.coreutils}/bin/cut -d. -f1) + + if [ -z "$timestamp" ]; then + timestamp="Unknown Date" + fi + + ${pkgs.gnused}/bin/sed -i "s/^version .*/version Generation $generation - $timestamp/" "$file" + done + ''; + }; + }; + + tmp.cleanOnBoot = true; + kernelPackages = pkgs.linuxPackages_latest; + }; + + }; + }; +} diff --git a/modules/xdg.nix b/modules/xdg.nix new file mode 100644 index 0000000..e14ac90 --- /dev/null +++ b/modules/xdg.nix @@ -0,0 +1,40 @@ +{ inputs, ... }: +{ + lux.xdg = { + homeManager = + { config, ... }: + let + homeDir = config.home.homeDirectory; + localDir = "${homeDir}/.local"; + mediaDir = "${homeDir}/media"; + in + { + xdg = { + enable = true; + + cacheHome = "${localDir}/cache"; + configHome = "${homeDir}/.config"; + dataHome = "${localDir}/share"; + stateHome = "${localDir}/state"; + + userDirs = { + enable = true; + createDirectories = true; + + download = "${homeDir}/downloads"; + documents = "${homeDir}/documents"; + + # Organize into media folder + music = "${mediaDir}/music"; + pictures = "${mediaDir}/images"; + videos = "${mediaDir}/videos"; + + # Hide these + desktop = "${localDir}/desktop"; + publicShare = "${localDir}/public"; + templates = "${localDir}/templates"; + }; + }; + }; + }; +} diff --git a/programs/helium.nix b/programs/helium.nix new file mode 100644 index 0000000..ae21228 --- /dev/null +++ b/programs/helium.nix @@ -0,0 +1,101 @@ +{ + lib, + unzip, + autoPatchelfHook, + stdenv, + fetchurl, + libxcb, + libx11, + libxcomposite, + libxdamage, + libxext, + libxfixes, + libxrandr, + libgbm, + cairo, + libudev-zero, + libxkbcommon, + nspr, + nss, + libcupsfilters, + pango, + qt5, + alsa-lib, + atk, + at-spi2-core, + at-spi2-atk, +}: + +stdenv.mkDerivation rec { + name = "Helium"; + version = "0.8.4.1"; + + src = fetchurl { + url = "https://github.com/imputnet/helium-linux/releases/download/${version}/helium-${version}-x86_64_linux.tar.xz"; + sha256 = "sha256-M/1wGewl500vJsoYfhbgXHQ4vlI6d0PRGGGGsRol6sc="; + }; + + nativeBuildInputs = [ + unzip + autoPatchelfHook + ]; + + autoPatchelfIgnoreMissingDeps = [ + "libQt6Core.so.6" + "libQt6Gui.so.6" + "libQt6Widgets.so.6" + ]; + + runtimeDependencies = [ ]; + buildInputs = [ + unzip + libxcb + libx11 + libxcomposite + libxdamage + libxext + libxfixes + libxrandr + libgbm + cairo + pango + libudev-zero + libxkbcommon + nspr + nss + libcupsfilters + alsa-lib + atk + at-spi2-core + at-spi2-atk + qt5.qtbase + qt5.qttools + qt5.qtx11extras + qt5.wrapQtAppsHook + ]; + + installPhase = '' + runHook preInstall + mkdir -p $out/bin + mv * $out/bin/ + mv $out/bin/helium $out/bin/${name} + mkdir -p $out/share/applications + + cat < $out/share/applications/${name}.desktop + [Desktop Entry] + Name=${name} + GenericName=Web Browser + Terminal=false + Icon=$out/bin/product_logo_256.png + Exec=$out/bin/${name} + Type=Application + Categories=Network;WebBrowser; + INI + ''; + + meta = with lib; { + homepage = "https://github.com/imputnet/helium-linux"; + description = "A description of your application"; + platforms = platforms.linux; + }; +}