my nixos flake :3 (git.koi.rip mirror) git.koi.rip/koi/flake
nixos catppuccin linux dotfiles neovim
0

Configure Feed

Select the types of activity you want to include in your feed.

chore: reorganize the repo

now with git lfs!

june (May 14, 2026, 1:29 AM +0200) 2ec61384

+4098
+9
.editorconfig
··· 1 + root = true 2 + 3 + [*] 4 + charset = utf-8 5 + indent_size = 2 6 + indent_style = space 7 + end_of_line = lf 8 + insert_final_newline = true 9 + trim_trailing_whitespace = true
+3
.gitattributes
··· 1 + *.age binary 2 + *.png filter=lfs diff=lfs merge=lfs -text 3 + *.webp filter=lfs diff=lfs merge=lfs -text
+1
.gitignore
··· 1 + **/*.bak
+15
.woodpecker/checks.yml
··· 1 + when: 2 + - event: [push, pull_request] 3 + branch: main 4 + 5 + steps: 6 + - name: commit message 7 + image: codeberg.org/koibtw/commits:latest 8 + commands: 9 + - check-commit-message "$(git log -1 --pretty=%B)" 10 + - name: formatting 11 + image: nixos/nix 12 + commands: 13 + - echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf 14 + - nix fmt --inputs-from . 15 + - nix shell --inputs-from . nixpkgs#git -c git diff --exit-code
+202
LICENSE
··· 1 + 2 + Apache License 3 + Version 2.0, January 2004 4 + http://www.apache.org/licenses/ 5 + 6 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 + 8 + 1. Definitions. 9 + 10 + "License" shall mean the terms and conditions for use, reproduction, 11 + and distribution as defined by Sections 1 through 9 of this document. 12 + 13 + "Licensor" shall mean the copyright owner or entity authorized by 14 + the copyright owner that is granting the License. 15 + 16 + "Legal Entity" shall mean the union of the acting entity and all 17 + other entities that control, are controlled by, or are under common 18 + control with that entity. For the purposes of this definition, 19 + "control" means (i) the power, direct or indirect, to cause the 20 + direction or management of such entity, whether by contract or 21 + otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 + outstanding shares, or (iii) beneficial ownership of such entity. 23 + 24 + "You" (or "Your") shall mean an individual or Legal Entity 25 + exercising permissions granted by this License. 26 + 27 + "Source" form shall mean the preferred form for making modifications, 28 + including but not limited to software source code, documentation 29 + source, and configuration files. 30 + 31 + "Object" form shall mean any form resulting from mechanical 32 + transformation or translation of a Source form, including but 33 + not limited to compiled object code, generated documentation, 34 + and conversions to other media types. 35 + 36 + "Work" shall mean the work of authorship, whether in Source or 37 + Object form, made available under the License, as indicated by a 38 + copyright notice that is included in or attached to the work 39 + (an example is provided in the Appendix below). 40 + 41 + "Derivative Works" shall mean any work, whether in Source or Object 42 + form, that is based on (or derived from) the Work and for which the 43 + editorial revisions, annotations, elaborations, or other modifications 44 + represent, as a whole, an original work of authorship. For the purposes 45 + of this License, Derivative Works shall not include works that remain 46 + separable from, or merely link (or bind by name) to the interfaces of, 47 + the Work and Derivative Works thereof. 48 + 49 + "Contribution" shall mean any work of authorship, including 50 + the original version of the Work and any modifications or additions 51 + to that Work or Derivative Works thereof, that is intentionally 52 + submitted to Licensor for inclusion in the Work by the copyright owner 53 + or by an individual or Legal Entity authorized to submit on behalf of 54 + the copyright owner. For the purposes of this definition, "submitted" 55 + means any form of electronic, verbal, or written communication sent 56 + to the Licensor or its representatives, including but not limited to 57 + communication on electronic mailing lists, source code control systems, 58 + and issue tracking systems that are managed by, or on behalf of, the 59 + Licensor for the purpose of discussing and improving the Work, but 60 + excluding communication that is conspicuously marked or otherwise 61 + designated in writing by the copyright owner as "Not a Contribution." 62 + 63 + "Contributor" shall mean Licensor and any individual or Legal Entity 64 + on behalf of whom a Contribution has been received by Licensor and 65 + subsequently incorporated within the Work. 66 + 67 + 2. Grant of Copyright License. Subject to the terms and conditions of 68 + this License, each Contributor hereby grants to You a perpetual, 69 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 + copyright license to reproduce, prepare Derivative Works of, 71 + publicly display, publicly perform, sublicense, and distribute the 72 + Work and such Derivative Works in Source or Object form. 73 + 74 + 3. Grant of Patent License. Subject to the terms and conditions of 75 + this License, each Contributor hereby grants to You a perpetual, 76 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 + (except as stated in this section) patent license to make, have made, 78 + use, offer to sell, sell, import, and otherwise transfer the Work, 79 + where such license applies only to those patent claims licensable 80 + by such Contributor that are necessarily infringed by their 81 + Contribution(s) alone or by combination of their Contribution(s) 82 + with the Work to which such Contribution(s) was submitted. If You 83 + institute patent litigation against any entity (including a 84 + cross-claim or counterclaim in a lawsuit) alleging that the Work 85 + or a Contribution incorporated within the Work constitutes direct 86 + or contributory patent infringement, then any patent licenses 87 + granted to You under this License for that Work shall terminate 88 + as of the date such litigation is filed. 89 + 90 + 4. Redistribution. You may reproduce and distribute copies of the 91 + Work or Derivative Works thereof in any medium, with or without 92 + modifications, and in Source or Object form, provided that You 93 + meet the following conditions: 94 + 95 + (a) You must give any other recipients of the Work or 96 + Derivative Works a copy of this License; and 97 + 98 + (b) You must cause any modified files to carry prominent notices 99 + stating that You changed the files; and 100 + 101 + (c) You must retain, in the Source form of any Derivative Works 102 + that You distribute, all copyright, patent, trademark, and 103 + attribution notices from the Source form of the Work, 104 + excluding those notices that do not pertain to any part of 105 + the Derivative Works; and 106 + 107 + (d) If the Work includes a "NOTICE" text file as part of its 108 + distribution, then any Derivative Works that You distribute must 109 + include a readable copy of the attribution notices contained 110 + within such NOTICE file, excluding those notices that do not 111 + pertain to any part of the Derivative Works, in at least one 112 + of the following places: within a NOTICE text file distributed 113 + as part of the Derivative Works; within the Source form or 114 + documentation, if provided along with the Derivative Works; or, 115 + within a display generated by the Derivative Works, if and 116 + wherever such third-party notices normally appear. The contents 117 + of the NOTICE file are for informational purposes only and 118 + do not modify the License. You may add Your own attribution 119 + notices within Derivative Works that You distribute, alongside 120 + or as an addendum to the NOTICE text from the Work, provided 121 + that such additional attribution notices cannot be construed 122 + as modifying the License. 123 + 124 + You may add Your own copyright statement to Your modifications and 125 + may provide additional or different license terms and conditions 126 + for use, reproduction, or distribution of Your modifications, or 127 + for any such Derivative Works as a whole, provided Your use, 128 + reproduction, and distribution of the Work otherwise complies with 129 + the conditions stated in this License. 130 + 131 + 5. Submission of Contributions. Unless You explicitly state otherwise, 132 + any Contribution intentionally submitted for inclusion in the Work 133 + by You to the Licensor shall be under the terms and conditions of 134 + this License, without any additional terms or conditions. 135 + Notwithstanding the above, nothing herein shall supersede or modify 136 + the terms of any separate license agreement you may have executed 137 + with Licensor regarding such Contributions. 138 + 139 + 6. Trademarks. This License does not grant permission to use the trade 140 + names, trademarks, service marks, or product names of the Licensor, 141 + except as required for reasonable and customary use in describing the 142 + origin of the Work and reproducing the content of the NOTICE file. 143 + 144 + 7. Disclaimer of Warranty. Unless required by applicable law or 145 + agreed to in writing, Licensor provides the Work (and each 146 + Contributor provides its Contributions) on an "AS IS" BASIS, 147 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 + implied, including, without limitation, any warranties or conditions 149 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 + PARTICULAR PURPOSE. You are solely responsible for determining the 151 + appropriateness of using or redistributing the Work and assume any 152 + risks associated with Your exercise of permissions under this License. 153 + 154 + 8. Limitation of Liability. In no event and under no legal theory, 155 + whether in tort (including negligence), contract, or otherwise, 156 + unless required by applicable law (such as deliberate and grossly 157 + negligent acts) or agreed to in writing, shall any Contributor be 158 + liable to You for damages, including any direct, indirect, special, 159 + incidental, or consequential damages of any character arising as a 160 + result of this License or out of the use or inability to use the 161 + Work (including but not limited to damages for loss of goodwill, 162 + work stoppage, computer failure or malfunction, or any and all 163 + other commercial damages or losses), even if such Contributor 164 + has been advised of the possibility of such damages. 165 + 166 + 9. Accepting Warranty or Additional Liability. While redistributing 167 + the Work or Derivative Works thereof, You may choose to offer, 168 + and charge a fee for, acceptance of support, warranty, indemnity, 169 + or other liability obligations and/or rights consistent with this 170 + License. However, in accepting such obligations, You may act only 171 + on Your own behalf and on Your sole responsibility, not on behalf 172 + of any other Contributor, and only if You agree to indemnify, 173 + defend, and hold each Contributor harmless for any liability 174 + incurred by, or claims asserted against, such Contributor by reason 175 + of your accepting any such warranty or additional liability. 176 + 177 + END OF TERMS AND CONDITIONS 178 + 179 + APPENDIX: How to apply the Apache License to your work. 180 + 181 + To apply the Apache License to your work, attach the following 182 + boilerplate notice, with the fields enclosed by brackets "[]" 183 + replaced with your own identifying information. (Don't include 184 + the brackets!) The text should be enclosed in the appropriate 185 + comment syntax for the file format. We also recommend that a 186 + file or class name and description of purpose be included on the 187 + same "printed page" as the copyright notice for easier 188 + identification within third-party archives. 189 + 190 + Copyright [yyyy] [name of copyright owner] 191 + 192 + Licensed under the Apache License, Version 2.0 (the "License"); 193 + you may not use this file except in compliance with the License. 194 + You may obtain a copy of the License at 195 + 196 + http://www.apache.org/licenses/LICENSE-2.0 197 + 198 + Unless required by applicable law or agreed to in writing, software 199 + distributed under the License is distributed on an "AS IS" BASIS, 200 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 + See the License for the specific language governing permissions and 202 + limitations under the License.
+41
README.md
··· 1 + <div> 2 + <a href="https://koi.rip" target="_blank"> 3 + <img 4 + width="88" 5 + height="31" 6 + src="https://koi.rip/img/badges/mimi-the-car.gif" 7 + alt="mimi the car (my website)" 8 + align="right"> 9 + </a> 10 + <b>my dotfiles</b> 11 + </div> 12 + 13 + <div align="center"> 14 + 15 + ![preview](./preview.webp) 16 + 17 + </div> 18 + 19 + <br> 20 + 21 + <b>licensing</b> 22 + 23 + this repository and all its contents are provided under the terms of 24 + the Apache License, Version 2.0 ([LICENSE](./LICENSE)) unless specified otherwise 25 + 26 + the [wallpaper](./external/wallpaper.png) is a color-shifted version of a photo of a log by 27 + [Nunikii](https://nunikii.ebil.club), which is licensed under 28 + [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) and can be found at 29 + <https://nunikii.ebil.club/photos#p0-2> 30 + 31 + <br> 32 + 33 + <div align="center"> 34 + <img 35 + width="496" 36 + height="32" 37 + src="https://koi.rip/img/mimi-banner.gif" 38 + alt="mimi banner"> 39 + 40 + <sub>Copyright 2026 june</sub> 41 + </div>
+2
external/cargo.toml
··· 1 + [build] 2 + target-dir = "/tmp/cargo"
+58
external/config/quickshell/Modules/Bar/Bar.qml
··· 1 + import QtQuick 2 + import QtQuick.Layouts 3 + import Quickshell 4 + 5 + PanelWindow { 6 + anchors { 7 + top: true 8 + left: true 9 + right: true 10 + } 11 + 12 + implicitHeight: 30 13 + color: colBase 14 + 15 + Workspaces { 16 + anchors { 17 + verticalCenter: parent.verticalCenter 18 + left: parent.left 19 + leftMargin: 10 20 + } 21 + } 22 + 23 + Music { 24 + anchors.centerIn: parent 25 + } 26 + 27 + RowLayout { 28 + anchors { 29 + verticalCenter: parent.verticalCenter 30 + right: parent.right 31 + rightMargin: 10 32 + } 33 + 34 + Txt { 35 + id: timeTxt 36 + text: Qt.formatDateTime(new Date(), "hh:mm AP") 37 + 38 + Timer { 39 + interval: 10000 40 + running: true 41 + repeat: true 42 + onTriggered: timeTxt.text = Qt.formatDateTime(new Date(), "hh:mm AP") 43 + } 44 + } 45 + Spacer {} 46 + Txt { 47 + id: dateTxt 48 + text: Qt.formatDateTime(new Date(), "yyyy-MM-dd") 49 + 50 + Timer { 51 + interval: 600000 52 + running: true 53 + repeat: true 54 + onTriggered: dateTxt.text = Qt.formatDateTime(new Date(), "yyyy-MM-dd") 55 + } 56 + } 57 + } 58 + }
+45
external/config/quickshell/Modules/Bar/Music.qml
··· 1 + import QtQuick 2 + import QtQuick.Layouts 3 + import Quickshell.Io 4 + 5 + RowLayout { 6 + Txt { 7 + id: musicArtistTxt 8 + } 9 + Txt { 10 + text: if (musicArtistTxt.text !== "" && musicTitleTxt.text !== "") { 11 + " 󰎇 "; 12 + } else { 13 + ""; 14 + } 15 + color: colOverlay 16 + } 17 + Txt { 18 + id: musicTitleTxt 19 + } 20 + 21 + Process { 22 + id: musicProc 23 + running: true 24 + command: ["playerctl", "metadata", "--format", "{{ artist }} || {{ title }}"] 25 + stdout: StdioCollector { 26 + onStreamFinished: { 27 + let parts = this.text.trim().split(" || "); 28 + if (parts.length === 2) { 29 + musicArtistTxt.text = parts[0]; 30 + musicTitleTxt.text = parts[1]; 31 + } else { 32 + musicArtistTxt.text = ""; 33 + musicTitleTxt.text = ""; 34 + } 35 + } 36 + } 37 + } 38 + 39 + Timer { 40 + interval: 5000 41 + running: true 42 + repeat: true 43 + onTriggered: musicProc.running = true 44 + } 45 + }
+9
external/config/quickshell/Modules/Bar/Spacer.qml
··· 1 + import QtQuick 2 + import QtQuick.Layouts 3 + 4 + Rectangle { 5 + Layout.preferredWidth: 2 6 + Layout.preferredHeight: 20 7 + Layout.margins: 4 8 + color: colOverlay 9 + }
+7
external/config/quickshell/Modules/Bar/Txt.qml
··· 1 + import QtQuick 2 + 3 + Text { 4 + color: colText 5 + font.family: fontFamily 6 + font.pixelSize: fontSize 7 + }
+17
external/config/quickshell/Modules/Bar/Workspaces.qml
··· 1 + import QtQuick 2 + import QtQuick.Layouts 3 + 4 + RowLayout { 5 + spacing: 20 6 + Repeater { 7 + model: wmWSC 8 + Txt { 9 + text: "" 10 + color: if (index + 1 === wmWSA) { 11 + colAccent; 12 + } else { 13 + colOverlay; 14 + } 15 + } 16 + } 17 + }
+15
external/config/quickshell/Services/Niri/Niri.qml
··· 1 + import Quickshell 2 + import Quickshell.Io 3 + 4 + import "niri.mjs" as Niri 5 + 6 + Process { 7 + id: niriEventStream 8 + running: true 9 + command: ["niri", "msg", "--json", "event-stream"] 10 + stdout: SplitParser { 11 + onRead: data => { 12 + Niri.handleEvent(data, root); 13 + } 14 + } 15 + }
+7
external/config/quickshell/Services/Niri/niri.mjs
··· 1 + export const handleEvent = (evRaw, ns) => { 2 + const ev = JSON.parse(evRaw); 3 + 4 + if (ev.WorkspaceActivated) ns.wmWSA = ev.WorkspaceActivated.id; 5 + else if (ev.WorkspacesChanged) ns.wmWSC = ev.WorkspacesChanged.workspaces.filter(w => w.name) 6 + .length; 7 + };
+31
external/config/quickshell/shell.qml
··· 1 + import QtQuick 2 + import Quickshell 3 + 4 + import "Modules/Bar" 5 + import "Services/Niri" 6 + 7 + ShellRoot { 8 + id: root 9 + 10 + property color colBase: "#232a2e" 11 + property color colText: "#f8f9e8" 12 + property color colOverlay: "#58686d" 13 + property color colAccent: "#cbe3b3" 14 + property color colSecond: "#f5d098" 15 + 16 + property string fontFamily: "Maple Mono NF" 17 + property int fontSize: 14 18 + 19 + property int wmWSC 20 + property int wmWSA 21 + 22 + LazyLoader { 23 + active: true 24 + component: Niri {} 25 + } 26 + 27 + LazyLoader { 28 + active: true 29 + component: Bar {} 30 + } 31 + }
+5
external/gitmessage.txt
··· 1 + 2 + # Co-authored-by: user <user at users.noreply.github.com> 3 + # Signed-off-by: june <me at koi.rip> 4 + # Reviewed-by: june <me at koi.rip> 5 + # Reviewed-on:
+1
external/npmrc
··· 1 + store-dir=/tmp/node_modules
+28
external/rofi-evergarden.rasi
··· 1 + * { 2 + rosewater: #f6cee5; 3 + flamingo:#f6cee5; 4 + pink: #f3c0e5; 5 + mauve: #d2bdf3; 6 + red: #f57f82; 7 + maroon: #f57f82; 8 + peach: #f7a182; 9 + yellow: #f5d098; 10 + green: #cbe3b3; 11 + teal: #b3e3ca; 12 + sky: #b3e6db; 13 + sapphire: #afd9e6; 14 + blue: #b2caed; 15 + lavender: #b2caed; 16 + text: #f8f9e8; 17 + subtext1: #adc9bc; 18 + subtext0: #96b4aa; 19 + overlay2: #839e9a; 20 + overlay1: #6f8788; 21 + overlay0: #58686d; 22 + surface2: #4a585c; 23 + surface1: #374145; 24 + surface0: #2B3337; 25 + base: #232A2E; 26 + mantle: #1C2225; 27 + crust: #171c1f; 28 + }
+51
external/scripts/nix-shell-generate.sh
··· 1 + #! /usr/bin/env bash 2 + 3 + # Copyright (c) 2025 Sebaguardian 4 + 5 + set -euo pipefail 6 + 7 + nix-shell-generate() { 8 + local filename=${filename:-shell.nix} 9 + 10 + if [[ -e $filename ]]; then 11 + echo "$filename already exists" 12 + return 1 13 + fi 14 + 15 + head -c -1 >"$filename" <<'EOF' 16 + { 17 + pkgs ? import <nixpkgs> { }, 18 + }: 19 + let 20 + packages = with pkgs; [ 21 + EOF 22 + 23 + if [[ $# -eq 0 ]]; then 24 + echo -n ' ]' >>"$filename" 25 + else 26 + { 27 + echo 28 + for pkg in "$@"; do 29 + echo " $pkg" 30 + done 31 + echo -n " ]" 32 + } >>"$filename" 33 + fi 34 + 35 + cat >>"$filename" <<'EOF' 36 + ; 37 + in 38 + pkgs.mkShellNoCC { 39 + inherit packages; 40 + shellHook = '' 41 + echo -ne "-----------------------------------\n " 42 + echo -n "${toString (map (pkg: "• ${pkg.name}\n") packages)}" 43 + echo "-----------------------------------" 44 + ''; 45 + } 46 + EOF 47 + 48 + echo "$filename generated" 49 + } 50 + 51 + nix-shell-generate "$@"
+6
external/scripts/shreddir.sh
··· 1 + #! /usr/bin/env bash 2 + 3 + set -euo pipefail 4 + 5 + find "$1" -type f -exec shred -uvz {} \; 6 + rm -rf "$1"
+102
external/userChrome.css
··· 1 + :root { 2 + --v-red: #F57F82; 3 + --v-orange: #F7A182; 4 + --v-yellow: #F5D098; 5 + --v-lime: #DBE6AF; 6 + --v-green: #CBE3B3; 7 + --v-aqua: #B3E3CA; 8 + --v-skye: #B3E6DB; 9 + --v-snow: #AFD9E6; 10 + --v-blue: #B2CAED; 11 + --v-purple: #D2BDF3; 12 + --v-pink: #F3C0E5; 13 + --v-cherry: #F6CEE5; 14 + --v-text: #F8F9E8; 15 + --v-subtext1: #ADC9BC; 16 + --v-subtext0: #96B4AA; 17 + --v-overlay2: #839E9A; 18 + --v-overlay1: #6F8788; 19 + --v-overlay0: #58686D; 20 + --v-surface2: #4A585C; 21 + --v-surface1: #374145; 22 + --v-surface0: #2B3337; 23 + --v-base: #232A2E; 24 + --v-mantle: #1C2225; 25 + --v-crust: #171C1F; 26 + } 27 + 28 + :root, 29 + body { 30 + --zen-primary-color: var(--v-mantle) !important; 31 + --zen-main-browser-background: var(--v-mantle) !important; 32 + --zen-toolbar-element-bg: var(--v-surface0) !important; 33 + 34 + --tab-selected-bgcolor: var(--v-surface1) !important; 35 + --toolbox-textcolor: var(--v-text) !important; 36 + --sidebar-text-color: var(--v-overlay2) !important; 37 + --toolbarbutton-icon-fill: var(--v-overlay1) !important; 38 + 39 + --zen-toolbar-element-bg: var(--v-surface0) !important; 40 + 41 + --toolbar-field-focus-color: var(--v-overlay1) !important; 42 + } 43 + 44 + /* transparent bg */ 45 + /* #zen-main-app-wrapper { */ 46 + /* background: transparent !important; */ 47 + /* --zen-background-opacity: 0.9; */ 48 + /* } */ 49 + 50 + /* &::after { */ 51 + /* background: color-mix(in hsl, var(--zen-main-browser-background), transparent 10%); */ 52 + /* opacity: var(); */ 53 + /* transition: 0s; */ 54 + /* } */ 55 + 56 + #zen-browser-background { 57 + &::after { 58 + background: var(--v-base) !important; 59 + } 60 + } 61 + 62 + .tabbrowser-tab { 63 + --tab-selected-bgcolor: var(--v-surface1) !important; 64 + } 65 + 66 + ::selection { 67 + background: var(--v-surface1) !important; 68 + } 69 + 70 + label.toolbarbutton-text { 71 + color: var(--v-overlay1) !important; 72 + } 73 + 74 + label.zen-current-workspace-indicator-name { 75 + color: var(--v-subtext1) !important; 76 + } 77 + 78 + #urlbar { 79 + --urlbarView-separator-color: var(--v-overlay0) !important; 80 + 81 + &[breakout-extend="true"] .urlbar-background { 82 + --zen-urlbar-background-base: var(--v-mantle) !important; 83 + 84 + background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important; 85 + border-color: var(--urlbarView-separator-color) !important; 86 + backdrop-filter: blur(10px) !important; 87 + } 88 + } 89 + 90 + .urlbar-input { 91 + color: var(--v-text) !important; 92 + 93 + /* FIXME */ 94 + * { 95 + color: var(--v-overlay1) !important; 96 + opacity: 1 !important; 97 + } 98 + } 99 + 100 + .urlbarView-row[selected] { 101 + --zen-selected-bg: var(--v-surface1) !important; 102 + }
+3
external/wallpaper.png
··· 1 + version https://git-lfs.github.com/spec/v1 2 + oid sha256:7208b55d3807f307348d98c65aee4f2268970a791d0defdade160d055b1c4edd 3 + size 33631399
+29
external/zsh/functions.zsh
··· 1 + function nixos-rebuild() { 2 + # https://github.com/NixOS/nixpkgs/issues/275018 3 + doas /run/current-system/sw/bin/nixos-rebuild --no-reexec --flake "$HOME/dotfiles#$(hostname)" --log-format internal-json -v "$@" |& nom --json 4 + } 5 + 6 + function nixos-rebuild-seber() { 7 + # https://github.com/NixOS/nixpkgs/issues/275018 8 + /run/current-system/sw/bin/nixos-rebuild --no-reexec --flake "$HOME/dotfiles#seber" --log-format internal-json -v --sudo --target-host seber "$@" |& nom --json 9 + } 10 + 11 + function nixpkgs-build() { 12 + nix-build -E "with import <nixpkgs> {}; callPackage ./$1 {}" --log-format internal-json -v |& nom --json 13 + } 14 + 15 + function nixpkgs-review-gha() { 16 + gh workflow run 'review.yml' -R "$(gh api user --jq '.login')/nixpkgs-review-gha" -f pr="$1" 17 + } 18 + 19 + function cd() { 20 + { z "$@" 2>/dev/null && eza --no-quotes --group-directories-first --icons=auto; } || { 21 + echo "dir \e[91m$*\e[0m not found!! \e[91mSTUPID! BONK!\e[0m :3" 22 + return 1 23 + } 24 + } 25 + 26 + function command_not_found_handler() { 27 + echo "command \e[91m$1\e[0m not found!! \e[91mSTUPID! BONK!\e[0m :3" 28 + return 127 29 + }
+20
external/zsh/keymap.zsh
··· 1 + autoload -Uz select-word-style 2 + select-word-style bash 3 + 4 + bindkey '^[[1;5D' backward-word 5 + bindkey '^[[1;5C' forward-word 6 + 7 + stty -ixon # disable flow control to avoid conflicts 8 + bindkey '^R' history-incremental-search-backward 9 + bindkey '^S' history-incremental-search-forward 10 + 11 + bindkey '^W' backward-kill-word 12 + bindkey '^D' kill-word 13 + 14 + bindkey '^U' backward-kill-line 15 + bindkey '^K' kill-line 16 + 17 + bindkey '^[[H' beginning-of-line 18 + bindkey '^[[F' end-of-line 19 + 20 + bindkey '^[[3~' delete-char
+8
external/zsh/profile.zsh
··· 1 + if [ -z "$WAYLAND_DISPLAY" ] && [ "$XDG_VTNR" = 1 ]; then 2 + systemctl --user start jellyfin-rpc.service & 3 + exec niri-session 4 + fi 5 + 6 + if [ -z "$KITTY_WINDOW_ID" ]; then 7 + export FF_NO_KITGET=1 8 + fi
+78
external/zsh/prompt.zsh
··· 1 + export LS_COLORS=$(/run/current-system/sw/bin/dircolors -b) 2 + zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} 3 + zstyle ':completion:*' menu select 4 + zstyle ':completion:*' list-dirs-first true 5 + zstyle ':completion:*' group-name '' 6 + zstyle ':completion:*:matches' group 'yes' 7 + 8 + autoload -Uz vcs_info 9 + 10 + setopt nopromptsubst 11 + 12 + local accent=$'\e[0;38;2;203;227;179m' 13 + local dim=$'\e[2m' 14 + local reset=$'\e[0m' 15 + local newline=$'\n' 16 + 17 + 18 + zstyle ':vcs_info:git*' hooks git-strip-heads 19 + function +vi-git-strip-heads() { 20 + hook_com[branch]=${hook_com[branch]#heads/} 21 + } 22 + 23 + zstyle ':vcs_info:*' formats "${dim}%s( ${accent}%b${reset}${dim} )" 24 + zstyle ':vcs_info:*' actionformats "${dim}%s( ${accent}%b${reset} | ${accent}%a${reset}${dim} )" 25 + zstyle ':vcs_info:*' enable git 26 + 27 + function precmd() { 28 + local last_status=$? 29 + local last_command=$(fc -ln -1 | awk '{print $1}') 30 + 31 + vcs_info 32 + 33 + local cwd="${PWD/#$HOME/~}" 34 + 35 + if [[ "${cwd:0:1}" == '/' ]]; then 36 + cwd="${accent}/${${cwd:1}//\//${reset} ${dim}» ${accent}}" 37 + elif [[ "${cwd:0:2}" == '~/' ]]; then 38 + cwd="${${cwd:2}//\//${reset} ${dim}» ${accent}}" 39 + else 40 + cwd="${${cwd//\//${reset} ${dim}» ${accent}}}" 41 + fi 42 + 43 + cwd="${accent}${cwd}${reset}" 44 + 45 + local baseprompt="${reset}${dim}%n${reset}${accent}@${reset}${dim}%m${reset}:${accent}%l${reset} ${dim}->${reset} ${cwd} ${dim}(${reset}%?${dim})${reset}${newline}" 46 + 47 + if [[ "$last_command" == 'car' || "$last_command" == 'cat' || "$last_command" == 'head' || "$last_command" == 'tail' || "$last_command" == 'tac' || "$last_command" == 'nc' || "$last_command" == 'ncat' || "$last_command" == 'netcat' || "$last_command" == 'kitget' ]]; then 48 + baseprompt+='😻' 49 + elif [[ "$last_command" == 'doas' || "$last_command" == 'sudo' ]]; then 50 + baseprompt+='🙀' 51 + elif (( last_status == 0 )); then 52 + baseprompt+='😺' 53 + else 54 + baseprompt+='😿' 55 + fi 56 + 57 + baseprompt+=' ' 58 + 59 + if [[ -n "$IN_NIX_SHELL" ]]; then 60 + local nix_shell="${accent}󱄅 ${reset}" 61 + fi 62 + 63 + if [[ -z "$vcs_info_msg_0_" ]]; then 64 + if [[ -n "$nix_shell" ]]; then 65 + PROMPT="${nix_shell}${newline}${baseprompt}" 66 + else 67 + PROMPT="${baseprompt}" 68 + fi 69 + elif [[ -n "$(git diff --cached --name-status 2>/dev/null)" ]]; then 70 + PROMPT="${vcs_info_msg_0_}${reset} COMMIT ${nix_shell} ${newline}${baseprompt}" 71 + elif [[ -n "$(git diff --name-status 2>/dev/null)" ]]; then 72 + PROMPT="${vcs_info_msg_0_}${reset} DIRTY ${nix_shell} ${newline}${baseprompt}" 73 + else 74 + PROMPT="${vcs_info_msg_0_} ${nix_shell}${newline}${baseprompt}" 75 + fi 76 + 77 + printf '\e[5 q' 78 + }
+421
flake.lock
··· 1 + { 2 + "nodes": { 3 + "agenix": { 4 + "inputs": { 5 + "darwin": "darwin", 6 + "home-manager": [ 7 + "home-manager" 8 + ], 9 + "nixpkgs": [ 10 + "nixpkgs" 11 + ], 12 + "systems": [ 13 + "systems" 14 + ] 15 + }, 16 + "locked": { 17 + "lastModified": 1770165109, 18 + "narHash": "sha256-9VnK6Oqai65puVJ4WYtCTvlJeXxMzAp/69HhQuTdl/I=", 19 + "owner": "ryantm", 20 + "repo": "agenix", 21 + "rev": "b027ee29d959fda4b60b57566d64c98a202e0feb", 22 + "type": "github" 23 + }, 24 + "original": { 25 + "owner": "ryantm", 26 + "repo": "agenix", 27 + "type": "github" 28 + } 29 + }, 30 + "anvim": { 31 + "inputs": { 32 + "gift-wrap": "gift-wrap", 33 + "neovim-nightly": "neovim-nightly", 34 + "nixpkgs": [ 35 + "nixpkgs" 36 + ] 37 + }, 38 + "locked": { 39 + "lastModified": 1777994114, 40 + "narHash": "sha256-jQrssvnw5k0qjd0jVSOOtCGini7vkjwtKweHWEfEwmI=", 41 + "ref": "refs/heads/main", 42 + "rev": "095b7a6028b1f0e640aea666e5e76e01a7dfd7bb", 43 + "revCount": 74, 44 + "type": "git", 45 + "url": "https://git.koi.rip/koi/anvim" 46 + }, 47 + "original": { 48 + "type": "git", 49 + "url": "https://git.koi.rip/koi/anvim" 50 + } 51 + }, 52 + "cuteff": { 53 + "inputs": { 54 + "nixpkgs": [ 55 + "nixpkgs" 56 + ] 57 + }, 58 + "locked": { 59 + "lastModified": 1768947991, 60 + "narHash": "sha256-Eg/0qQccLKXaFHhKCd8gJ/ZdxCSNcWhj31SAdl76bL8=", 61 + "ref": "refs/heads/main", 62 + "rev": "11a4d1eada9f983f44f2ca7ee37a22da72a3a7e4", 63 + "revCount": 13, 64 + "type": "git", 65 + "url": "https://codeberg.org/koibtw/cuteff" 66 + }, 67 + "original": { 68 + "type": "git", 69 + "url": "https://codeberg.org/koibtw/cuteff" 70 + } 71 + }, 72 + "darwin": { 73 + "inputs": { 74 + "nixpkgs": [ 75 + "agenix", 76 + "nixpkgs" 77 + ] 78 + }, 79 + "locked": { 80 + "lastModified": 1744478979, 81 + "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=", 82 + "owner": "lnl7", 83 + "repo": "nix-darwin", 84 + "rev": "43975d782b418ebf4969e9ccba82466728c2851b", 85 + "type": "github" 86 + }, 87 + "original": { 88 + "owner": "lnl7", 89 + "ref": "master", 90 + "repo": "nix-darwin", 91 + "type": "github" 92 + } 93 + }, 94 + "evergarden": { 95 + "inputs": { 96 + "nixpkgs": [ 97 + "nixpkgs" 98 + ] 99 + }, 100 + "locked": { 101 + "lastModified": 1774196652, 102 + "narHash": "sha256-zC5ZWLdLpQr4AuBqCXG4jWN8f0hVNqvSIQZj7z8cX3Q=", 103 + "ref": "refs/heads/main", 104 + "rev": "62b778dbdffc0fc7a9506ac891c8a8ea688b6ab8", 105 + "revCount": 81, 106 + "type": "git", 107 + "url": "https://codeberg.org/evergarden/nix" 108 + }, 109 + "original": { 110 + "type": "git", 111 + "url": "https://codeberg.org/evergarden/nix" 112 + } 113 + }, 114 + "flake-parts": { 115 + "inputs": { 116 + "nixpkgs-lib": [ 117 + "anvim", 118 + "neovim-nightly", 119 + "nixpkgs" 120 + ] 121 + }, 122 + "locked": { 123 + "lastModified": 1772408722, 124 + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", 125 + "owner": "hercules-ci", 126 + "repo": "flake-parts", 127 + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", 128 + "type": "github" 129 + }, 130 + "original": { 131 + "owner": "hercules-ci", 132 + "repo": "flake-parts", 133 + "type": "github" 134 + } 135 + }, 136 + "gift-wrap": { 137 + "inputs": { 138 + "nixpkgs": [ 139 + "anvim", 140 + "nixpkgs" 141 + ] 142 + }, 143 + "locked": { 144 + "lastModified": 1773403464, 145 + "narHash": "sha256-fckT48WShz/HqRgHgBKbVZCreC+Apfu3UqPZxFuL7Us=", 146 + "owner": "tgirlcloud", 147 + "repo": "gift-wrap", 148 + "rev": "9499bc6e450d9959e2019f7122efd3b9077f333a", 149 + "type": "github" 150 + }, 151 + "original": { 152 + "owner": "tgirlcloud", 153 + "repo": "gift-wrap", 154 + "type": "github" 155 + } 156 + }, 157 + "home-manager": { 158 + "inputs": { 159 + "nixpkgs": [ 160 + "nixpkgs" 161 + ] 162 + }, 163 + "locked": { 164 + "lastModified": 1776777932, 165 + "narHash": "sha256-0R3Yow/NzSeVGUke5tL7CCkqmss4Vmi6BbV6idHzq/8=", 166 + "owner": "nix-community", 167 + "repo": "home-manager", 168 + "rev": "5d5640599a0050b994330328b9fd45709c909720", 169 + "type": "github" 170 + }, 171 + "original": { 172 + "owner": "nix-community", 173 + "repo": "home-manager", 174 + "type": "github" 175 + } 176 + }, 177 + "neovim-nightly": { 178 + "inputs": { 179 + "flake-parts": "flake-parts", 180 + "neovim-src": "neovim-src", 181 + "nixpkgs": [ 182 + "anvim", 183 + "nixpkgs" 184 + ] 185 + }, 186 + "locked": { 187 + "lastModified": 1774224385, 188 + "narHash": "sha256-VQPMdAUOhDqb6AUAn6oQYPvU2DVGHIc3iRdAHlDhSHQ=", 189 + "owner": "nix-community", 190 + "repo": "neovim-nightly-overlay", 191 + "rev": "701c0a6174fde5de4b9424c0d1e5a4306b73baac", 192 + "type": "github" 193 + }, 194 + "original": { 195 + "owner": "nix-community", 196 + "repo": "neovim-nightly-overlay", 197 + "type": "github" 198 + } 199 + }, 200 + "neovim-src": { 201 + "flake": false, 202 + "locked": { 203 + "lastModified": 1774221289, 204 + "narHash": "sha256-nxFkSVa268w237r0i0xxCpzyIVtfXocm1xI+vsjJlgo=", 205 + "owner": "neovim", 206 + "repo": "neovim", 207 + "rev": "6cd1fe9a66947511f59226d51dd70197d80513e5", 208 + "type": "github" 209 + }, 210 + "original": { 211 + "owner": "neovim", 212 + "repo": "neovim", 213 + "type": "github" 214 + } 215 + }, 216 + "niri": { 217 + "inputs": { 218 + "niri-stable": "niri-stable", 219 + "niri-unstable": "niri-unstable", 220 + "nixpkgs": [ 221 + "nixpkgs" 222 + ], 223 + "nixpkgs-stable": [ 224 + "nixpkgs" 225 + ], 226 + "xwayland-satellite-stable": "xwayland-satellite-stable", 227 + "xwayland-satellite-unstable": "xwayland-satellite-unstable" 228 + }, 229 + "locked": { 230 + "lastModified": 1776805172, 231 + "narHash": "sha256-5xA2D+iOEMoKBcTSbQe8Ztao5APX7C3eVeiFAdCg3WM=", 232 + "owner": "sodiboo", 233 + "repo": "niri-flake", 234 + "rev": "035f8ef8a0a5ec8f226231b15e84ebd88a81b1f3", 235 + "type": "github" 236 + }, 237 + "original": { 238 + "owner": "sodiboo", 239 + "repo": "niri-flake", 240 + "type": "github" 241 + } 242 + }, 243 + "niri-stable": { 244 + "flake": false, 245 + "locked": { 246 + "lastModified": 1756556321, 247 + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", 248 + "owner": "YaLTeR", 249 + "repo": "niri", 250 + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", 251 + "type": "github" 252 + }, 253 + "original": { 254 + "owner": "YaLTeR", 255 + "ref": "v25.08", 256 + "repo": "niri", 257 + "type": "github" 258 + } 259 + }, 260 + "niri-unstable": { 261 + "flake": false, 262 + "locked": { 263 + "lastModified": 1776800113, 264 + "narHash": "sha256-8UFcj0LV4zZ0gTX96LlbzpmBfYkoXsfb3ETg7GeRup8=", 265 + "owner": "YaLTeR", 266 + "repo": "niri", 267 + "rev": "e472b5b0f13d91fdf0e5d07551f68177d25043d0", 268 + "type": "github" 269 + }, 270 + "original": { 271 + "owner": "YaLTeR", 272 + "repo": "niri", 273 + "type": "github" 274 + } 275 + }, 276 + "nixpkgs": { 277 + "locked": { 278 + "lastModified": 1776548001, 279 + "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", 280 + "owner": "NixOS", 281 + "repo": "nixpkgs", 282 + "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", 283 + "type": "github" 284 + }, 285 + "original": { 286 + "id": "nixpkgs", 287 + "ref": "nixos-unstable", 288 + "type": "indirect" 289 + } 290 + }, 291 + "root": { 292 + "inputs": { 293 + "agenix": "agenix", 294 + "anvim": "anvim", 295 + "cuteff": "cuteff", 296 + "evergarden": "evergarden", 297 + "home-manager": "home-manager", 298 + "niri": "niri", 299 + "nixpkgs": "nixpkgs", 300 + "seberjune": "seberjune", 301 + "systems": "systems", 302 + "tranquil-pds": "tranquil-pds", 303 + "zen-browser": "zen-browser" 304 + } 305 + }, 306 + "seberjune": { 307 + "inputs": { 308 + "nixpkgs": [ 309 + "nixpkgs" 310 + ] 311 + }, 312 + "locked": { 313 + "lastModified": 1777057922, 314 + "narHash": "sha256-6QyxavCNjCh00q2XqzvEjG9m5RrRLsItoo9HTTzy770=", 315 + "ref": "refs/heads/main", 316 + "rev": "b702e63bc6b5cc840d37b95e00f9f283ae6bde28", 317 + "revCount": 4, 318 + "type": "git", 319 + "url": "https://git.koi.rip/koi/seberjune.git" 320 + }, 321 + "original": { 322 + "type": "git", 323 + "url": "https://git.koi.rip/koi/seberjune.git" 324 + } 325 + }, 326 + "systems": { 327 + "locked": { 328 + "lastModified": 1681028828, 329 + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 330 + "owner": "nix-systems", 331 + "repo": "default", 332 + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 333 + "type": "github" 334 + }, 335 + "original": { 336 + "owner": "nix-systems", 337 + "repo": "default", 338 + "type": "github" 339 + } 340 + }, 341 + "tranquil-pds": { 342 + "inputs": { 343 + "nixpkgs": [ 344 + "nixpkgs" 345 + ] 346 + }, 347 + "locked": { 348 + "lastModified": 1776798264, 349 + "narHash": "sha256-s/lazn7Ykfpx8dHKUwQXADu6okDDHfFqnLenb8hT7AY=", 350 + "ref": "refs/heads/main", 351 + "rev": "00c9eb732f0410b4411d295d6e19ad79d63d60d8", 352 + "revCount": 318, 353 + "type": "git", 354 + "url": "https://tangled.org/did:web:tranquil.tranquil.farm/tranquil-pds" 355 + }, 356 + "original": { 357 + "type": "git", 358 + "url": "https://tangled.org/did:web:tranquil.tranquil.farm/tranquil-pds" 359 + } 360 + }, 361 + "xwayland-satellite-stable": { 362 + "flake": false, 363 + "locked": { 364 + "lastModified": 1755491097, 365 + "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=", 366 + "owner": "Supreeeme", 367 + "repo": "xwayland-satellite", 368 + "rev": "388d291e82ffbc73be18169d39470f340707edaa", 369 + "type": "github" 370 + }, 371 + "original": { 372 + "owner": "Supreeeme", 373 + "ref": "v0.7", 374 + "repo": "xwayland-satellite", 375 + "type": "github" 376 + } 377 + }, 378 + "xwayland-satellite-unstable": { 379 + "flake": false, 380 + "locked": { 381 + "lastModified": 1773622265, 382 + "narHash": "sha256-wToKwH7IgWdGLMSIWksEDs4eumR6UbbsuPQ42r0oTXQ=", 383 + "owner": "Supreeeme", 384 + "repo": "xwayland-satellite", 385 + "rev": "a879e5e0896a326adc79c474bf457b8b99011027", 386 + "type": "github" 387 + }, 388 + "original": { 389 + "owner": "Supreeeme", 390 + "repo": "xwayland-satellite", 391 + "type": "github" 392 + } 393 + }, 394 + "zen-browser": { 395 + "inputs": { 396 + "home-manager": [ 397 + "home-manager" 398 + ], 399 + "nixpkgs": [ 400 + "nixpkgs" 401 + ] 402 + }, 403 + "locked": { 404 + "lastModified": 1775699406, 405 + "narHash": "sha256-YpDALorsidLjSyS5ozvsNI7Gz/bkmDs/ls/9oHKPv40=", 406 + "owner": "0xc000022070", 407 + "repo": "zen-browser-flake", 408 + "rev": "b05c87c1a474cdd6979a4e5f7058edf4073554df", 409 + "type": "github" 410 + }, 411 + "original": { 412 + "owner": "0xc000022070", 413 + "ref": "beta", 414 + "repo": "zen-browser-flake", 415 + "type": "github" 416 + } 417 + } 418 + }, 419 + "root": "root", 420 + "version": 7 421 + }
+92
flake.nix
··· 1 + { 2 + description = "my nixos dotfiles :3"; 3 + 4 + inputs = { 5 + nixpkgs.url = "nixpkgs/nixos-unstable"; 6 + systems.url = "github:nix-systems/default"; 7 + 8 + home-manager = { 9 + url = "github:nix-community/home-manager"; 10 + inputs.nixpkgs.follows = "nixpkgs"; 11 + }; 12 + 13 + anvim = { 14 + url = "git+https://git.koi.rip/koi/anvim"; 15 + inputs.nixpkgs.follows = "nixpkgs"; 16 + }; 17 + 18 + cuteff = { 19 + url = "git+https://codeberg.org/koibtw/cuteff"; 20 + inputs.nixpkgs.follows = "nixpkgs"; 21 + }; 22 + 23 + seberjune = { 24 + url = "git+https://git.koi.rip/koi/seberjune.git"; 25 + inputs.nixpkgs.follows = "nixpkgs"; 26 + }; 27 + 28 + evergarden = { 29 + url = "git+https://codeberg.org/evergarden/nix"; 30 + inputs.nixpkgs.follows = "nixpkgs"; 31 + }; 32 + 33 + niri = { 34 + url = "github:sodiboo/niri-flake"; 35 + inputs = { 36 + nixpkgs.follows = "nixpkgs"; 37 + nixpkgs-stable.follows = "nixpkgs"; 38 + }; 39 + }; 40 + 41 + zen-browser = { 42 + url = "github:0xc000022070/zen-browser-flake/beta"; 43 + inputs = { 44 + nixpkgs.follows = "nixpkgs"; 45 + home-manager.follows = "home-manager"; 46 + }; 47 + }; 48 + 49 + tranquil-pds = { 50 + url = "git+https://tangled.org/did:web:tranquil.tranquil.farm/tranquil-pds"; 51 + inputs.nixpkgs.follows = "nixpkgs"; 52 + }; 53 + 54 + agenix = { 55 + url = "github:ryantm/agenix"; 56 + inputs = { 57 + nixpkgs.follows = "nixpkgs"; 58 + systems.follows = "systems"; 59 + home-manager.follows = "home-manager"; 60 + }; 61 + }; 62 + }; 63 + 64 + outputs = 65 + { self, nixpkgs, ... }@inputs: 66 + let 67 + inherit (nixpkgs) lib; 68 + system = "x86_64-linux"; 69 + 70 + mkHost = 71 + name: extraModules: 72 + lib.nixosSystem { 73 + specialArgs = { inherit inputs; }; 74 + modules = [ 75 + ./modules/base 76 + ./systems/${name} 77 + ] 78 + ++ extraModules; 79 + }; 80 + 81 + mkDesktopHost = name: mkHost name [ ./modules/desktop ]; 82 + in 83 + { 84 + nixosConfigurations = { 85 + miku = mkDesktopHost "miku"; 86 + teto = mkDesktopHost "teto"; 87 + seber = mkHost "seber" [ ]; 88 + }; 89 + 90 + formatter.${system} = nixpkgs.legacyPackages.${system}.callPackage ./formatter.nix { }; 91 + }; 92 + }
+65
formatter.nix
··· 1 + { 2 + treefmt, 3 + nixfmt, 4 + js-beautify, 5 + shfmt, 6 + kdePackages, 7 + }: 8 + 9 + treefmt.withConfig { 10 + runtimeInputs = [ 11 + nixfmt 12 + js-beautify 13 + shfmt 14 + kdePackages.qtdeclarative 15 + ]; 16 + 17 + settings = { 18 + on-unmatched = "info"; 19 + tree-root-file = "flake.nix"; 20 + 21 + formatter = { 22 + nixfmt = { 23 + command = "nixfmt"; 24 + includes = [ "*.nix" ]; 25 + }; 26 + 27 + js-beautify = { 28 + command = "js-beautify"; 29 + options = [ 30 + "--replace" 31 + "--editorconfig" 32 + "--jslint-happy" 33 + "--max-preserve-newlines" 34 + "2" 35 + ]; 36 + includes = [ 37 + "*.js" 38 + "*.mjs" 39 + "*.css" 40 + ]; 41 + }; 42 + 43 + shfmt = { 44 + command = "shfmt"; 45 + options = [ "-w" ]; 46 + includes = [ 47 + "*.sh" 48 + "*.bash" 49 + # "*.zsh" # https://github.com/mvdan/sh/issues/120 50 + ]; 51 + }; 52 + 53 + qmlformat = { 54 + command = "qmlformat"; 55 + options = [ 56 + "--inplace" 57 + "--sort-imports" 58 + "--indent-width" 59 + "2" 60 + ]; 61 + includes = [ "*.qml" ]; 62 + }; 63 + }; 64 + }; 65 + }
+26
home/koi.nix
··· 1 + { inputs, ... }: 2 + { 3 + home = { 4 + username = "koi"; 5 + homeDirectory = "/home/koi"; 6 + stateVersion = "26.05"; 7 + }; 8 + 9 + imports = [ 10 + ./modules/external.nix 11 + ./modules/xdg.nix 12 + ./modules/age.nix 13 + ./modules/theme.nix 14 + ./modules/packages.nix 15 + ./modules/wallpaper.nix 16 + ./modules/programs 17 + 18 + inputs.evergarden.homeManagerModules.default 19 + ]; 20 + 21 + evergarden = { 22 + enable = false; 23 + variant = "fall"; 24 + accent = "green"; 25 + }; 26 + }
+7
home/modules/age.nix
··· 1 + { config, inputs, ... }: 2 + 3 + { 4 + imports = [ inputs.agenix.homeManagerModules.default ]; 5 + 6 + age.identityPaths = [ "${config.home.homeDirectory}/.ssh/id_ed25519" ]; 7 + }
+36
home/modules/external.nix
··· 1 + let 2 + configs = ../../external/config; 3 + scripts = ../../external/scripts; 4 + cargoConfig = ../../external/cargo.toml; 5 + npmConfig = ../../external/npmrc; 6 + in 7 + { 8 + home.file = builtins.listToAttrs ( 9 + map (name: { 10 + name = ".local/bin/${builtins.replaceStrings [ ".sh" ] [ "" ] name}"; 11 + value = { 12 + source = scripts + "/${name}"; 13 + executable = true; 14 + }; 15 + }) (builtins.attrNames (builtins.readDir scripts)) 16 + ++ [ 17 + { 18 + name = ".cargo/config.toml"; 19 + value = { 20 + source = cargoConfig; 21 + }; 22 + } 23 + { 24 + name = ".npmrc"; 25 + value = { 26 + source = npmConfig; 27 + }; 28 + } 29 + ] 30 + ); 31 + 32 + xdg.configFile = builtins.mapAttrs (name: _: { 33 + source = configs + "/${name}"; 34 + recursive = true; 35 + }) (builtins.readDir configs); 36 + }
+25
home/modules/packages.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + home.packages = with pkgs; [ 5 + nix-output-monitor 6 + jellyfin-desktop 7 + jellyfin-tui 8 + prettyping 9 + playerctl 10 + jq 11 + gh 12 + codeberg-cli 13 + 14 + signal-desktop 15 + 16 + noto-fonts 17 + noto-fonts-cjk-sans 18 + noto-fonts-color-emoji 19 + maple-mono.NF 20 + 21 + wl-clipboard 22 + 23 + kitget 24 + ]; 25 + }
+203
home/modules/programs/aerc.nix
··· 1 + { config, ... }: 2 + { 3 + age.secrets = { 4 + email-pass-me.file = ../../../secrets/email-pass-me.age; 5 + email-pass-noreply.file = ../../../secrets/email-pass-noreply.age; 6 + }; 7 + 8 + evergarden.aerc.enable = true; 9 + 10 + programs.aerc = { 11 + enable = true; 12 + extraConfig = { 13 + general = { 14 + pgp-provider = "gpg"; 15 + use-terminal-pinentry = true; 16 + unsafe-accounts-conf = true; 17 + }; 18 + viewer.pager = "less --tilde -c"; 19 + filters = { 20 + "text/plain" = "colorize"; 21 + "text/html" = "html | colorize"; 22 + ".headers" = "colorize"; 23 + "message/delivery-status" = "colorize"; 24 + }; 25 + ui.threading-enabled = true; 26 + }; 27 + extraAccounts = { 28 + june = { 29 + from = "june <me@koi.rip>"; 30 + copy-to = "Sent"; 31 + cache-headers = true; 32 + pgp-auto-sign = true; 33 + pgp-self-encrypt = true; 34 + pgp-key-id = "00F61623FB56BC5BB7094E634CE6C1172DF6BE79"; 35 + source = "imaps://me%40koi.rip@imap.purelymail.com:993"; 36 + outgoing = "smtps://me%40koi.rip@smtp.purelymail.com:465"; 37 + source-cred-cmd = "cat ${config.age.secrets.email-pass-me.path}"; 38 + outgoing-cred-cmd = "cat ${config.age.secrets.email-pass-me.path}"; 39 + }; 40 + noreply = { 41 + from = "noreply@koi.rip"; 42 + cache-headers = true; 43 + source = "imaps://noreply%40koi.rip@imap.purelymail.com:993"; 44 + outgoing = "smtps://noreply%40koi.rip@smtp.purelymail.com:465"; 45 + source-cred-cmd = "cat ${config.age.secrets.email-pass-noreply.path}"; 46 + outgoing-cred-cmd = "cat ${config.age.secrets.email-pass-noreply.path}"; 47 + }; 48 + }; 49 + extraBinds = { 50 + messages = { 51 + q = ":prompt 'quit?' quit<Enter>"; 52 + e = ":next<Enter>"; 53 + i = ":prev<Enter>"; 54 + "<Down>" = ":next<Enter>"; 55 + "<Up>" = ":prev<Enter>"; 56 + "<PgDn>" = ":next 100%<Enter>"; 57 + "<PgUp>" = ":prev 100%<Enter>"; 58 + N = ":collapse-folder<Enter>"; 59 + E = ":next-folder<Enter>"; 60 + I = ":prev-folder<Enter>"; 61 + O = ":expand-folder<Enter>"; 62 + "<C-Left>" = ":collapse-folder<Enter>"; 63 + "<C-Down>" = ":next-folder<Enter>"; 64 + "<C-Up>" = ":prev-folder<Enter>"; 65 + "<C-Right>" = ":expand-folder<Enter>"; 66 + k = ":next-result<Enter>"; 67 + K = ":prev-result<Enter>"; 68 + g = ":select 0<Enter>"; 69 + G = ":select -1<Enter>"; 70 + v = ":mark -t<Enter>"; 71 + V = ":mark -v<Enter>"; 72 + "<Space>" = ":mark -t<Enter>:next<Enter>"; 73 + T = ":toggle-threads<Enter>"; 74 + zc = ":fold<Enter>"; 75 + zo = ":unfold<Enter>"; 76 + za = ":fold -t<Enter>"; 77 + zM = ":fold -a<Enter>"; 78 + zR = ":unfold -a<Enter>"; 79 + "<Tab>" = ":fold -t<Enter>"; 80 + zz = ":align center<Enter>"; 81 + zt = ":align top<Enter>"; 82 + zb = ":align bottom<Enter>"; 83 + "<Enter>" = ":view<Enter>"; 84 + d = ":choose -o y 'delete' delete-message<Enter>"; 85 + D = ":delete<Enter>"; 86 + a = ":archive flat<Enter>"; 87 + A = ":unmark -a<Enter>:mark -T<Enter>:archive flat<Enter>"; 88 + C = ":compose<Enter>"; 89 + m = ":compose<Enter>"; 90 + b = ":bounce<space>"; 91 + rr = ":reply -a<Enter>"; 92 + rq = ":reply -aq<Enter>"; 93 + Rr = ":reply<Enter>"; 94 + Rq = ":reply -q<Enter>"; 95 + c = ":cf<space>"; 96 + "|" = ":pipe<space>"; 97 + "/" = ":search<space>"; 98 + "\\" = ":filter<space>"; 99 + "<Esc>" = ":clear<Enter>"; 100 + s = ":split<Enter>"; 101 + S = ":vsplit<Enter>"; 102 + pl = ":patch list<Enter>"; 103 + pa = ":patch apply <Tab>"; 104 + pd = ":patch drop <Tab>"; 105 + pb = ":patch rebase<Enter>"; 106 + pt = ":patch term<Enter>"; 107 + ps = ":patch switch <Tab>"; 108 + "<C-p>" = ":prev-tab<Enter>"; 109 + "<C-t>" = ":next-tab<Enter>"; 110 + "<C-PgUp>" = ":prev-tab<Enter>"; 111 + "<C-PgDn>" = ":next-tab<Enter>"; 112 + }; 113 + "messages:folder=Drafts" = { 114 + "<Enter>" = ":recall<Enter>"; 115 + }; 116 + view = { 117 + "/" = ":toggle-key-passthrough<Enter>/"; 118 + q = ":close<Enter>"; 119 + O = ":open<Enter>"; 120 + S = ":save<space>"; 121 + "|" = ":pipe<space>"; 122 + D = ":delete<Enter>"; 123 + A = ":archive flat<Enter>"; 124 + "<C-y>" = ":copy-link <space>"; 125 + "<C-l>" = ":open-link <space>"; 126 + f = ":forward<Enter>"; 127 + rr = ":reply -a<Enter>"; 128 + rq = ":reply -aq<Enter>"; 129 + Rr = ":reply<Enter>"; 130 + Rq = ":reply -q<Enter>"; 131 + H = ":toggle-headers<Enter>"; 132 + E = ":next<Enter>"; 133 + I = ":prev<Enter>"; 134 + "<C-Right>" = ":next<Enter>"; 135 + "<C-Left>" = ":prev<Enter>"; 136 + "<C-e>" = ":next-part<Enter>"; 137 + "<C-i>" = ":prev-part<Enter>"; 138 + "<C-Up>" = ":prev-part<Enter>"; 139 + "<C-Down>" = ":next-part<Enter>"; 140 + "<C-p>" = ":prev-tab<Enter>"; 141 + "<C-t>" = ":next-tab<Enter>"; 142 + "<C-PgUp>" = ":prev-tab<Enter>"; 143 + "<C-PgDn>" = ":next-tab<Enter>"; 144 + }; 145 + "view::passthrough" = { 146 + "$noinherit" = "true"; 147 + "$ex" = "<C-x>"; 148 + "<Esc>" = ":toggle-key-passthrough<Enter>"; 149 + }; 150 + compose = { 151 + "$noinherit" = "true"; 152 + "$ex" = "<C-x>"; 153 + "$complete" = "<Tab>"; 154 + "<C-e>" = ":next-field<Enter>"; 155 + "<C-i>" = ":prev-field<Enter>"; 156 + "<C-Up>" = ":prev-field<Enter>"; 157 + "<C-Down>" = ":next-field<Enter>"; 158 + "<A-p>" = ":switch-account -p<Enter>"; 159 + "<A-t>" = ":switch-account -n<Enter>"; 160 + "<C-Left>" = ":switch-account -p<Enter>"; 161 + "<C-Right>" = ":switch-account -n<Enter>"; 162 + "<Tab>" = ":next-field<Enter>"; 163 + "<Backtab>" = ":prev-field<Enter>"; 164 + "<C-p>" = ":prev-tab<Enter>"; 165 + "<C-t>" = ":next-tab<Enter>"; 166 + "<C-PgUp>" = ":prev-tab<Enter>"; 167 + "<C-PgDn>" = ":next-tab<Enter>"; 168 + }; 169 + "compose::editor" = { 170 + "$noinherit" = "true"; 171 + "$ex" = "<C-x>"; 172 + "<C-e>" = ":next-field<Enter>"; 173 + "<C-i>" = ":prev-field<Enter>"; 174 + "<C-Up>" = ":prev-field<Enter>"; 175 + "<C-Down>" = ":next-field<Enter>"; 176 + "<C-p>" = ":prev-tab<Enter>"; 177 + "<C-t>" = ":next-tab<Enter>"; 178 + "<C-PgUp>" = ":prev-tab<Enter>"; 179 + "<C-PgDn>" = ":next-tab<Enter>"; 180 + }; 181 + "compose::review" = { 182 + c = ":send<Enter>"; 183 + k = ":abort<Enter>"; 184 + s = ":sign<Enter>"; 185 + x = ":encrypt<Enter>"; 186 + v = ":preview<Enter>"; 187 + p = ":postpone<Enter>"; 188 + q = ":choose -o d discard abort -o p postpone postpone<Enter>"; 189 + f = ":edit<Enter>"; 190 + a = ":attach<space>"; 191 + d = ":detach<space>"; 192 + }; 193 + terminal = { 194 + "$noinherit" = "true"; 195 + "$ex" = "<C-x>"; 196 + "<C-p>" = ":prev-tab<Enter>"; 197 + "<C-t>" = ":next-tab<Enter>"; 198 + "<C-PgUp>" = ":prev-tab<Enter>"; 199 + "<C-PgDn>" = ":next-tab<Enter>"; 200 + }; 201 + }; 202 + }; 203 + }
+3
home/modules/programs/awww.nix
··· 1 + { 2 + services.awww.enable = true; 3 + }
+43
home/modules/programs/cuteff.nix
··· 1 + { inputs, ... }: 2 + 3 + { 4 + imports = [ inputs.cuteff.homeManagerModules.default ]; 5 + programs.cuteff = { 6 + enable = true; 7 + settings = { 8 + padding = 2; 9 + paddingTop = 1; 10 + paddingBottom = 1; 11 + 12 + colors = { 13 + "1" = "203;227;179"; 14 + "2" = "245;208;152"; 15 + }; 16 + 17 + headerCats = true; 18 + 19 + modules = [ 20 + { 21 + name = " user"; 22 + stat = "username"; 23 + } 24 + { 25 + name = " host"; 26 + stat = "hostname"; 27 + } 28 + { 29 + name = " uptime"; 30 + stat = "uptime"; 31 + } 32 + { 33 + name = " distro"; 34 + stat = "distro"; 35 + } 36 + { 37 + name = " kernel"; 38 + stat = "kernel"; 39 + } 40 + ]; 41 + }; 42 + }; 43 + }
+28
home/modules/programs/default.nix
··· 1 + { 2 + imports = [ 3 + ./fd.nix 4 + ./gpg.nix 5 + ./git.nix 6 + ./eza.nix 7 + ./fzf.nix 8 + ./zsh.nix 9 + ./aerc.nix 10 + ./direnv.nix 11 + ./zoxide.nix 12 + ./neovim.nix 13 + ./cuteff.nix 14 + ./jujutsu.nix 15 + ./jellyfin-rpc.nix 16 + 17 + ./niri.nix 18 + 19 + ./awww.nix 20 + ./rofi.nix 21 + ./foot.nix 22 + ./dunst.nix 23 + ./quickshell.nix 24 + 25 + ./vesktop.nix 26 + ./zen-browser.nix 27 + ]; 28 + }
+26
home/modules/programs/direnv.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.direnv = { 5 + enable = true; 6 + silent = true; 7 + enableZshIntegration = true; 8 + 9 + nix-direnv = { 10 + enable = true; 11 + package = pkgs.nix-direnv.override { nix = pkgs.lixPackageSets.stable.lix; }; 12 + }; 13 + 14 + stdlib = '' 15 + : ''${XDG_CACHE_HOME:=$HOME/.cache} 16 + declare -A direnv_layout_dirs 17 + 18 + direnv_layout_dir() { 19 + echo "''${direnv_layout_dirs[$PWD]:=$( 20 + echo -n "$XDG_CACHE_HOME"/direnv/layouts/ 21 + echo -n "$PWD" | sha1sum | cut -d ' ' -f 1 22 + )}" 23 + } 24 + ''; 25 + }; 26 + }
+46
home/modules/programs/dunst.nix
··· 1 + { 2 + inputs, 3 + config, 4 + pkgs, 5 + ... 6 + }: 7 + let 8 + colors = inputs.evergarden.lib.util.mkPalette config.evergarden; 9 + in 10 + { 11 + home.packages = with pkgs; [ libnotify ]; 12 + services.dunst = { 13 + enable = true; 14 + settings = { 15 + global = { 16 + alignment = "right"; 17 + origin = "top-right"; 18 + width = "(78, 400)"; 19 + offset = "(0,0)"; 20 + font = "Maple Mono NF 10"; 21 + 22 + background = "#${colors.base}"; 23 + foreground = "#${colors.text}"; 24 + frame_color = "#${colors.accent}"; 25 + separator_color = "frame"; 26 + highlight = "#${colors.yellow}"; 27 + }; 28 + 29 + urgency_low = { 30 + background = "#${colors.base}"; 31 + foreground = "#${colors.text}"; 32 + }; 33 + 34 + urgency_normal = { 35 + background = "#${colors.base}"; 36 + foreground = "#${colors.text}"; 37 + }; 38 + 39 + urgency_critical = { 40 + background = "#${colors.base}"; 41 + foreground = "#${colors.text}"; 42 + frame_color = "#${colors.red}"; 43 + }; 44 + }; 45 + }; 46 + }
+11
home/modules/programs/eza.nix
··· 1 + { 2 + programs.eza = { 3 + enable = true; 4 + enableZshIntegration = true; 5 + extraOptions = [ 6 + "--no-quotes" 7 + "--group-directories-first" 8 + ]; 9 + icons = "auto"; 10 + }; 11 + }
+7
home/modules/programs/fd.nix
··· 1 + { 2 + programs.fd = { 3 + enable = true; 4 + hidden = true; 5 + ignores = [ ".git" ]; 6 + }; 7 + }
+18
home/modules/programs/foot.nix
··· 1 + { 2 + programs.foot = { 3 + enable = true; 4 + server.enable = true; 5 + settings = { 6 + main = { 7 + font = "Maple Mono NF:pixelsize=15"; 8 + dpi-aware = "yes"; 9 + }; 10 + cursor = { 11 + style = "beam"; 12 + blink = "yes"; 13 + }; 14 + }; 15 + }; 16 + 17 + evergarden.foot.enable = true; 18 + }
+34
home/modules/programs/fzf.nix
··· 1 + { inputs, config, ... }: 2 + let 3 + colors = inputs.evergarden.lib.util.mkPalette config.evergarden; 4 + in 5 + { 6 + programs.fzf = { 7 + enable = true; 8 + enableZshIntegration = true; 9 + 10 + colors = { 11 + bg = "#${colors.base}"; 12 + "bg+" = "#${colors.surface0}"; 13 + selected-bg = "#${colors.surface1}"; 14 + fg = "#${colors.text}"; 15 + "fg+" = "#${colors.text}"; 16 + label = "#${colors.text}"; 17 + hl = "#${colors.yellow}"; 18 + "hl+" = "#${colors.yellow}"; 19 + header = "#${colors.red}"; 20 + info = "#${colors.green}"; 21 + prompt = "#${colors.green}"; 22 + border = "#${colors.surface0}"; 23 + marker = "#${colors.subtext0}"; 24 + pointer = "#${colors.subtext0}"; 25 + spinner = "#${colors.subtext0}"; 26 + }; 27 + 28 + defaultOptions = [ 29 + "--height=30%" 30 + "--info=inline" 31 + "--layout=reverse" 32 + ]; 33 + }; 34 + }
+77
home/modules/programs/git.nix
··· 1 + { 2 + programs = { 3 + git = { 4 + enable = true; 5 + signing.signByDefault = true; 6 + 7 + settings = { 8 + user = { 9 + name = "june"; 10 + email = "me@koi.rip"; 11 + signingkey = "5A530832DA9120B0CA57DDB67CBDB58ECF1D3478"; 12 + }; 13 + 14 + sendemail = { 15 + smtpuser = "me@koi.rip"; 16 + smtpserver = "smtp.purelymail.com"; 17 + smtpserverport = 465; 18 + smtpencryption = "ssl"; 19 + }; 20 + 21 + core = { 22 + compression = 9; 23 + whitespace = "error"; 24 + preloadindex = true; 25 + }; 26 + 27 + pull.rebase = true; 28 + interactive.singleKey = true; 29 + 30 + rebase = { 31 + autoStash = true; 32 + missingCommitsCheck = "warn"; 33 + }; 34 + 35 + status = { 36 + branch = true; 37 + showStash = true; 38 + showUntrackedFiles = "all"; 39 + }; 40 + 41 + log = { 42 + abbrevCommit = true; 43 + }; 44 + 45 + diff = { 46 + context = 3; 47 + renames = "copies"; 48 + interHunkContext = 10; 49 + }; 50 + 51 + "color \"diff\"" = { 52 + commit = "blue"; 53 + meta = "black bold"; 54 + frag = "magenta"; 55 + context = "white"; 56 + whitespace = "yellow reverse"; 57 + old = "red"; 58 + }; 59 + 60 + "color \"decorate\"" = { 61 + HEAD = "cyan reverse bold"; 62 + branch = "green"; 63 + tag = "yellow"; 64 + remoteBranch = "magenta"; 65 + }; 66 + 67 + commit.template = toString ../../../external/gitmessage.txt; 68 + init.defaultBranch = "main"; 69 + }; 70 + }; 71 + diff-so-fancy = { 72 + enable = true; 73 + enableGitIntegration = true; 74 + settings.markEmptyLines = false; 75 + }; 76 + }; 77 + }
+9
home/modules/programs/gpg.nix
··· 1 + { 2 + programs.gpg = { 3 + enable = true; 4 + settings = { 5 + default-key = "00F61623FB56BC5BB7094E634CE6C1172DF6BE79"; 6 + default-recipient-self = true; 7 + }; 8 + }; 9 + }
+23
home/modules/programs/jellyfin-rpc.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + home.packages = with pkgs; [ jellyfin-rpc ]; 5 + 6 + age.secrets.jellyfin-rpc.file = ../../../secrets/jellyfin-rpc.json.age; 7 + 8 + systemd.user.services.jellyfin-rpc = { 9 + Unit = { 10 + Description = "jellyfin discord RPC"; 11 + After = [ "network.target" ]; 12 + }; 13 + 14 + Service = { 15 + ExecStart = "${pkgs.jellyfin-rpc}/bin/jellyfin-rpc -c /run/user/%U/agenix/jellyfin-rpc"; 16 + Restart = "on-failure"; 17 + RestartSec = 60; 18 + }; 19 + 20 + # started manually with desktop session 21 + # Install.WantedBy = [ "default.target" ]; 22 + }; 23 + }
+77
home/modules/programs/jujutsu.nix
··· 1 + { 2 + programs.jujutsu = { 3 + enable = true; 4 + 5 + settings = { 6 + user = { 7 + name = "june"; 8 + email = "me@koi.rip"; 9 + }; 10 + 11 + signing = { 12 + behavior = "force"; 13 + backend = "gpg"; 14 + key = "5A530832DA9120B0CA57DDB67CBDB58ECF1D3478"; 15 + }; 16 + 17 + ui = { 18 + default-command = "status"; 19 + diff-formatter = ":git"; 20 + diff-editor = ":builtin"; 21 + pager = [ 22 + "sh" 23 + "-c" 24 + "diff-so-fancy | less -RFX" 25 + ]; 26 + }; 27 + 28 + colors = { 29 + "diff added token" = { 30 + underline = false; 31 + }; 32 + "diff removed token" = { 33 + underline = false; 34 + }; 35 + }; 36 + 37 + aliases = { 38 + init = [ 39 + "git" 40 + "init" 41 + "--colocate" 42 + ]; 43 + clone = [ 44 + "git" 45 + "clone" 46 + "--colocate" 47 + "--fetch-tags=none" 48 + "--branch" 49 + ]; 50 + update = [ 51 + "bookmark" 52 + "move" 53 + "--to=first_parent(@)" 54 + ]; 55 + boo = [ 56 + "metaedit" 57 + "--author=robin <${builtins.replaceStrings [ " meow! " ] [ "@" ] "comfysagedev meow! gmail.com"}>" 58 + ]; 59 + }; 60 + 61 + templates = { 62 + draft_commit_description = '' 63 + concat( 64 + builtin_draft_commit_description, 65 + "${ 66 + builtins.replaceStrings [ "# " " at " ] [ "JJ: " "@" ] ( 67 + builtins.readFile ../../../external/gitmessage.txt 68 + ) 69 + }", 70 + "\nJJ: ignore-rest\n", 71 + diff.git(), 72 + ) 73 + ''; 74 + }; 75 + }; 76 + }; 77 + }
+17
home/modules/programs/neovim.nix
··· 1 + { inputs, pkgs, ... }: 2 + 3 + { 4 + imports = [ inputs.anvim.homeManagerModules.default ]; 5 + 6 + programs.anvim = { 7 + enable = true; 8 + defaultEditor = true; 9 + }; 10 + 11 + home.packages = with pkgs; [ 12 + bash-language-server 13 + nixd 14 + ]; 15 + 16 + home.sessionVariables.MANPAGER = "nvim +Man!"; 17 + }
+258
home/modules/programs/niri.nix
··· 1 + { inputs, config, ... }: 2 + let 3 + colors = inputs.evergarden.lib.util.mkPalette config.evergarden; 4 + in 5 + { 6 + services.gnome-keyring.enable = false; 7 + 8 + home.sessionVariables = { 9 + XDG_BACKEND = "wayland"; 10 + NIXOS_OZONE_WL = "1"; 11 + PROTON_ENABLE_WAYLAND = "1"; 12 + }; 13 + 14 + programs.niri.settings = { 15 + spawn-at-startup = [ 16 + { argv = [ "awww restore" ]; } 17 + ]; 18 + 19 + screenshot-path = "/tmp/screenshots/%s.png"; 20 + prefer-no-csd = true; 21 + 22 + cursor = { 23 + theme = "Qogir"; 24 + size = 24; 25 + }; 26 + 27 + input = { 28 + keyboard = { 29 + repeat-delay = 180; 30 + repeat-rate = 60; 31 + numlock = true; 32 + }; 33 + 34 + mouse.accel-profile = "flat"; 35 + focus-follows-mouse.enable = false; 36 + }; 37 + 38 + gestures.hot-corners.enable = false; 39 + 40 + outputs = { 41 + HDMI-A-1 = { 42 + scale = 1; 43 + mode = { 44 + width = 1920; 45 + height = 1080; 46 + refresh = 60.0; 47 + }; 48 + focus-at-startup = true; 49 + position = { 50 + x = 0; 51 + y = 0; 52 + }; 53 + }; 54 + 55 + eDP-1 = { 56 + scale = 1; 57 + mode = { 58 + width = 1920; 59 + height = 1080; 60 + refresh = 60.0; 61 + }; 62 + position = { 63 + x = 1920; 64 + y = 0; 65 + }; 66 + }; 67 + }; 68 + 69 + layout = { 70 + gaps = 8; 71 + center-focused-column = "never"; 72 + background-color = "transparent"; 73 + 74 + default-column-width.proportion = 0.5; 75 + 76 + focus-ring.enable = false; 77 + border = { 78 + enable = true; 79 + width = 2; 80 + active.color = "#${colors.accent}"; 81 + inactive.color = "#${colors.surface0}"; 82 + urgent.color = "#${colors.yellow}"; 83 + }; 84 + }; 85 + 86 + # TODO: uncomment on next release 87 + # recent-windows.enable = false; 88 + 89 + animations = { 90 + window-open.kind.easing = { 91 + duration-ms = 400; 92 + curve = "cubic-bezier"; 93 + curve-args = [ 94 + 0.23 95 + 1 96 + 0.32 97 + 1 98 + ]; 99 + }; 100 + 101 + window-close.kind.easing = { 102 + duration-ms = 400; 103 + curve = "cubic-bezier"; 104 + curve-args = [ 105 + 0.23 106 + 1 107 + 0.32 108 + 1 109 + ]; 110 + }; 111 + }; 112 + 113 + workspaces = { 114 + "1".open-on-output = "HDMI-A-1"; 115 + "2".open-on-output = "HDMI-A-1"; 116 + "3".open-on-output = "HDMI-A-1"; 117 + "social".open-on-output = "eDP-1"; 118 + }; 119 + 120 + window-rules = [ 121 + { 122 + clip-to-geometry = true; 123 + } 124 + { 125 + matches = [ { app-id = "^Rofi"; } ]; 126 + open-floating = true; 127 + open-focused = true; 128 + } 129 + { 130 + matches = [ { app-id = "^vesktop"; } ]; 131 + open-on-workspace = "social"; 132 + open-maximized = true; 133 + } 134 + { 135 + matches = [ { title = "^(Picture in picture|Picture-in-Picture|Discord Popout)"; } ]; 136 + default-column-width.fixed = 800; 137 + default-window-height.fixed = 450; 138 + open-floating = true; 139 + open-focused = false; 140 + default-floating-position = { 141 + x = 0; 142 + y = 0; 143 + relative-to = "bottom-right"; 144 + }; 145 + } 146 + { 147 + matches = [ { title = "^notificationtoast.*"; } ]; 148 + open-floating = true; 149 + default-floating-position = { 150 + x = 0; 151 + y = 0; 152 + relative-to = "bottom-right"; 153 + }; 154 + } 155 + ]; 156 + 157 + layer-rules = [ 158 + { 159 + matches = [ { namespace = "^awww-daemon"; } ]; 160 + place-within-backdrop = true; 161 + } 162 + ]; 163 + 164 + hotkey-overlay.skip-at-startup = true; 165 + 166 + binds = { 167 + "mod+shift+slash".action.show-hotkey-overlay = [ ]; 168 + 169 + "mod+return".action.spawn = [ "footclient" ]; 170 + "mod+shift+return".action.spawn = [ 171 + "rofi" 172 + "-show" 173 + "drun" 174 + ]; 175 + 176 + "mod+tab".action.toggle-overview = [ ]; 177 + "mod+shift+c".action.close-window = [ ]; 178 + 179 + "mod+home".action.focus-column-first = [ ]; 180 + "mod+end".action.focus-column-last = [ ]; 181 + "mod+shift+home".action.move-column-to-first = [ ]; 182 + "mod+shift+end".action.move-column-to-last = [ ]; 183 + 184 + # TODO: make a loop for these 185 + "mod+n".action.focus-column-left = [ ]; 186 + "mod+e".action.focus-window-down = [ ]; 187 + "mod+i".action.focus-window-up = [ ]; 188 + "mod+o".action.focus-column-right = [ ]; 189 + "mod+left".action.focus-column-left = [ ]; 190 + "mod+down".action.focus-window-down = [ ]; 191 + "mod+up".action.focus-window-up = [ ]; 192 + "mod+right".action.focus-column-right = [ ]; 193 + 194 + "mod+shift+n".action.move-column-left = [ ]; 195 + "mod+shift+e".action.move-window-down = [ ]; 196 + "mod+shift+i".action.move-window-up = [ ]; 197 + "mod+shift+o".action.move-column-right = [ ]; 198 + "mod+shift+left".action.move-column-left = [ ]; 199 + "mod+shift+down".action.move-window-down = [ ]; 200 + "mod+shift+up".action.move-window-up = [ ]; 201 + "mod+shift+right".action.move-column-right = [ ]; 202 + 203 + "mod+ctrl+n".action.focus-monitor-left = [ ]; 204 + "mod+ctrl+e".action.focus-monitor-down = [ ]; 205 + "mod+ctrl+i".action.focus-monitor-up = [ ]; 206 + "mod+ctrl+o".action.focus-monitor-right = [ ]; 207 + "mod+ctrl+left".action.focus-monitor-left = [ ]; 208 + "mod+ctrl+right".action.focus-monitor-right = [ ]; 209 + "mod+ctrl+up".action.focus-monitor-up = [ ]; 210 + "mod+ctrl+down".action.focus-monitor-down = [ ]; 211 + 212 + "mod+l".action.focus-workspace-up = [ ]; 213 + "mod+u".action.focus-workspace-down = [ ]; 214 + "mod+page_up".action.focus-workspace-up = [ ]; 215 + "mod+page_down".action.focus-workspace-down = [ ]; 216 + 217 + "mod+shift+l".action.move-column-to-workspace-up = [ ]; 218 + "mod+shift+u".action.move-column-to-workspace-down = [ ]; 219 + "mod+shift+page_up".action.move-column-to-workspace-up = [ ]; 220 + "mod+shift+page_down".action.move-column-to-workspace-down = [ ]; 221 + 222 + # TODO: make a loop for these 223 + "mod+1".action.focus-workspace = 1; 224 + "mod+2".action.focus-workspace = 2; 225 + "mod+3".action.focus-workspace = 3; 226 + "mod+4".action.focus-workspace = "social"; 227 + "mod+0".action.focus-workspace = "social"; 228 + 229 + "mod+shift+1".action.move-column-to-workspace = 1; 230 + "mod+shift+2".action.move-column-to-workspace = 2; 231 + "mod+shift+3".action.move-column-to-workspace = 3; 232 + "mod+shift+4".action.move-column-to-workspace = "social"; 233 + "mod+shift+0".action.move-column-to-workspace = "social"; 234 + 235 + "mod+bracketleft".action.consume-or-expel-window-left = [ ]; 236 + "mod+bracketright".action.consume-or-expel-window-right = [ ]; 237 + 238 + "mod+f".action.maximize-column = [ ]; 239 + "mod+shift+f".action.fullscreen-window = [ ]; 240 + "mod+ctrl+f".action.expand-column-to-available-width = [ ]; 241 + "mod+r".action.switch-preset-column-width = [ ]; 242 + 243 + "mod+minus".action.set-column-width = "-10%"; 244 + "mod+equal".action.set-column-width = "+10%"; 245 + "mod+shift+minus".action.set-window-height = "-10%"; 246 + "mod+shift+equal".action.set-window-height = "+10%"; 247 + 248 + "mod+space".action.toggle-window-floating = [ ]; 249 + "mod+shift+space".action.switch-focus-between-floating-and-tiling = [ ]; 250 + 251 + "print".action.screenshot = [ ]; 252 + "shift+print".action.screenshot-window = [ ]; 253 + "ctrl+print".action.screenshot-screen = [ ]; 254 + 255 + "mod+shift+q".action.quit = [ ]; 256 + }; 257 + }; 258 + }
+6
home/modules/programs/quickshell.nix
··· 1 + { 2 + programs.quickshell = { 3 + enable = true; 4 + systemd.enable = true; 5 + }; 6 + }
+19
home/modules/programs/rofi.nix
··· 1 + { pkgs, ... }: 2 + let 3 + evergarden = ../../../external/rofi-evergarden.rasi; 4 + config = pkgs.fetchurl { 5 + url = "https://raw.githubusercontent.com/catppuccin/rofi/71fb15577ccb091df2f4fc1f65710edbc61b5a53/catppuccin-default.rasi"; 6 + hash = "sha256-v2DtDReDvkJ70rdbF5ldH9mS6acLlrg7Q3L6nJU3ebg="; 7 + }; 8 + in 9 + { 10 + programs.rofi = { 11 + enable = true; 12 + font = "Maple Mono NF 14"; 13 + 14 + # cool hack lmao 15 + theme = '' 16 + ${evergarden}" 17 + @import "${config}''; 18 + }; 19 + }
+26
home/modules/programs/spicetify.nix
··· 1 + { pkgs, inputs, ... }: 2 + 3 + let 4 + inherit (inputs) spicetify-nix; 5 + spicePkgs = spicetify-nix.legacyPackages.${pkgs.stdenv.system}; 6 + in 7 + { 8 + imports = [ 9 + spicetify-nix.homeManagerModules.spicetify 10 + ]; 11 + 12 + programs.spicetify = { 13 + enable = true; 14 + theme = spicePkgs.themes.catppuccin; 15 + colorScheme = "mocha"; 16 + wayland = true; 17 + enabledExtensions = with spicePkgs.extensions; [ 18 + catJamSynced 19 + seekSong 20 + fullAlbumDate 21 + songStats 22 + adblock 23 + playNext 24 + ]; 25 + }; 26 + }
+109
home/modules/programs/vesktop.nix
··· 1 + { inputs, config, ... }: 2 + let 3 + colors = inputs.evergarden.lib.util.mkPalette config.evergarden; 4 + in 5 + { 6 + programs.vesktop = { 7 + enable = true; 8 + settings = { 9 + arRPC = true; 10 + splashBackground = "#${colors.base}"; 11 + splashColor = "#${colors.text}"; 12 + splashTheming = true; 13 + }; 14 + vencord = { 15 + extraQuickCss = ".media-engine-video { transform: none; }"; 16 + settings = { 17 + useQuickCss = true; 18 + themeLinks = [ 19 + "https://everviolet.github.io/discord/themes/evergarden-${config.evergarden.variant}-${config.evergarden.accent}.theme.css" 20 + ]; 21 + plugins = { 22 + AlwaysExpandRoles.enabled = true; 23 + AlwaysTrust = { 24 + enabled = true; 25 + domain = true; 26 + file = true; 27 + }; 28 + AnonymiseFileNames = { 29 + enabled = true; 30 + anonymiseByDefault = true; 31 + method = 0; 32 + randomisedLength = 8; 33 + }; 34 + BetterGifPicker.enabled = true; 35 + BetterSettings = { 36 + enabled = true; 37 + disableFade = true; 38 + organizeMenu = true; 39 + }; 40 + CallTimer.enabled = true; 41 + ClearURLs.enabled = true; 42 + Decor = { 43 + enabled = true; 44 + agreedToGuidelines = true; 45 + }; 46 + Experiments.enabled = true; 47 + ExpressionCloner.enabled = true; 48 + FakeNitro = { 49 + enabled = true; 50 + enableEmojiBypass = true; 51 + emojiSize = 48; 52 + transformEmojis = true; 53 + enableStickerBypass = true; 54 + stickerSize = 160; 55 + transformStickers = true; 56 + transformCompoundSentence = true; 57 + enableStreamQualityBypass = true; 58 + useHyperLinks = true; 59 + }; 60 + FakeProfileThemes = { 61 + enabled = true; 62 + nitroFirst = true; 63 + }; 64 + FavoriteGifSearch.enabled = true; 65 + FixCodeblockGap.enabled = true; 66 + ForceOwnerCrown.enabled = true; 67 + FriendsSince.enabled = true; 68 + MessageLogger = { 69 + enabled = true; 70 + deketeStyle = "text"; 71 + logDeletes = true; 72 + logEdits = true; 73 + ignoreBots = false; 74 + ignoreSelf = false; 75 + collapseDeleted = true; 76 + inlineEdits = true; 77 + }; 78 + MoreKaomoji.enabled = true; 79 + NoTrack = { 80 + enabled = true; 81 + disableAnalytics = true; 82 + }; 83 + NoTypingAnimation.enabled = true; 84 + petpet.enabled = true; 85 + PinDMs.enabled = true; 86 + RelationshipNotifier.enabled = true; 87 + ShowHiddenChannels.enabled = true; 88 + ShowHiddenThings.enabled = true; 89 + ShowMeYourName = { 90 + enabled = true; 91 + mode = "nick-user"; 92 + displayNames = false; 93 + inReplies = false; 94 + friendNicknames = "dms"; 95 + }; 96 + SilentTyping = { 97 + enabled = true; 98 + showIcon = true; 99 + }; 100 + USRBG.enabled = true; 101 + ViewRaw.enabled = true; 102 + VolumeBooster.enabled = true; 103 + WhoReacted.enabled = true; 104 + YoutubeAdblock.enabled = true; 105 + }; 106 + }; 107 + }; 108 + }; 109 + }
+168
home/modules/programs/zen-browser.nix
··· 1 + { config, inputs, ... }: 2 + 3 + { 4 + imports = [ inputs.zen-browser.homeModules.beta ]; 5 + 6 + programs.zen-browser = { 7 + enable = true; 8 + 9 + profiles.default = { 10 + id = 0; 11 + isDefault = true; 12 + search = { 13 + force = true; 14 + default = "searxng"; 15 + engines = { 16 + searxng = { 17 + name = "4get"; 18 + definedAliases = [ "@4get" ]; 19 + urls = [ { template = "https://search.nelliel.cv/web?s={searchTerms}"; } ]; 20 + iconMapObj."32" = "https://search.nelliel.cv/favicon.ico"; 21 + }; 22 + alpine = { 23 + name = "Aplpine Packages"; 24 + definedAliases = [ "@alpine" ]; 25 + urls = [ 26 + { template = "https://pkgs.alpinelinux.org/packages?name={searchTerms}&branch=edge&repo=&arch="; } 27 + ]; 28 + iconMapObj."16" = "https://search.nixos.org/favicon.png"; 29 + }; 30 + nixpkgs = { 31 + name = "Nixpkgs"; 32 + definedAliases = [ "@nixpkgs" ]; 33 + urls = [ { template = "https://search.nixos.org/packages?channel=unstable&query={searchTerms}"; } ]; 34 + iconMapObj."16" = "https://search.nixos.org/favicon.png"; 35 + }; 36 + nixos = { 37 + name = "NixOS Options"; 38 + definedAliases = [ "@nixos" ]; 39 + urls = [ { template = "https://search.nixos.org/options?channel=unstable&query={searchTerms}"; } ]; 40 + iconMapObj."16" = "https://search.nixos.org/favicon.png"; 41 + }; 42 + mynixos = { 43 + name = "MyNixOS"; 44 + definedAliases = [ "@mynixos" ]; 45 + urls = [ { template = "https://mynixos.com/search?q={searchTerms}"; } ]; 46 + iconMapObj."32" = "https://mynixos.com/favicon.ico"; 47 + }; 48 + stardew = { 49 + name = "Stardew Valley Wiki"; 50 + definedAliases = [ "@stardew" ]; 51 + urls = [ { template = "https://stardewvalleywiki.com/mediawiki/index.php?search={searchTerms}"; } ]; 52 + iconMapObj."32" = 53 + "https://stardewvalleywiki.com/mediawiki/extensions/StardewValley/images/favicon.png"; 54 + }; 55 + }; 56 + }; 57 + settings = { 58 + "browser.search.separatePrivateDefault" = false; 59 + "browser.tabs.groups.enabled" = true; 60 + "browser.tabs.warnOnClose" = false; 61 + "devtools.theme" = "dark"; 62 + "font.name.serif.x-western" = "Noto Serif"; 63 + "general.autoScroll" = true; 64 + "layout.spellcheckDefault" = 0; 65 + "privacy.userContext.enabled" = false; # container tabs 66 + "zen.glance.enabled" = false; 67 + "zen.tabs.show-newtab-vertical" = false; 68 + "zen.welcome-screen.seen" = true; 69 + "zen.urlbar.behavior" = "floating-on-type"; 70 + "zen.view.use-single-toolbar" = false; 71 + "zen.view.sidebar-expanded" = true; 72 + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; 73 + "media.videocontrols.picture-in-picture.video-toggle.enabled" = true; 74 + "layout.css.prefers-color-scheme.content-override" = 0; # dark mode 75 + }; 76 + userChrome = builtins.readFile ../../../external/userChrome.css; 77 + keyboardShortcutsVersion = 17; 78 + keyboardShortcuts = [ 79 + { 80 + id = "addBookmarkAsKb"; 81 + disabled = true; 82 + } 83 + ]; 84 + }; 85 + 86 + policies = 87 + let 88 + mkExtension = 89 + { 90 + id, 91 + pinned ? false, 92 + private ? false, 93 + }: 94 + { 95 + install_url = "https://addons.mozilla.org/firefox/downloads/latest/${id}/latest.xpi"; 96 + installation_mode = "force_installed"; 97 + default_area = if pinned then "navbar" else "menupanel"; 98 + private_browsing = private; 99 + }; 100 + 101 + mkExtensionSettings = builtins.mapAttrs ( 102 + _: e: if builtins.isAttrs e then e else mkExtension { id = e; } 103 + ); 104 + in 105 + { 106 + PromptForDownloadLocation = true; 107 + DefaultDownloadDirectory = config.xdg.userDirs.download; 108 + DisableAppUpdate = true; 109 + DisableFeedbackCommands = true; 110 + DisableForgetButton = true; 111 + DisableFirefoxAccounts = true; 112 + DisableFirefoxStudies = true; 113 + DisableFirefoxScreenshots = true; 114 + DisableFirefoxPocket = true; 115 + DisableSafeMode = true; 116 + DisableTelemetry = true; 117 + DontCheckDefaultBrowser = true; 118 + NoDefaultBookmarks = true; 119 + OfferToSaveLogins = false; 120 + PictureInPicture = true; 121 + EnableTrackingProtection = { 122 + Value = true; 123 + Locked = true; 124 + Cryptomining = true; 125 + Fingerprinting = true; 126 + EmailTracking = true; 127 + SuspectedFingerprinting = true; 128 + }; 129 + GenerativeAI = { 130 + Enabled = false; 131 + Locked = true; 132 + }; 133 + ExtensionSettings = mkExtensionSettings { 134 + "uBlock0@raymondhill.net" = mkExtension { 135 + id = "ublock-origin"; 136 + pinned = true; 137 + private = true; 138 + }; 139 + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = mkExtension { 140 + id = "bitwarden-password-manager"; 141 + pinned = true; 142 + }; 143 + "addon@darkreader.org" = mkExtension { 144 + id = "darkreader"; 145 + pinned = true; 146 + }; 147 + "{7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}" = mkExtension { 148 + id = "styl-us"; 149 + pinned = true; 150 + private = true; 151 + }; 152 + "redirector@einaregilsson.com" = mkExtension { 153 + id = "redirector"; 154 + pinned = true; 155 + private = true; 156 + }; 157 + "{a29c89d0-8d34-47c1-8c30-6e4ade95bd1a}" = "wide-github-chrome"; 158 + }; 159 + }; 160 + }; 161 + 162 + home.sessionVariables.DEFAULT_BROWSER = "zen-beta"; 163 + xdg.mimeApps.defaultApplications = { 164 + "text/html" = [ "zen-beta.desktop" ]; 165 + "x-scheme-handler/http" = [ "zen-beta.desktop" ]; 166 + "x-scheme-handler/https" = [ "zen-beta.desktop" ]; 167 + }; 168 + }
+6
home/modules/programs/zoxide.nix
··· 1 + { 2 + programs.zoxide = { 3 + enable = true; 4 + enableZshIntegration = true; 5 + }; 6 + }
+78
home/modules/programs/zsh.nix
··· 1 + { pkgs, ... }: 2 + 3 + let 4 + external = ../../../external/zsh; 5 + in 6 + { 7 + home.shell.enableZshIntegration = true; 8 + programs.zsh = { 9 + enable = true; 10 + 11 + plugins = [ 12 + { 13 + name = "syntax-highlighting"; 14 + src = pkgs.zsh-syntax-highlighting; 15 + file = "share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"; 16 + } 17 + { 18 + name = "autosuggestions"; 19 + src = pkgs.zsh-autosuggestions; 20 + file = "share/zsh-autosuggestions/zsh-autosuggestions.zsh"; 21 + } 22 + { 23 + name = "autopair"; 24 + src = pkgs.zsh-autopair; 25 + file = "share/zsh/zsh-autopair/autopair.zsh"; 26 + } 27 + ]; 28 + 29 + shellAliases = { 30 + cp = "cp -i"; 31 + nv = "nvim"; 32 + car = "cat"; 33 + shred = "shred -uvz"; 34 + 35 + mkdirenv = "echo -e 'if has nix; then\\n use flake\\nfi' >> .envrc && direnv allow"; 36 + 37 + nixb = "nom build"; 38 + nixs = "FF_SKIP=1 nom shell"; 39 + nixdev = "FF_SKIP=1 nom develop -c \"$SHELL\""; 40 + 41 + diff = "diff --color=auto"; 42 + grep = "grep --color=auto"; 43 + ip = "ip -color=auto"; 44 + ping = "prettyping"; 45 + 46 + ls = "eza"; 47 + ll = "eza -lg"; 48 + la = "eza -lga"; 49 + 50 + gap = "git add --patch"; 51 + ga = "git add"; 52 + gc = "git commit --edit -S"; 53 + gp = "git push origin"; 54 + gb = "git branch"; 55 + gl = "git log"; 56 + gd = "git diff"; 57 + gco = "git checkout"; 58 + gpull = "git pull origin"; 59 + gmain = "if ! git checkout --track origin/main; then if ! git checkout main; then git checkout master; fi; fi"; 60 + }; 61 + 62 + initContent = '' 63 + source ${external}/keymap.zsh 64 + source ${external}/prompt.zsh 65 + source ${external}/functions.zsh 66 + 67 + export GPG_TTY=$(tty) 68 + source <(${pkgs.fzf}/bin/fzf --zsh) 69 + source <(COMPLETE=zsh ${pkgs.jujutsu}/bin/jj) 70 + 71 + cuteff 72 + ''; 73 + 74 + profileExtra = '' 75 + source ${external}/profile.zsh 76 + ''; 77 + }; 78 + }
+25
home/modules/theme.nix
··· 1 + { pkgs, ... }: 2 + { 3 + evergarden.adwaita.enable = true; 4 + 5 + gtk = { 6 + enable = true; 7 + theme = { 8 + name = "adw-gtk3-dark"; 9 + package = pkgs.adw-gtk3; 10 + }; 11 + iconTheme = { 12 + name = "Papirus-Dark"; 13 + package = pkgs.papirus-icon-theme; 14 + }; 15 + }; 16 + 17 + home.pointerCursor = { 18 + enable = true; 19 + name = "Qogir"; 20 + package = pkgs.qogir-icon-theme; 21 + size = 24; 22 + gtk.enable = true; 23 + x11.enable = false; 24 + }; 25 + }
+3
home/modules/wallpaper.nix
··· 1 + { 2 + home.file.".wallpaper.png".source = ../../external/wallpaper.png; 3 + }
+46
home/modules/xdg.nix
··· 1 + { config, pkgs, ... }: 2 + let 3 + home = config.home.homeDirectory; 4 + in 5 + { 6 + xdg = { 7 + mimeApps.enable = true; 8 + 9 + userDirs = { 10 + enable = true; 11 + download = "/tmp/downloads"; 12 + desktop = "/tmp/garbage"; 13 + documents = "/tmp/garbage"; 14 + music = "/tmp/garbage"; 15 + pictures = "/tmp/garbage"; 16 + publicShare = "/tmp/garbage"; 17 + templates = "/tmp/garbage"; 18 + videos = "/tmp/garbage"; 19 + }; 20 + 21 + portal = { 22 + enable = true; 23 + extraPortals = with pkgs; [ 24 + xdg-desktop-portal-gtk 25 + xdg-desktop-portal-gnome 26 + ]; 27 + 28 + config.common = { 29 + default = [ 30 + "gtk" 31 + "gnome" 32 + ]; 33 + 34 + "org.freedesktop.impl.portal.Access" = [ "gtk" ]; 35 + "org.freedesktop.impl.portal.Notification" = [ "gtk" ]; 36 + }; 37 + }; 38 + }; 39 + 40 + home.sessionVariables = { 41 + XDG_DATA_HOME = "${home}/.local/share"; 42 + XDG_CONFIG_HOME = "${home}/.config"; 43 + XDG_STATE_HOME = "${home}/.local/state"; 44 + XDG_CACHE_HOME = "${home}/.cache"; 45 + }; 46 + }
+6
modules/base/boot.nix
··· 1 + { 2 + boot = { 3 + loader.efi.canTouchEfiVariables = true; 4 + tmp.cleanOnBoot = true; 5 + }; 6 + }
+1
modules/base/console.nix
··· 1 + { console.font = "Lat2-Terminus16"; }
+20
modules/base/default.nix
··· 1 + { inputs, ... }: 2 + { 3 + imports = [ 4 + inputs.agenix.nixosModules.default 5 + 6 + ./boot.nix 7 + ./console.nix 8 + ./security.nix 9 + ./networking.nix 10 + ./environment.nix 11 + ./nixpkgs.nix 12 + ./nix.nix 13 + ./system.nix 14 + ./users 15 + ./programs 16 + ./services 17 + ]; 18 + 19 + age.secrets.tailscale-auth.file = ../../secrets/tailscale-auth.age; 20 + }
+6
modules/base/environment.nix
··· 1 + { pkgs, ... }: 2 + { 3 + environment.localBinInPath = true; 4 + 5 + environment.systemPackages = [ pkgs.git ]; 6 + }
+54
modules/base/networking.nix
··· 1 + { 2 + networking = { 3 + nameservers = [ 4 + "1.1.1.1" 5 + "1.0.0.1" 6 + "8.8.8.8" 7 + "8.8.4.4" 8 + ]; 9 + networkmanager.enable = true; 10 + firewall = { 11 + enable = true; 12 + extraCommands = '' 13 + set -euo pipefail 14 + 15 + ensure_rule() { 16 + if ! iptables -C INPUT "$@" 2>/dev/null; then 17 + iptables -I INPUT 1 "$@" 18 + fi 19 + } 20 + ensure_rule6() { 21 + if ! ip6tables -C INPUT "$@" 2>/dev/null; then 22 + ip6tables -I INPUT 1 "$@" 23 + fi 24 + } 25 + 26 + v4blocklist=( 27 + '66.132.159.0/24' 28 + '162.142.125.0/24' 29 + '167.94.138.0/24' 30 + '167.94.145.0/24' 31 + '167.94.146.0/24' 32 + '167.248.133.0/24' 33 + '199.45.154.0/24' 34 + '199.45.155.0/24' 35 + '206.168.34.0/24' 36 + '206.168.35.0/24' 37 + ) 38 + v6blocklist=( 39 + '2602:80d:1000:b0cc:e::/80' 40 + '2620:96:e000:b0cc:e::/80' 41 + '2602:80d:1003::/112' 42 + '2602:80d:1004::/112' 43 + ) 44 + 45 + for ip in "''${v4blocklist[@]}"; do 46 + ensure_rule -s "$ip" -j DROP 47 + done 48 + for ip in "''${v6blocklist[@]}"; do 49 + ensure_rule6 -s "$ip" -j DROP 50 + done 51 + ''; 52 + }; 53 + }; 54 + }
+18
modules/base/nix.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + nix = { 5 + package = pkgs.lixPackageSets.stable.lix; 6 + 7 + settings = { 8 + experimental-features = [ 9 + "flakes" 10 + "nix-command" 11 + ]; 12 + trusted-users = [ 13 + "root" 14 + "koi" 15 + ]; 16 + }; 17 + }; 18 + }
+1
modules/base/nixpkgs.nix
··· 1 + { nixpkgs.config.allowUnfree = true; }
+7
modules/base/programs/bash.nix
··· 1 + { 2 + programs.bash.shellInit = '' 3 + if [ -n "$SSH_TTY" ]; then 4 + export TERM='xterm-256color' 5 + fi 6 + ''; 7 + }
+6
modules/base/programs/default.nix
··· 1 + { 2 + imports = [ 3 + ./bash.nix 4 + ./nano.nix 5 + ]; 6 + }
+3
modules/base/programs/nano.nix
··· 1 + { 2 + programs.nano.enable = false; 3 + }
+20
modules/base/security.nix
··· 1 + { 2 + security.sudo.enable = false; 3 + 4 + security.doas = { 5 + enable = true; 6 + wheelNeedsPassword = true; 7 + extraRules = [ 8 + { 9 + groups = [ "wheel" ]; 10 + keepEnv = true; 11 + persist = true; 12 + } 13 + { 14 + groups = [ "wheel" ]; 15 + cmd = "/run/current-system/sw/bin/nixos-rebuild"; 16 + noPass = true; 17 + } 18 + ]; 19 + }; 20 + }
+3
modules/base/services/davfs2.nix
··· 1 + { 2 + services.davfs2.enable = true; 3 + }
+6
modules/base/services/default.nix
··· 1 + { 2 + imports = [ 3 + ./openssh.nix 4 + ./davfs2.nix 5 + ]; 6 + }
+16
modules/base/services/openssh.nix
··· 1 + { 2 + services.openssh = { 3 + enable = true; 4 + openFirewall = true; 5 + settings = { 6 + LogLevel = "ERROR"; # haxerz OUT 7 + PubkeyAuthentication = true; 8 + PasswordAuthentication = false; 9 + KbdInteractiveAuthentication = false; 10 + X11Forwarding = false; 11 + PermitTunnel = "no"; 12 + PermitRootLogin = "no"; 13 + AllowTcpForwarding = "no"; 14 + }; 15 + }; 16 + }
+1
modules/base/system.nix
··· 1 + { system.stateVersion = "26.05"; }
+9
modules/base/users/default.nix
··· 1 + { 2 + imports = [ 3 + ./root.nix 4 + ./koi.nix 5 + ./robin.nix 6 + ]; 7 + 8 + config.users.mutableUsers = false; 9 + }
+16
modules/base/users/koi.nix
··· 1 + { 2 + users.users.koi = { 3 + isNormalUser = true; 4 + hashedPassword = "$y$j9T$kpXvXU/Ftx9qI9LKssnpY/$mGPO35iEUCb8/.bdYA/Zys3MuIaNSlrnUY2S6wCoFD8"; 5 + ignoreShellProgramCheck = true; 6 + extraGroups = [ 7 + "wheel" 8 + "jellyfin" 9 + ]; 10 + openssh.authorizedKeys.keys = [ 11 + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9feAlrIVPuVS28tz54/m7pZkjHHL5aVhV2qwBPPceT" 12 + ]; 13 + }; 14 + 15 + systemd.tmpfiles.rules = [ "d /tmp/downloads 2700 koi users -" ]; 16 + }
+12
modules/base/users/robin.nix
··· 1 + { 2 + users.users.robin = { 3 + isNormalUser = true; 4 + hashedPassword = "$y$j9T$fjikoYmPQxjKqjobJ/vZC/$ULBf6ns9PS8EUHBeRbnd3QQbOSCtAe18JhK3UUy.nv2"; 5 + ignoreShellProgramCheck = true; 6 + openssh.authorizedKeys.keys = [ 7 + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKxTuK2A7wbXnjkIhDrze4B5Uj2rnpmPAWGjPDMPiyk robin" 8 + ]; 9 + }; 10 + 11 + systemd.tmpfiles.rules = [ "d /var/boo 770 robin users -" ]; 12 + }
+5
modules/base/users/root.nix
··· 1 + { config, ... }: 2 + 3 + { 4 + users.users.root.hashedPassword = config.users.users.koi.hashedPassword; 5 + }
+10
modules/desktop/boot.nix
··· 1 + { config, ... }: 2 + { 3 + boot = { 4 + extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; 5 + kernelModules = [ "v4l2loopback" ]; 6 + extraModprobeConfig = '' 7 + options v4l2loopback exclusive_caps=1 card_label="Virtual Camera" 8 + ''; 9 + }; 10 + }
+4
modules/desktop/console.nix
··· 1 + { 2 + evergarden.tty.enable = true; 3 + console.useXkbConfig = true; 4 + }
+17
modules/desktop/default.nix
··· 1 + { config, ... }: 2 + { 3 + imports = [ 4 + ./boot.nix 5 + ./console.nix 6 + ./nixpkgs.nix 7 + ./environment.nix 8 + ./evergarden.nix 9 + ./users.nix 10 + ./programs 11 + ./services 12 + 13 + ../home.nix 14 + ]; 15 + 16 + age.identityPaths = [ "${config.users.users.koi.home}/.ssh/id_ed25519" ]; 17 + }
+8
modules/desktop/environment.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + environment.systemPackages = with pkgs; [ 5 + cloudflared 6 + htop 7 + ]; 8 + }
+12
modules/desktop/evergarden.nix
··· 1 + { inputs, ... }: 2 + { 3 + imports = [ 4 + inputs.evergarden.nixosModules.default 5 + ]; 6 + 7 + evergarden = { 8 + enable = false; 9 + variant = "fall"; 10 + accent = "green"; 11 + }; 12 + }
+5
modules/desktop/nixpkgs.nix
··· 1 + { inputs, ... }: 2 + 3 + { 4 + nixpkgs.overlays = [ inputs.niri.overlays.niri ]; 5 + }
+7
modules/desktop/programs/default.nix
··· 1 + { 2 + imports = [ 3 + ./gnupg.nix 4 + ./nix-ld.nix 5 + ./niri.nix 6 + ]; 7 + }
+9
modules/desktop/programs/gnupg.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + programs.gnupg.agent = { 5 + enable = true; 6 + enableSSHSupport = true; 7 + pinentryPackage = pkgs.pinentry-curses; 8 + }; 9 + }
+6
modules/desktop/programs/hyprland.nix
··· 1 + { 2 + programs.hyprland = { 3 + enable = true; 4 + xwayland.enable = true; 5 + }; 6 + }
+13
modules/desktop/programs/niri.nix
··· 1 + { inputs, pkgs, ... }: 2 + { 3 + imports = [ 4 + inputs.niri.nixosModules.niri 5 + ]; 6 + 7 + programs.niri = { 8 + enable = true; 9 + package = pkgs.niri-stable; 10 + }; 11 + 12 + environment.systemPackages = [ pkgs.xwayland-satellite ]; 13 + }
+3
modules/desktop/programs/nix-ld.nix
··· 1 + { 2 + programs.nix-ld.enable = true; 3 + }
+7
modules/desktop/services/default.nix
··· 1 + { 2 + imports = [ 3 + ./udev.nix 4 + ./pipewire.nix 5 + ./tailscale.nix 6 + ]; 7 + }
+6
modules/desktop/services/pipewire.nix
··· 1 + { 2 + services.pipewire = { 3 + enable = true; 4 + pulse.enable = true; 5 + }; 6 + }
+7
modules/desktop/services/tailscale.nix
··· 1 + { config, ... }: 2 + { 3 + services.tailscale = { 4 + enable = true; 5 + authKeyFile = config.age.secrets.tailscale-auth.path; 6 + }; 7 + }
+6
modules/desktop/services/udev.nix
··· 1 + { 2 + services.udev.extraRules = '' 3 + SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3434", ATTRS{idProduct}=="02a0", MODE="0660", TAG+="uaccess" 4 + ATTRS{name}=="*DualSense*Touchpad*", ENV{ID_INPUT_TOUCHPAD}="" 5 + ''; 6 + }
+4
modules/desktop/users.nix
··· 1 + { pkgs, ... }: 2 + { 3 + users.users.koi.shell = pkgs.zsh; 4 + }
+18
modules/home.nix
··· 1 + { inputs, ... }: 2 + { 3 + imports = [ 4 + inputs.home-manager.nixosModules.home-manager 5 + ]; 6 + 7 + home-manager = { 8 + useGlobalPkgs = true; 9 + useUserPackages = true; 10 + backupFileExtension = "bak"; 11 + extraSpecialArgs = { 12 + inherit 13 + inputs 14 + ; 15 + }; # TODO: optimize maybe 16 + users.koi = import ../home/koi.nix; 17 + }; 18 + }
+3
preview.webp
··· 1 + version https://git-lfs.github.com/spec/v1 2 + oid sha256:ba796d287a6dbf97cba9319dc47107966870b971d4ae7179d2feaca374bf6b68 3 + size 557954
secrets/cloudflared.pem.age

This is a binary file and will not be displayed.

+5
secrets/email-pass-me.age
··· 1 + age-encryption.org/v1 2 + -> ssh-ed25519 IU0gwQ 6DvxiTxj2MhKNLcjYPLXWL3w6JO1W5Ip2nZItmf/C3U 3 + w0SeQQR0xa2gLdZ60zg3SIFogdG+EFa2+iVxAUQ6fiE 4 + --- 0rfkjmVwKVVLBntk6ju8IVYc2o/9VoqWn4Jfp1r1bmE 5 + ��hW�/TC=B�� ���[)�V}���Mx�Q�tړ������o��Њ k
+6
secrets/email-pass-noreply.age
··· 1 + age-encryption.org/v1 2 + -> ssh-ed25519 IU0gwQ QylBSden7PZqCgBNAbOvpY0cskykhdU8IbbKg6zMVEs 3 + UgJo1fzBMKYJHKDPWay+/UVGOQtYIprwuvD+6RBZcJE 4 + --- xTEo5EA+CNlFbSISmZmzif6MYAePZFS2HExuRI1PwXg 5 + Œ�V����e��e�4W�y 6 + ,&@�F�hxQ��s�3� ������zA>���Y
secrets/jellyfin-rpc.json.age

This is a binary file and will not be displayed.

+23
secrets/secrets.nix
··· 1 + let 2 + koi = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID9feAlrIVPuVS28tz54/m7pZkjHHL5aVhV2qwBPPceT"; 3 + seber = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBAp82e57ij5x+Ei1Tjwxuex0fil5vV9wfEfNYgC5dFQ"; 4 + in 5 + { 6 + "cloudflared.pem.age".publicKeys = [ koi ]; 7 + "jellyfin-rpc.json.age".publicKeys = [ koi ]; 8 + "tranquil.env.age".publicKeys = [ koi ]; 9 + 10 + "email-pass-me.age".publicKeys = [ koi ]; 11 + "email-pass-noreply.age".publicKeys = [ koi ]; 12 + 13 + "tailscale-auth.age".publicKeys = [ 14 + koi 15 + seber 16 + ]; 17 + 18 + "vaultwarden.env.age".publicKeys = [ seber ]; 19 + "ssl-koi.cert.pem.age".publicKeys = [ seber ]; 20 + "ssl-koi.key.pem.age".publicKeys = [ seber ]; 21 + "ssl-ebil.cert.pem.age".publicKeys = [ seber ]; 22 + "ssl-ebil.key.pem.age".publicKeys = [ seber ]; 23 + }
secrets/ssl-ebil.cert.pem.age

This is a binary file and will not be displayed.

secrets/ssl-ebil.key.pem.age

This is a binary file and will not be displayed.

secrets/ssl-koi.cert.pem.age

This is a binary file and will not be displayed.

secrets/ssl-koi.key.pem.age

This is a binary file and will not be displayed.

+7
secrets/tailscale-auth.age
··· 1 + age-encryption.org/v1 2 + -> ssh-ed25519 IU0gwQ N6K4OT9LFaSUFUudnhWOA1lQclnUdh1Oemmwg2bykGg 3 + WdySBJ00zq6As+pWiTODDiEHG+pwhLM3T0C3gM0cmg8 4 + -> ssh-ed25519 RUuPCw f+cFxTSOwEAyh6wJ5dayavEd00q30MgUlw59FB5BPWA 5 + Jq4DM6zmBbCu8urWGBMQsGAaY+BHC45JdFfqfRgB1l0 6 + --- xpfE8WfQB24ljql333s7h9GG9ZRthooaRoeSIfwImLY 7 + �ޕ�k�b����|o��=�"Ҏ=���J�E�^�ԂG��%;��%�J�w�%����ԯFa�&���k��~��t2���uϑi �1�
secrets/tranquil.env.age

This is a binary file and will not be displayed.

secrets/vaultwarden.env.age

This is a binary file and will not be displayed.

+42
systems/miku/default.nix
··· 1 + { 2 + pkgs, 3 + ... 4 + }: 5 + 6 + { 7 + imports = [ 8 + ./hardware.nix 9 + ./services 10 + ./programs 11 + ]; 12 + 13 + boot.loader.systemd-boot.enable = true; 14 + 15 + time.timeZone = "Europe/Warsaw"; 16 + i18n.defaultLocale = "en_US.UTF-8"; 17 + 18 + networking.hostName = "miku"; 19 + 20 + services.xserver.xkb = { 21 + layout = "us"; 22 + }; 23 + 24 + environment.systemPackages = with pkgs; [ 25 + prismlauncher 26 + (retroarch.withCores ( 27 + cores: with cores; [ 28 + gpsp 29 + gambatte 30 + genesis-plus-gx 31 + fceumm 32 + snes9x 33 + desmume 34 + melonds 35 + flycast 36 + dolphin 37 + ppsspp 38 + beetle-psx 39 + ] 40 + )) 41 + ]; 42 + }
+68
systems/miku/hardware.nix
··· 1 + { 2 + config, 3 + lib, 4 + modulesPath, 5 + ... 6 + }: 7 + 8 + { 9 + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; 10 + 11 + boot.initrd.availableKernelModules = [ 12 + "xhci_pci" 13 + "ehci_pci" 14 + "ahci" 15 + "usbhid" 16 + "usb_storage" 17 + "sd_mod" 18 + ]; 19 + boot.initrd.kernelModules = [ ]; 20 + boot.kernelModules = [ "kvm-intel" ]; 21 + boot.extraModulePackages = [ ]; 22 + 23 + fileSystems."/" = { 24 + device = "/dev/disk/by-uuid/69b512d4-2e73-434a-9ae2-1ff112467faa"; 25 + fsType = "ext4"; 26 + }; 27 + 28 + fileSystems."/boot" = { 29 + device = "/dev/disk/by-uuid/EFD2-C33E"; 30 + fsType = "vfat"; 31 + options = [ 32 + "fmask=0022" 33 + "dmask=0022" 34 + ]; 35 + }; 36 + 37 + swapDevices = [ { device = "/dev/disk/by-uuid/2c68cacc-4813-4d63-aa7c-763c1eef0960"; } ]; 38 + 39 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 40 + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 41 + 42 + hardware = { 43 + graphics = { 44 + enable = true; 45 + enable32Bit = true; 46 + }; 47 + 48 + nvidia = { 49 + modesetting.enable = true; 50 + powerManagement.enable = true; 51 + open = true; 52 + nvidiaSettings = false; 53 + }; 54 + }; 55 + 56 + environment.sessionVariables = { 57 + LIBVA_DRIVER_NAME = "nvidia"; 58 + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; 59 + 60 + VK_DRIVER_FILES = "/run/opengl-driver/share/vulkan/icd.d/nvidia_icd.x86_64.json"; 61 + 62 + # QtWebEngine 6.10.2 incorrectly detects GBM as unsupported and falls back to Vulkan which 63 + # breaks Chromium applications. See https://github.com/NixOS/nixpkgs/issues/508998 64 + QTWEBENGINE_FORCE_USE_GBM = "1"; 65 + }; 66 + 67 + services.xserver.videoDrivers = [ "nvidia" ]; 68 + }
+7
systems/miku/programs/default.nix
··· 1 + { 2 + imports = [ 3 + ./msmtp.nix 4 + ./steam.nix 5 + ./gamemode.nix 6 + ]; 7 + }
+3
systems/miku/programs/gamemode.nix
··· 1 + { 2 + programs.gamemode.enable = true; 3 + }
+20
systems/miku/programs/msmtp.nix
··· 1 + { config, ... }: 2 + { 3 + age.secrets.email-pass-noreply = { 4 + file = ../../../secrets/email-pass-noreply.age; 5 + owner = "tranquil-pds"; 6 + }; 7 + programs.msmtp = { 8 + enable = true; 9 + accounts.default = { 10 + host = "smtp.purelymail.com"; 11 + port = 587; 12 + auth = true; 13 + tls = true; 14 + tls_starttls = true; 15 + from = "noreply@koi.rip"; 16 + user = "noreply@koi.rip"; 17 + passwordeval = "cat ${config.age.secrets.email-pass-noreply.path}"; 18 + }; 19 + }; 20 + }
+8
systems/miku/programs/steam.nix
··· 1 + { pkgs, ... }: 2 + { 3 + programs.steam = { 4 + enable = true; 5 + extraCompatPackages = [ pkgs.proton-ge-bin ]; 6 + remotePlay.openFirewall = true; 7 + }; 8 + }
+24
systems/miku/services/cloudflared.nix
··· 1 + { pkgs, ... }: 2 + { 3 + age.secrets.cloudflared.file = ../../../secrets/cloudflared.pem.age; 4 + systemd.services.cloudflared = { 5 + description = "cloudflare tunnel"; 6 + after = [ "jellyfin.service" ]; 7 + 8 + script = '' 9 + export TUNNEL_ORIGIN_CERT=/run/agenix/cloudflared 10 + 11 + cloudflared=${pkgs.cloudflared}/bin/cloudflared 12 + token=$($cloudflared tunnel token jelly) 13 + 14 + $cloudflared tunnel run --token $token 15 + ''; 16 + 17 + wantedBy = [ "multi-user.target" ]; 18 + 19 + serviceConfig = { 20 + Restart = "on-failure"; 21 + RestartSec = 60; 22 + }; 23 + }; 24 + }
+9
systems/miku/services/default.nix
··· 1 + { 2 + imports = [ 3 + ./logind.nix 4 + ./jellyfin.nix 5 + ./cloudflared.nix 6 + ./tranquil-pds.nix 7 + ./seberjune.nix 8 + ]; 9 + }
+6
systems/miku/services/jellyfin.nix
··· 1 + { 2 + services.jellyfin = { 3 + enable = true; 4 + openFirewall = true; 5 + }; 6 + }
+6
systems/miku/services/logind.nix
··· 1 + { 2 + services.logind.settings.Login = { 3 + HandlePowerKey = "ignore"; 4 + HandlePowerKeyLongPress = "ignore"; 5 + }; 6 + }
+5
systems/miku/services/seberjune.nix
··· 1 + { inputs, ... }: 2 + { 3 + imports = [ inputs.seberjune.nixosModules.default ]; 4 + services.seberjune.enable = true; 5 + }
+40
systems/miku/services/tranquil-pds.nix
··· 1 + { 2 + inputs, 3 + config, 4 + pkgs, 5 + ... 6 + }: 7 + { 8 + imports = [ inputs.tranquil-pds.nixosModules.tranquil-pds ]; 9 + 10 + age.secrets.tranquil-env = { 11 + file = ../../../secrets/tranquil.env.age; 12 + owner = "tranquil-pds"; 13 + }; 14 + 15 + services.tranquil-pds = { 16 + enable = true; 17 + database.createLocally = true; 18 + environmentFiles = [ config.age.secrets.tranquil-env.path ]; 19 + user = "tranquil-pds"; 20 + settings = { 21 + server = { 22 + host = "127.0.0.1"; 23 + port = 8830; 24 + hostname = "pds.ebil.club"; 25 + max_blob_size = 1073741824; # 1 GiB 26 + user_handle_domains = [ ]; 27 + available_user_domains = [ ]; 28 + age_assurance_override = true; 29 + invite_code_required = true; 30 + report_service_url = "https://ozone.wizardry.systems"; 31 + report_service_did = "did:plc:yfklixyvt4y3irrkdb4mtvqn"; 32 + }; 33 + email = { 34 + from_address = "noreply@koi.rip"; 35 + from_name = "ebil.club PDS"; 36 + sendmail_path = "${pkgs.msmtp}/bin/sendmail"; 37 + }; 38 + }; 39 + }; 40 + }
+70
systems/seber/default.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ 5 + ./hardware.nix 6 + ./services 7 + ]; 8 + 9 + boot.loader.grub = { 10 + enable = true; 11 + device = "/dev/vda"; 12 + }; 13 + 14 + time.timeZone = "UTC"; 15 + i18n.defaultLocale = "en_US.UTF-8"; 16 + 17 + networking = { 18 + hostName = "seber"; 19 + firewall.allowedTCPPorts = [ 20 + 80 21 + 443 22 + ]; 23 + }; 24 + 25 + environment.systemPackages = with pkgs; [ 26 + linuxquota 27 + vim 28 + htop 29 + ]; 30 + 31 + system.activationScripts.quotas = { 32 + deps = [ ]; 33 + text = '' 34 + echo 35 + ${pkgs.linuxquota}/bin/quotacheck -aumv || true 36 + ${pkgs.linuxquota}/bin/quotaon -auv || true 37 + for user in $(getent passwd | grep /var/ebil.club | cut -d: -f1); do 38 + echo "setting quota for $user" 39 + ${pkgs.linuxquota}/bin/setquota -u $user 8M 10M 0 0 / || true 40 + done 41 + echo 42 + ''; 43 + }; 44 + 45 + age = { 46 + identityPaths = [ "/etc/ssh/ssh_host_ed25519_key" ]; 47 + secrets = { 48 + ssl-koi-cert = { 49 + file = ../../secrets/ssl-koi.cert.pem.age; 50 + mode = "0440"; 51 + group = "nginx"; 52 + }; 53 + ssl-koi-key = { 54 + file = ../../secrets/ssl-koi.key.pem.age; 55 + mode = "0440"; 56 + group = "nginx"; 57 + }; 58 + ssl-ebil-cert = { 59 + file = ../../secrets/ssl-ebil.cert.pem.age; 60 + mode = "0440"; 61 + group = "nginx"; 62 + }; 63 + ssl-ebil-key = { 64 + file = ../../secrets/ssl-ebil.key.pem.age; 65 + mode = "0440"; 66 + group = "nginx"; 67 + }; 68 + }; 69 + }; 70 + }
+39
systems/seber/hardware.nix
··· 1 + { 2 + config, 3 + lib, 4 + pkgs, 5 + modulesPath, 6 + ... 7 + }: 8 + 9 + { 10 + imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; 11 + 12 + boot.initrd.availableKernelModules = [ 13 + "ata_piix" 14 + "uhci_hcd" 15 + "virtio_pci" 16 + "sr_mod" 17 + "virtio_blk" 18 + ]; 19 + boot.initrd.kernelModules = [ ]; 20 + boot.kernelModules = [ ]; 21 + boot.extraModulePackages = [ ]; 22 + 23 + fileSystems."/" = { 24 + device = "/dev/disk/by-uuid/9bc4dce8-4cbe-49e2-bd9f-12542c3361fe"; 25 + fsType = "ext4"; 26 + options = [ 27 + "usrquota" 28 + "jqfmt=vfsv0" 29 + ]; 30 + }; 31 + 32 + swapDevices = [ 33 + { device = "/dev/disk/by-uuid/3a56df3a-5226-4016-8ba0-ddd979c60c8c"; } 34 + ]; 35 + 36 + networking.useDHCP = lib.mkDefault true; 37 + 38 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 39 + }
+14
systems/seber/services/default.nix
··· 1 + { 2 + imports = [ 3 + ./tailscale.nix 4 + ./nginx.nix 5 + ./website.nix 6 + ./junesite.nix 7 + ./lebel.nix 8 + ./mimi.nix 9 + ./robin.nix 10 + ./pvzge.nix 11 + ./vaultwarden.nix 12 + ./ebil-club.nix 13 + ]; 14 + }
+153
systems/seber/services/ebil-club.nix
··· 1 + { lib, pkgs, ... }: 2 + 3 + let 4 + tls = { 5 + forceSSL = true; 6 + sslCertificate = "/run/agenix/ssl-ebil-cert"; 7 + sslCertificateKey = "/run/agenix/ssl-ebil-key"; 8 + }; 9 + 10 + mkSite = 11 + { 12 + name, 13 + sshPubkeys, 14 + canonical ? null, 15 + customPaths ? { }, 16 + }: 17 + let 18 + defaultHost = "${name}.ebil.club"; 19 + servedHost = if canonical != null then canonical else defaultHost; 20 + 21 + home = "/var/ebil.club/${name}"; 22 + rootDir = "${home}/root"; 23 + 24 + customLocations = lib.mapAttrs' (dir: p: { 25 + name = "/${dir}/"; 26 + value = { 27 + alias = "${home}/${p}/"; 28 + extraConfig = '' 29 + try_files $uri $uri/ =404; 30 + '' 31 + + lib.optionalString (dir == "xrpc") '' 32 + default_type application/json; 33 + ''; 34 + }; 35 + }) customPaths; 36 + in 37 + { 38 + services.nginx.virtualHosts = { 39 + "${servedHost}" = ( 40 + { 41 + locations = { 42 + "/" = { 43 + root = rootDir; 44 + index = "index.html"; 45 + extraConfig = "try_files $uri $uri/ =404;"; 46 + }; 47 + "= /" = { 48 + extraConfig = '' 49 + if ($http_user_agent ~* "curl") { 50 + return 302 /index.txt; 51 + } 52 + ''; 53 + }; 54 + "/index.txt" = { 55 + root = rootDir; 56 + extraConfig = "try_files /index.txt @curl_fallback;"; 57 + }; 58 + "@curl_fallback".return = 59 + "200 'hi! this site is best viewed in a web browser :3 if u still want to curl it, try setting a different user-agent header'"; 60 + } 61 + // customLocations; 62 + extraConfig = "error_page 404 /404.html;"; 63 + } 64 + // tls 65 + ); 66 + } 67 + // lib.optionalAttrs (canonical != null) { 68 + "${defaultHost}" = ( 69 + { 70 + locations."/".return = "307 https://${canonical}$request_uri"; 71 + } 72 + // tls 73 + ); 74 + }; 75 + 76 + users = { 77 + groups."${name}" = { }; 78 + users."${name}" = { 79 + inherit home; 80 + createHome = false; 81 + isNormalUser = true; 82 + hashedPassword = "!"; 83 + group = name; 84 + openssh.authorizedKeys.keys = map ( 85 + key: 86 + ''command="${pkgs.rrsync}/bin/rrsync ~",restrict,no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ${key}'' 87 + ) sshPubkeys; 88 + }; 89 + }; 90 + 91 + systemd.tmpfiles.rules = [ 92 + "d ${home} 0750 ${name} nginx -" 93 + "d ${home}/root 2750 ${name} nginx -" 94 + ] 95 + ++ lib.mapAttrsToList (dir: _: "d ${home}/${dir} 2750 ${name} nginx -") customPaths; 96 + }; 97 + in 98 + { 99 + imports = [ 100 + (mkSite { 101 + name = "seba"; 102 + sshPubkeys = [ 103 + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN7xlBanf8BNQXosqGT5QroBntpFUsy3g12fO/fPE414" 104 + ]; 105 + }) 106 + (mkSite { 107 + name = "evergarden"; 108 + sshPubkeys = [ 109 + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAyvnWmxdPq+ztt2GevfT+Yc4E6X/uSHc4tfD2nwc1vq" 110 + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIObkVYhnLifnkE+0N07BH9mu0WJ1WWoGg3WM8wNn2ar" 111 + ]; 112 + canonical = "evergarden.moe"; 113 + customPaths = { 114 + gitea = "gitea"; 115 + userstyles = "userstyles"; 116 + 117 + ".well-known" = "bsky-feed/.well-known"; 118 + "xrpc" = "bsky-feed/xrpc"; 119 + }; 120 + }) 121 + (mkSite { 122 + name = "nunikii"; 123 + sshPubkeys = [ 124 + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDY0nHqaw1FriPBnK/hsdVGO69RGu6k/FAYNtUmYCEUS3MN0+loQWRwV2zk0KlWwIP/sMtWH/QjX5oNGpSt9Oj9jmfjgdPkQcl+4B/u93V6wK6Xl+5FufkXbtzENakPQVLX4INyZ9gViuRE4eguPFeRYSckcboxfeqlM24OUT7gvtn4r3z6c0Yx8qit/GVn1F7/ozi0lrSGknEVFUr3ewoQZWm7rpd9SjbTutqLtX6quEQzn6GG/wNxUodnIPwflGgBlfzej2SekuzLvnE1VfaaBvzOZei4VdvY7JrbKN+zlkmuKtEaZB7fkwOxegHsFRxLjSzLasI84wbWt38KTlDxPLjWPq62rJZOnI1XILCUamt9fSTraDfYeHeTCjrlKKctX0l4fvMLG4ZE1wHsELShisZuN4dPb1BqTgEL3s7n60kXG4TTUbo/frXocVf7PX1QINfnWkUPXT4fWkhYV0XALqBpnXs9XJXbk7dCWoWIuwm8+R2svcGvdiIrVGMy9cCP4bIqNzZ7NlOAvIysgmnLcv5GsTv7YfBXrJFnBXScsacqJaH3BLVg+zVYXKvokjZJ0mEa260aMqJDS7lK+xbnBhwH3B+tOAaR7ZoB0c1j2JyFOjTLL9K1uw0dRyQB4b0ZWQ08ByNi1rYT/FHBHU/Jl1rocEUgwmUDFNFufIMwZQ==" 125 + ]; 126 + }) 127 + ]; 128 + 129 + services.nginx.virtualHosts = { 130 + "_" = { 131 + locations."/".return = "307 https://ebil.club"; 132 + default = true; 133 + } 134 + // tls; 135 + 136 + "ebil.club" = { 137 + locations = { 138 + "/" = { 139 + root = "/var/ebil.club/ebil.club"; 140 + index = "index.html"; 141 + extraConfig = "try_files $uri $uri/ =404;"; 142 + }; 143 + }; 144 + extraConfig = "error_page 404 /404.html;"; 145 + } 146 + // tls; 147 + }; 148 + 149 + systemd.tmpfiles.rules = [ 150 + "d /var/ebil.club 0755 root root -" 151 + "d /var/ebil.club/ebil.club 2750 koi nginx -" 152 + ]; 153 + }
+23
systems/seber/services/junesite.nix
··· 1 + { 2 + systemd.services.junesite = { 3 + description = "meow"; 4 + after = [ "network.target" ]; 5 + wantedBy = [ "multi-user.target" ]; 6 + 7 + serviceConfig = { 8 + ExecStart = "/var/junesite/junesite/bin/junesite"; 9 + WorkingDirectory = "/var/junesite"; 10 + Restart = "on-failure"; 11 + RestartSec = 10; 12 + }; 13 + }; 14 + 15 + services.nginx.virtualHosts."june.xn--q9jyb4c" = { 16 + locations."/".proxyPass = "http://127.0.0.1:8282"; 17 + forceSSL = true; 18 + sslCertificate = "/run/agenix/ssl-koi-cert"; 19 + sslCertificateKey = "/run/agenix/ssl-koi-key"; 20 + }; 21 + 22 + systemd.tmpfiles.rules = [ "d /var/junesite 2750 koi users -" ]; 23 + }
+43
systems/seber/services/lebel.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + systemd.services.lebel = { 5 + description = "lebel"; 6 + after = [ "network.target" ]; 7 + wantedBy = [ "multi-user.target" ]; 8 + path = [ pkgs.nodejs ]; 9 + 10 + serviceConfig = { 11 + User = "koi"; 12 + Group = "users"; 13 + ExecStart = "${pkgs.nodejs}/bin/node --env-file /var/lebel/.env /var/lebel/build/main.js"; 14 + WorkingDirectory = "/var/lebel"; 15 + Restart = "on-failure"; 16 + RestartSec = 10; 17 + }; 18 + }; 19 + 20 + services.nginx.virtualHosts."lebel.ebil.club" = { 21 + locations = { 22 + "= /".return = "301 https://ebil.club"; 23 + "/" = { 24 + proxyPass = "http://127.0.0.1:14831"; 25 + extraConfig = '' 26 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 27 + proxy_set_header X-Forwarded-Proto $scheme; 28 + proxy_set_header X-Real-IP $remote_addr; 29 + proxy_set_header Host $host; 30 + 31 + proxy_http_version 1.1; 32 + proxy_set_header Upgrade $http_upgrade; 33 + proxy_set_header Connection "upgrade"; 34 + ''; 35 + }; 36 + }; 37 + forceSSL = true; 38 + sslCertificate = "/run/agenix/ssl-ebil-cert"; 39 + sslCertificateKey = "/run/agenix/ssl-ebil-key"; 40 + }; 41 + 42 + systemd.tmpfiles.rules = [ "d /var/lebel 2750 koi users -" ]; 43 + }
+20
systems/seber/services/mimi.nix
··· 1 + { 2 + systemd.services.mimi = { 3 + description = "mimi tne discord bot"; 4 + after = [ "network.target" ]; 5 + wantedBy = [ "multi-user.target" ]; 6 + 7 + script = '' 8 + export $(cat .env | xargs) 9 + ./mimi/bin/mimi 10 + ''; 11 + 12 + serviceConfig = { 13 + WorkingDirectory = "/var/mimi"; 14 + Restart = "on-failure"; 15 + RestartSec = 60; 16 + }; 17 + }; 18 + 19 + systemd.tmpfiles.rules = [ "d /var/mimi 2750 koi users -" ]; 20 + }
+3
systems/seber/services/nginx.nix
··· 1 + { 2 + services.nginx.enable = true; 3 + }
+44
systems/seber/services/pvzge.nix
··· 1 + { pkgs, ... }: 2 + let 3 + root = "/var/pvzge"; 4 + upstream = "https://github.com/Gzh0821/pvzge_web.git"; 5 + branch = "master"; 6 + in 7 + { 8 + services.nginx.virtualHosts."pvzge.june.xn--q9jyb4c" = { 9 + locations."/".root = "${root}/docs"; 10 + forceSSL = true; 11 + sslCertificate = "/run/agenix/ssl-ebil-cert"; 12 + sslCertificateKey = "/run/agenix/ssl-ebil-key"; 13 + }; 14 + 15 + systemd.timers.pvzge-update = { 16 + wantedBy = [ "timers.target" ]; 17 + timerConfig = { 18 + OnCalendar = "weekly"; 19 + Unit = "pvzge-update.service"; 20 + }; 21 + }; 22 + 23 + systemd.services.pvzge-update = { 24 + description = "update pvzge files"; 25 + after = [ "network.target" ]; 26 + wantedBy = [ "multi-user.target" ]; 27 + path = [ pkgs.git ]; 28 + serviceConfig = { 29 + Type = "oneshot"; 30 + User = "koi"; 31 + Group = "nginx"; 32 + WorkingDirectory = root; 33 + }; 34 + script = '' 35 + if [[ -d .git ]]; then 36 + ${pkgs.git}/bin/git pull --ff-only ${upstream} ${branch} 37 + else 38 + ${pkgs.git}/bin/git clone --branch=${branch} --depth=1 ${upstream} . 39 + fi 40 + ''; 41 + }; 42 + 43 + systemd.tmpfiles.rules = [ "d ${root} 2750 koi nginx -" ]; 44 + }
+75
systems/seber/services/robin.nix
··· 1 + { lib, config, ... }: 2 + 3 + let 4 + tls = { 5 + forceSSL = true; 6 + sslCertificate = "/run/agenix/ssl-ebil-cert"; 7 + sslCertificateKey = "/run/agenix/ssl-ebil-key"; 8 + }; 9 + in 10 + { 11 + nix.settings.trusted-users = [ "robin" ]; 12 + 13 + users = { 14 + groups.robin = { }; 15 + users.robin = { 16 + hashedPassword = lib.mkForce "!"; 17 + openssh.authorizedKeys.keys = lib.mkForce [ 18 + "no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDeSHaoF0Qs1G8JO/enOo2vxzkvvOqAMZPG2DX7TgG8u" 19 + ]; 20 + }; 21 + }; 22 + 23 + systemd.user.services.maivi = { 24 + description = "maivi :3"; 25 + after = [ "network.target" ]; 26 + wantedBy = [ "multi-user.target" ]; 27 + 28 + environment.MAIVI_PORT = "5452"; 29 + 30 + unitConfig.ConditionUser = "robin"; 31 + serviceConfig = { 32 + ExecStart = "${config.users.users.robin.home}/maivi"; 33 + WorkingDirectory = "${config.users.users.robin.home}/.maivi"; 34 + Restart = "on-failure"; 35 + RestartSec = 20; 36 + }; 37 + }; 38 + 39 + systemd.tmpfiles.rules = [ "d ${config.users.users.robin.home}/.maivi 0750 robin users -" ]; 40 + 41 + services.nginx.virtualHosts = { 42 + "robinwobin.dev" = ( 43 + { 44 + locations."/" = { 45 + proxyPass = "http://127.0.0.1:5452"; 46 + extraConfig = '' 47 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 48 + proxy_set_header X-Forwarded-Proto $scheme; 49 + proxy_set_header Host $host; 50 + ''; 51 + }; 52 + } 53 + // tls 54 + ); 55 + "start.robinwobin.dev" = ( 56 + { 57 + locations = { 58 + "/" = { 59 + root = "/var/ebil.club/robin/start"; 60 + index = "index.html"; 61 + extraConfig = "try_files $uri $uri/ @fallback;"; 62 + }; 63 + "@fallback".return = "302 https://robinwobin.dev$request_uri"; 64 + }; 65 + } 66 + // tls 67 + ); 68 + "robin.ebil.club" = ( 69 + { 70 + locations."/".return = "307 https://robinwobin.dev$request_uri"; 71 + } 72 + // tls 73 + ); 74 + }; 75 + }
+7
systems/seber/services/tailscale.nix
··· 1 + { config, ... }: 2 + { 3 + services.tailscale = { 4 + enable = true; 5 + authKeyFile = config.age.secrets.tailscale-auth.path; 6 + }; 7 + }
+34
systems/seber/services/vaultwarden.nix
··· 1 + { config, ... }: 2 + { 3 + age.secrets.vaultwarden-env = { 4 + file = ../../../secrets/vaultwarden.env.age; 5 + owner = "vaultwarden"; 6 + }; 7 + 8 + services.vaultwarden = { 9 + enable = true; 10 + environmentFile = config.age.secrets.vaultwarden-env.path; 11 + config = { 12 + DOMAIN = "https://vault.koi.rip"; 13 + SIGNUPS_ALLOWED = false; 14 + ROCKET_ADDRESS = "127.0.0.1"; 15 + ROCKET_PORT = 8222; 16 + ROCKET_LOG = "critical"; 17 + LOG_LEVEL = "warn"; 18 + }; 19 + }; 20 + 21 + services.nginx.virtualHosts."vault.koi.rip" = { 22 + locations."/" = { 23 + proxyPass = "http://127.0.0.1:8222"; 24 + extraConfig = '' 25 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 26 + proxy_set_header X-Forwarded-Proto $scheme; 27 + proxy_set_header Host $host; 28 + ''; 29 + }; 30 + forceSSL = true; 31 + sslCertificate = "/run/agenix/ssl-koi-cert"; 32 + sslCertificateKey = "/run/agenix/ssl-koi-key"; 33 + }; 34 + }
+30
systems/seber/services/website.nix
··· 1 + { 2 + systemd.services.website = { 3 + description = "my site :3"; 4 + after = [ "network.target" ]; 5 + wantedBy = [ "multi-user.target" ]; 6 + 7 + serviceConfig = { 8 + ExecStart = "/var/website/website/bin/website"; 9 + WorkingDirectory = "/var/website"; 10 + Restart = "on-failure"; 11 + RestartSec = 10; 12 + }; 13 + }; 14 + 15 + services.nginx.virtualHosts."koi.rip" = { 16 + locations."/" = { 17 + proxyPass = "http://127.0.0.1:8000"; 18 + extraConfig = '' 19 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 20 + proxy_set_header X-Forwarded-Proto $scheme; 21 + proxy_set_header Host $host; 22 + ''; 23 + }; 24 + forceSSL = true; 25 + sslCertificate = "/run/agenix/ssl-koi-cert"; 26 + sslCertificateKey = "/run/agenix/ssl-koi-key"; 27 + }; 28 + 29 + systemd.tmpfiles.rules = [ "d /var/website 2750 koi users -" ]; 30 + }
+20
systems/teto/default.nix
··· 1 + { pkgs, ... }: 2 + 3 + { 4 + imports = [ ./hardware.nix ]; 5 + 6 + boot.loader.systemd-boot.enable = true; 7 + 8 + time.timeZone = "Europe/Warsaw"; 9 + i18n.defaultLocale = "en_US.UTF-8"; 10 + 11 + networking.hostName = "teto"; 12 + 13 + services.xserver.xkb = { 14 + layout = "us"; 15 + }; 16 + 17 + environment.systemPackages = with pkgs; [ 18 + brightnessctl 19 + ]; 20 + }
+58
systems/teto/hardware.nix
··· 1 + # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 + # and may be overwritten by future invocations. Please make changes 3 + # to /etc/nixos/configuration.nix instead. 4 + { 5 + config, 6 + lib, 7 + pkgs, 8 + modulesPath, 9 + ... 10 + }: 11 + 12 + { 13 + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; 14 + 15 + boot.initrd.availableKernelModules = [ 16 + "xhci_pci" 17 + "thunderbolt" 18 + "vmd" 19 + "ahci" 20 + "nvme" 21 + "usbhid" 22 + ]; 23 + boot.initrd.kernelModules = [ ]; 24 + boot.kernelModules = [ "kvm-intel" ]; 25 + boot.extraModulePackages = [ ]; 26 + 27 + fileSystems."/" = { 28 + device = "/dev/disk/by-uuid/6fc90ab5-4995-4927-b507-14c6953b1392"; 29 + fsType = "ext4"; 30 + }; 31 + 32 + fileSystems."/boot" = { 33 + device = "/dev/disk/by-uuid/CBA4-3CE2"; 34 + fsType = "vfat"; 35 + options = [ 36 + "fmask=0022" 37 + "dmask=0022" 38 + ]; 39 + }; 40 + 41 + swapDevices = [ { device = "/dev/disk/by-uuid/0dcdc8f5-638b-4b93-bdd0-453aa8af66d9"; } ]; 42 + 43 + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 44 + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 45 + 46 + hardware = { 47 + graphics = { 48 + enable = true; 49 + enable32Bit = true; 50 + extraPackages = with pkgs; [ 51 + intel-media-driver 52 + vpl-gpu-rt 53 + ]; 54 + }; 55 + }; 56 + 57 + services.xserver.videoDrivers = [ "modesetting" ]; 58 + }