├── LICENSE ├── README.md ├── flake.lock ├── flake.nix ├── hosts ├── default.nix ├── polaris │ ├── desktops │ │ ├── _gnome.nix │ │ ├── _hyprland.nix │ │ ├── _kde.nix │ │ └── cosmic.nix │ ├── hardware │ │ ├── hardware-configuration.nix │ │ └── system.nix │ ├── profiles.nix │ ├── programs │ │ ├── firefox.nix │ │ └── loose.nix │ └── specialisations │ │ └── focusMode.nix └── procyon │ ├── desktops │ ├── _hyprland.nix │ └── cosmic.nix │ ├── hardware │ ├── hardware-configuration.nix │ └── system.nix │ ├── profiles.nix │ ├── programs │ └── firefox.nix │ └── specialisations │ └── gamingMode.nix ├── modules ├── common │ ├── desktops │ │ ├── audio.nix │ │ ├── fonts.nix │ │ ├── keyboard.nix │ │ ├── pinyin.nix │ │ ├── sddm.nix │ │ └── theming │ │ │ ├── gtk.nix │ │ │ └── qt.nix │ ├── programs │ │ ├── _schizofox │ │ │ ├── schizofox.nix │ │ │ ├── search-engines.nix │ │ │ ├── theme.nix │ │ │ └── vertical-tabs.nix │ │ ├── firefox │ │ │ ├── firefox.nix │ │ │ ├── search-engines.nix │ │ │ ├── tab-groups.nix │ │ │ └── vertical-tabs.nix │ │ ├── git.nix │ │ ├── keyd.nix │ │ ├── nh.nix │ │ ├── novavim.nix │ │ ├── spotify │ │ │ ├── spicetify.nix │ │ │ └── spotify-player.nix │ │ └── terminal │ │ │ ├── alacritty.nix │ │ │ ├── foot.nix │ │ │ ├── nushell.nix │ │ │ └── starship.nix │ ├── system │ │ ├── bootloader.nix │ │ ├── caches.nix │ │ ├── drivers │ │ │ ├── graphics.nix │ │ │ ├── nvidia.nix │ │ │ ├── printing.nix │ │ │ └── via.nix │ │ ├── locales.nix │ │ ├── maintenance.nix │ │ ├── networking.nix │ │ └── nix.nix │ └── users │ │ ├── agenix.nix │ │ └── lunarnova.nix ├── desktops │ ├── cosmic │ │ ├── apps │ │ │ └── files.nix │ │ ├── config.nix │ │ ├── cosmic.nix │ │ ├── greeter.nix │ │ ├── module.nix │ │ └── settings.nix │ ├── couch │ │ ├── gaming.nix │ │ └── module.nix │ ├── gnome │ │ ├── apps │ │ │ └── exclude.nix │ │ ├── config.nix │ │ ├── extensions │ │ │ ├── appindicator.nix │ │ │ ├── blur-my-shell.nix │ │ │ └── extensions.nix │ │ ├── gdm.nix │ │ ├── gnome.nix │ │ └── module.nix │ ├── hyprland │ │ ├── apps │ │ │ └── nemo.nix │ │ ├── astal │ │ │ └── src │ │ │ │ ├── .gitignore │ │ │ │ ├── app.ts │ │ │ │ ├── env.d.ts │ │ │ │ ├── package.json │ │ │ │ ├── style.scss │ │ │ │ ├── tsconfig.json │ │ │ │ └── widget │ │ │ │ └── Bar │ │ │ │ ├── Bar.tsx │ │ │ │ └── elements │ │ │ │ ├── AppMenu.tsx │ │ │ │ ├── Power.tsx │ │ │ │ ├── SysTray.tsx │ │ │ │ ├── Time.tsx │ │ │ │ └── Workspaces.tsx │ │ ├── binds.nix │ │ ├── config.nix │ │ ├── hyprland.nix │ │ ├── module.nix │ │ ├── optionals │ │ │ ├── gaming.nix │ │ │ ├── nvidia.nix │ │ │ ├── powersave.nix │ │ │ └── smartgaps.nix │ │ ├── rules.nix │ │ └── utils │ │ │ ├── hypridle.nix │ │ │ ├── hyprpaper.nix │ │ │ ├── mako.nix │ │ │ ├── swaylock.nix │ │ │ └── tofi.nix │ └── kde │ │ ├── kde.nix │ │ └── module.nix ├── options │ ├── common │ │ ├── config │ │ │ ├── sysconf.nix │ │ │ └── terminal.nix │ │ └── programs │ │ │ ├── firefox.nix │ │ │ └── loose.nix │ ├── desktops │ │ ├── cosmic.nix │ │ ├── couch.nix │ │ ├── gnome.nix │ │ ├── hyprland.nix │ │ └── kde.nix │ └── profiles │ │ ├── gaming.nix │ │ ├── server.nix │ │ └── workstation.nix └── profiles │ ├── gaming │ ├── module.nix │ └── programs │ │ ├── element.nix │ │ ├── gamemode.nix │ │ ├── heroic-games-launcher.nix │ │ ├── lutris.nix │ │ ├── obs.nix │ │ ├── prism-launcher.nix │ │ ├── steam.nix │ │ └── vr.nix │ ├── server │ ├── module.nix │ └── services │ │ └── minecraft-server.nix │ └── workstation │ ├── module.nix │ └── programs │ ├── libreoffice.nix │ ├── obsidian.nix │ └── vscode.nix ├── parts ├── apps │ ├── default.nix │ └── lags.nix ├── default.nix ├── misc │ ├── default.nix │ └── formatter.nix ├── modules │ ├── default.nix │ └── theme.nix └── pkgs │ ├── default.nix │ └── packages │ ├── catppuccin-cosmic.nix │ └── ioshelfka.nix └── secrets ├── secrets.nix ├── spotifyClientID.age ├── spotifyPassword.age ├── userPassword.age └── wifiPassword.age /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lunix 2 | 3 | > [!IMPORTANT] 4 | > **Please star my repository if you find it helpful in your own configuration. 5 | > It's free.** 6 | 7 | Named "Lunix" as a portmanteau of my username, "Lunarnova," and "Nix," Lunix is 8 | my NixOS configuration I use on all my systems and plan to use on all future 9 | systems. 10 | 11 | Having used NixOS since 22 June 2024, Lunix has gone through many, many 12 | iterations and has become a passion project of mine. I am sure that, likewise, 13 | it will continue to be iterated upon, improved, and expanded. 14 | 15 | I have learned so much from it. I look forward to learning more. 16 | 17 |
18 | Structure
19 | Hosts
20 | Related Projects
21 | Credits 22 |
23 | 24 | > [!CAUTION] 25 | > I do not support you using my flake in your own systems. It is not designed 26 | > for that. I am not keeping it in mind for my development. I strongly 27 | > discourage using someone else's flakes in your configuration. Learn Nix, or 28 | > don't use NixOS. 29 | 30 | ## Structure 31 | 32 | Lunix is structured specifically to be logical and help me work with it. Here's 33 | a basic rundown: 34 | 35 | - [`flake.nix`] Nix Flake: The entry-point of my system. 36 | - [`parts`] Flake Modules: The parts of my flake that make up the whole, powered 37 | by [Flake Parts]. 38 | - [`pkgs`] Nixpkgs Overlay: Custom mkDerivations written by yours truly. 39 | - [`hosts`] System specific configuration: Mainly hardware configuration and 40 | specific option selection, especially defining the profiles. 41 | - [`modules`] Modular system configuration: The bulk of my system configuration. 42 | - [`common`] Modules that are generally made available to all my hosts. 43 | - [`desktops`] Desktop modules: Desktops installed and configured. 44 | - [`options`] Module Options: Configures what modules are disabled or enabled 45 | per system and per profile. 46 | - [`profiles`] Profile modules: Special programs, services, and configuration 47 | needed on each profile. 48 | - [`secrets`] Agenix Secrets Management. 49 | 50 | ### How the profiles work 51 | 52 | 1. Each profile has its own options for enabling and disabling apps and 53 | installing programs. 54 | 2. Each host can select which profiles' modules to import. 55 | 3. The profile itself can be enabled or disabled, and this sets the default 56 | option of its programs to be enabled or disabled by default. 57 | 58 | Credit to [@NotAShelf] for inspiration and references. 59 | 60 | ### Why don't you use Home Manager? 61 | 62 | [Home Manager] is a lovely tool for many people that helps manage their dotfiles 63 | for them. I used it myself for the first 6 months of my journey on NixOS. I then 64 | decided it was best to move away from it. With [@NotAShelf] and 65 | [@éclairevoyant]'s [Hjem], I successfully migrated from Home Manager and began 66 | managing my dotfiles myself. 67 | 68 | Home Manager has a few problems for me: 69 | 70 | 1. Abstracts too much, 71 | 2. Lengthens eval times, and 72 | 3. Can be a nightmare to work with. 73 | 74 | In the past, I believed its capabilities were worth the costs. Ultimately, 75 | however, I found an alternate solution and have never looked back. 76 | 77 | If you wish to do the same, I would consider this configuration to be a decent 78 | jumping-off point. You may also want to keep an eye on my currently WIP 79 | [Hjem Rum], a module collection for Hjem, offering options similar to Home 80 | Manager. This solves the latter two issues while acknowledging the fact that for 81 | many, the first issue is not a bug but a feature. 82 | 83 | ### I have a million other questions :c 84 | 85 | For a while, I tried to document and explain any quirky choices I made in my 86 | configuration. But at this point, I'm past my limit, and I'm adding more 87 | insanity to it by the week. While I have done my best to (and, I believe, a good 88 | job of) explaining my wacky decisions in the code with comments, if you still 89 | find yourself questioning yours or my sanity, or simply are struck by a wave of 90 | curiosity, feel free to reach out to me. 91 | 92 | [`flake.nix`]: ./flake.nix 93 | [`parts`]: ./parts 94 | [Flake Parts]: https://github.com/hercules-ci/flake-parts 95 | [`pkgs`]: ./parts/pkgs 96 | [`hosts`]: ./hosts 97 | [`modules`]: ./modules 98 | [`common`]: ./modules/common 99 | [`desktops`]: ./modules/desktops 100 | [`options`]: ./modules/options 101 | [`profiles`]: ./modules/profiles 102 | [`secrets`]: ./secrets 103 | [@NotAShelf]: https://github.com/NotAShelf 104 | [Home Manager]: https://github.com/nix-community/home-manager 105 | [@éclairevoyant]: https://github.com/eclairevoyant 106 | [Hjem]: https://github.com/feel-co/hjem 107 | [Hjem Rum]: https://github.com/snugnug/hjem-rum 108 | 109 | ## Hosts 110 | 111 | | Name | Description | Profiles | Type | 112 | | :-------- | :----------------------------------------------------------- | :-----------------: | :-----: | 113 | | [polaris] | Primary daily-driver: the first system I installed NixOS on. | Gaming, Workstation | Desktop | 114 | | [procyon] | Framework 13 laptop with a Ryzen 7040. | Workstation | Laptop | 115 | 116 | [polaris]: ./hosts/polaris 117 | [procyon]: ./hosts/procyon 118 | 119 | ## Related Projects 120 | 121 | Most people maintain everything in a monorepo―I am not one of those people. I 122 | began fracturing my Nix project(s) by starting my Neovim configuration in a 123 | separate repo, titled [Novavim]. I then realized that it would be nice to have 124 | full access to my extended library without needing to input my whole NixOS 125 | configuration. Thus, [Lunar's Libraries] was born. 126 | 127 | ### Novavim 128 | 129 | I moved my Neovim configuration into another repo primarily in order to make it 130 | easy for me to use it on any system without needing access to my NixOS 131 | configuration, and without needing to fully update to a newest version of my 132 | configuration (for when I make large, in-progress changes), and instead allow 133 | myself to simply run it from another repo. 134 | 135 | It is also a bit helpful as it allows me to more mentally separate the projects. 136 | While I use Nix to configure my Neovim, I view Novavim as a self-contained 137 | project, rather than as a part of my broader NixOS configuration. 138 | 139 | You can see more information over in [Novavim]. 140 | 141 | ### Lunar's (Nix) Libraries 142 | 143 | Rather than maintain my full extended library within this singular monorepo, I 144 | moved it into its own as well. Initially, this was so that I could use a 145 | function both in Lunix and in Novavim without needing to input Lunix, with all 146 | its unwieldy inputs and modules. Additionally, I simply find the mental 147 | separation to be gratifying. My extended library is a _toolset_, not a component 148 | of my configurations, whether in Lunix or Novavim. 149 | 150 | You can see more information over in [Lunar's Libraries]. 151 | 152 | [Novavim]: https://www.github.com/lunarnovaa/novavim 153 | [Lunar's Libraries]: https://www.github.com/lunarnovaa/lunarslib 154 | 155 | ## Credits 156 | 157 | No project is done alone. This is especially so in the FOSS World. I would like 158 | to credit and thank the following people for sharing their configuration, 159 | wisdom, or knowledge: 160 | 161 | ### The Originators of My Passion 162 | 163 | [@0atman], whose NixOS video first got me interested in the space. 164 | 165 | [@vimjoyer], for his videos, and for his public nixconf, which I learned and 166 | referenced for my own configuration early on. 167 | 168 | ### SNUG 169 | 170 | [@NotAShelf], for enough reasons that I am certain to leave something out. For 171 | his now archived [Nyx], for the extensive help and patience he has given me, and 172 | for being insane enough to do a lot that I have learned from. Much of my 173 | configuration is heavily inspired by his. 174 | 175 | [@PolarFill], for collaborating with me on [Hjem Rum] and providing me with his 176 | thoughts. 177 | 178 | [@nezia1], also for collaborating with me on [Hjem Rum], as well as for being a 179 | cool person. 180 | 181 | Many other members from [SNUG], who have collaborated with me on projects like 182 | [Hjem Rum] and also allowed me to engage with community to further pursue Nix. 183 | 184 | ### Other members of the NixOS community 185 | 186 | [@viperML], especially for his blogposts from which I learned to write 187 | mkDerivations, but also for his projects like [nh]. 188 | 189 | [@itslychee], for help on Discord. 190 | 191 | This list will be sure to grow, and I have probably missed people. So to 192 | everyone else I have interacted with on my Nix journey, thank you. 193 | 194 | [@0atman]: https://github.com/0atman 195 | [@vimjoyer]: https://github.com/vimjoyer 196 | [Nyx]: https://github.com/NotAShelf/Nyx 197 | [@PolarFill]: https://github.com/PolarFill 198 | [@nezia1]: https://github.com/nezia1 199 | [SNUG]: https://github.com/snugnug 200 | [@viperML]: https://github.com/viperML 201 | [nh]: https://github.com/viperML/nh 202 | [@itslychee]: https://github.com/itslychee 203 | 204 | ## Licensing 205 | 206 | Unless explicitly stated otherwise, all code within this repo is protected under 207 | [GPLv3]. If you use any of my code please give me credit with a comment, an 208 | optional mention in the README, and please give my repo a star. 209 | 210 | [GPLv3]: ./LICENSE 211 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "agenix": { 4 | "inputs": { 5 | "darwin": [], 6 | "home-manager": [], 7 | "nixpkgs": [ 8 | "nixpkgs" 9 | ], 10 | "systems": [ 11 | "systems" 12 | ] 13 | }, 14 | "locked": { 15 | "lastModified": 1747575206, 16 | "narHash": "sha256-NwmAFuDUO/PFcgaGGr4j3ozG9Pe5hZ/ogitWhY+D81k=", 17 | "owner": "ryantm", 18 | "repo": "agenix", 19 | "rev": "4835b1dc898959d8547a871ef484930675cb47f1", 20 | "type": "github" 21 | }, 22 | "original": { 23 | "owner": "ryantm", 24 | "repo": "agenix", 25 | "type": "github" 26 | } 27 | }, 28 | "ags": { 29 | "inputs": { 30 | "astal": [ 31 | "astal" 32 | ], 33 | "nixpkgs": [ 34 | "nixpkgs" 35 | ] 36 | }, 37 | "locked": { 38 | "lastModified": 1744557573, 39 | "narHash": "sha256-XAyj0iDuI51BytJ1PwN53uLpzTDdznPDQFG4RwihlTQ=", 40 | "owner": "aylur", 41 | "repo": "ags", 42 | "rev": "3ed9737bdbc8fc7a7c7ceef2165c9109f336bff6", 43 | "type": "github" 44 | }, 45 | "original": { 46 | "owner": "aylur", 47 | "repo": "ags", 48 | "type": "github" 49 | } 50 | }, 51 | "aquamarine": { 52 | "inputs": { 53 | "hyprutils": [ 54 | "hyprland", 55 | "hyprutils" 56 | ], 57 | "hyprwayland-scanner": [ 58 | "hyprland", 59 | "hyprwayland-scanner" 60 | ], 61 | "nixpkgs": [ 62 | "hyprland", 63 | "nixpkgs" 64 | ], 65 | "systems": [ 66 | "hyprland", 67 | "systems" 68 | ] 69 | }, 70 | "locked": { 71 | "lastModified": 1737636397, 72 | "narHash": "sha256-F5MbBj3QVorycVSFE9qjuOTLtIQBqt2VWbXa0uwzm98=", 73 | "owner": "hyprwm", 74 | "repo": "aquamarine", 75 | "rev": "7fe006981fae53e931f513026fc754e322f13145", 76 | "type": "github" 77 | }, 78 | "original": { 79 | "owner": "hyprwm", 80 | "repo": "aquamarine", 81 | "type": "github" 82 | } 83 | }, 84 | "astal": { 85 | "inputs": { 86 | "nixpkgs": [ 87 | "nixpkgs" 88 | ] 89 | }, 90 | "locked": { 91 | "lastModified": 1747093850, 92 | "narHash": "sha256-SaHAtzUyfm4urAcUEZlBFn7dWhoDqA6kaeFZ11CCTf8=", 93 | "owner": "aylur", 94 | "repo": "astal", 95 | "rev": "4820a3e37cc8eb81db6ed991528fb23472a8e4de", 96 | "type": "github" 97 | }, 98 | "original": { 99 | "owner": "aylur", 100 | "repo": "astal", 101 | "type": "github" 102 | } 103 | }, 104 | "basix": { 105 | "inputs": { 106 | "flake-compat": [ 107 | "flake-compat" 108 | ], 109 | "flake-parts": [ 110 | "flake-parts" 111 | ], 112 | "nixpkgs": [ 113 | "nixpkgs" 114 | ] 115 | }, 116 | "locked": { 117 | "lastModified": 1747453230, 118 | "narHash": "sha256-pOL3Eg82Bzaj+x3RhPEQfGZiHiRB4z/B+cESOSjt7oM=", 119 | "owner": "notashelf", 120 | "repo": "basix", 121 | "rev": "319338fcebfaeb7434aba0ebf275e677d17ac85f", 122 | "type": "github" 123 | }, 124 | "original": { 125 | "owner": "notashelf", 126 | "repo": "basix", 127 | "type": "github" 128 | } 129 | }, 130 | "curd": { 131 | "inputs": { 132 | "nixpkgs": [ 133 | "niqspkgs", 134 | "nixpkgs" 135 | ], 136 | "systems": [ 137 | "niqspkgs", 138 | "systems" 139 | ] 140 | }, 141 | "locked": { 142 | "lastModified": 1744903352, 143 | "narHash": "sha256-nxWkiFccqbFkvh4wemMUKyYqufNs3LT8DSL/yqfBQys=", 144 | "owner": "Wraient", 145 | "repo": "curd", 146 | "rev": "4d9874c1c462be98d472240213c02408d67c93a0", 147 | "type": "github" 148 | }, 149 | "original": { 150 | "owner": "Wraient", 151 | "repo": "curd", 152 | "type": "github" 153 | } 154 | }, 155 | "flake-compat": { 156 | "locked": { 157 | "lastModified": 1747046372, 158 | "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", 159 | "owner": "edolstra", 160 | "repo": "flake-compat", 161 | "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", 162 | "type": "github" 163 | }, 164 | "original": { 165 | "owner": "edolstra", 166 | "repo": "flake-compat", 167 | "type": "github" 168 | } 169 | }, 170 | "flake-compat_2": { 171 | "locked": { 172 | "lastModified": 1733328505, 173 | "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", 174 | "owner": "edolstra", 175 | "repo": "flake-compat", 176 | "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", 177 | "type": "github" 178 | }, 179 | "original": { 180 | "owner": "edolstra", 181 | "repo": "flake-compat", 182 | "type": "github" 183 | } 184 | }, 185 | "flake-compat_3": { 186 | "flake": false, 187 | "locked": { 188 | "lastModified": 1696426674, 189 | "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", 190 | "owner": "edolstra", 191 | "repo": "flake-compat", 192 | "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", 193 | "type": "github" 194 | }, 195 | "original": { 196 | "owner": "edolstra", 197 | "repo": "flake-compat", 198 | "type": "github" 199 | } 200 | }, 201 | "flake-parts": { 202 | "inputs": { 203 | "nixpkgs-lib": "nixpkgs-lib" 204 | }, 205 | "locked": { 206 | "lastModified": 1743550720, 207 | "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", 208 | "owner": "hercules-ci", 209 | "repo": "flake-parts", 210 | "rev": "c621e8422220273271f52058f618c94e405bb0f5", 211 | "type": "github" 212 | }, 213 | "original": { 214 | "owner": "hercules-ci", 215 | "repo": "flake-parts", 216 | "type": "github" 217 | } 218 | }, 219 | "flake-parts_2": { 220 | "inputs": { 221 | "nixpkgs-lib": "nixpkgs-lib_2" 222 | }, 223 | "locked": { 224 | "lastModified": 1743550720, 225 | "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", 226 | "owner": "hercules-ci", 227 | "repo": "flake-parts", 228 | "rev": "c621e8422220273271f52058f618c94e405bb0f5", 229 | "type": "github" 230 | }, 231 | "original": { 232 | "owner": "hercules-ci", 233 | "repo": "flake-parts", 234 | "type": "github" 235 | } 236 | }, 237 | "flake-parts_3": { 238 | "inputs": { 239 | "nixpkgs-lib": "nixpkgs-lib_3" 240 | }, 241 | "locked": { 242 | "lastModified": 1743550720, 243 | "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", 244 | "owner": "hercules-ci", 245 | "repo": "flake-parts", 246 | "rev": "c621e8422220273271f52058f618c94e405bb0f5", 247 | "type": "github" 248 | }, 249 | "original": { 250 | "owner": "hercules-ci", 251 | "repo": "flake-parts", 252 | "type": "github" 253 | } 254 | }, 255 | "flake-utils": { 256 | "inputs": { 257 | "systems": [ 258 | "systems" 259 | ] 260 | }, 261 | "locked": { 262 | "lastModified": 1731533236, 263 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 264 | "owner": "numtide", 265 | "repo": "flake-utils", 266 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 267 | "type": "github" 268 | }, 269 | "original": { 270 | "owner": "numtide", 271 | "repo": "flake-utils", 272 | "type": "github" 273 | } 274 | }, 275 | "flake-utils_2": { 276 | "inputs": { 277 | "systems": "systems_2" 278 | }, 279 | "locked": { 280 | "lastModified": 1731533236, 281 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 282 | "owner": "numtide", 283 | "repo": "flake-utils", 284 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 285 | "type": "github" 286 | }, 287 | "original": { 288 | "owner": "numtide", 289 | "repo": "flake-utils", 290 | "type": "github" 291 | } 292 | }, 293 | "gitignore": { 294 | "inputs": { 295 | "nixpkgs": [ 296 | "hyprland", 297 | "pre-commit-hooks", 298 | "nixpkgs" 299 | ] 300 | }, 301 | "locked": { 302 | "lastModified": 1709087332, 303 | "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 304 | "owner": "hercules-ci", 305 | "repo": "gitignore.nix", 306 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 307 | "type": "github" 308 | }, 309 | "original": { 310 | "owner": "hercules-ci", 311 | "repo": "gitignore.nix", 312 | "type": "github" 313 | } 314 | }, 315 | "gitignore_2": { 316 | "inputs": { 317 | "nixpkgs": [ 318 | "pre-commit-hooks", 319 | "nixpkgs" 320 | ] 321 | }, 322 | "locked": { 323 | "lastModified": 1709087332, 324 | "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 325 | "owner": "hercules-ci", 326 | "repo": "gitignore.nix", 327 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 328 | "type": "github" 329 | }, 330 | "original": { 331 | "owner": "hercules-ci", 332 | "repo": "gitignore.nix", 333 | "type": "github" 334 | } 335 | }, 336 | "hjem": { 337 | "inputs": { 338 | "nixpkgs": [ 339 | "nixpkgs" 340 | ] 341 | }, 342 | "locked": { 343 | "lastModified": 1747038076, 344 | "narHash": "sha256-vy+My+8yRRu0OG6XBEPDR8ebfrPS4iuruyQ1ZUyHq6s=", 345 | "owner": "feel-co", 346 | "repo": "hjem", 347 | "rev": "7d674eaded6586554910e62baed5eadad6496315", 348 | "type": "github" 349 | }, 350 | "original": { 351 | "owner": "feel-co", 352 | "repo": "hjem", 353 | "type": "github" 354 | } 355 | }, 356 | "hjem-rum": { 357 | "inputs": { 358 | "hjem": "hjem_2", 359 | "ndg": "ndg", 360 | "nixpkgs": [ 361 | "nixpkgs" 362 | ], 363 | "treefmt-nix": "treefmt-nix" 364 | }, 365 | "locked": { 366 | "lastModified": 1747217237, 367 | "narHash": "sha256-rYWxmjGpdGYlJd8gwripamC3t9mCihBDZJiz84CrUHI=", 368 | "owner": "snugnug", 369 | "repo": "hjem-rum", 370 | "rev": "1d3bf26bb71dced495a99e05a0141db24c49ca6f", 371 | "type": "github" 372 | }, 373 | "original": { 374 | "owner": "snugnug", 375 | "repo": "hjem-rum", 376 | "type": "github" 377 | } 378 | }, 379 | "hjem_2": { 380 | "inputs": { 381 | "nixpkgs": [ 382 | "hjem-rum", 383 | "nixpkgs" 384 | ] 385 | }, 386 | "locked": { 387 | "lastModified": 1746355589, 388 | "narHash": "sha256-LguszqsDBTtdBxblQTtN7vOAYmfoe43aHkB8aK1dChE=", 389 | "owner": "feel-co", 390 | "repo": "hjem", 391 | "rev": "77b37eeb583d43e1c723119a69c906235174ce57", 392 | "type": "github" 393 | }, 394 | "original": { 395 | "owner": "feel-co", 396 | "repo": "hjem", 397 | "type": "github" 398 | } 399 | }, 400 | "hyprcursor": { 401 | "inputs": { 402 | "hyprlang": [ 403 | "hyprland", 404 | "hyprlang" 405 | ], 406 | "nixpkgs": [ 407 | "hyprland", 408 | "nixpkgs" 409 | ], 410 | "systems": [ 411 | "hyprland", 412 | "systems" 413 | ] 414 | }, 415 | "locked": { 416 | "lastModified": 1737634937, 417 | "narHash": "sha256-Ffw4ujFpi++6pPHe+gCBOfDgAoNlzVPZN6MReC1beu8=", 418 | "owner": "hyprwm", 419 | "repo": "hyprcursor", 420 | "rev": "9c5dd1f7c825ee47f72727ad0a4e16ca46a2688e", 421 | "type": "github" 422 | }, 423 | "original": { 424 | "owner": "hyprwm", 425 | "repo": "hyprcursor", 426 | "type": "github" 427 | } 428 | }, 429 | "hyprgraphics": { 430 | "inputs": { 431 | "hyprutils": [ 432 | "hyprland", 433 | "hyprutils" 434 | ], 435 | "nixpkgs": [ 436 | "hyprland", 437 | "nixpkgs" 438 | ], 439 | "systems": [ 440 | "hyprland", 441 | "systems" 442 | ] 443 | }, 444 | "locked": { 445 | "lastModified": 1737634889, 446 | "narHash": "sha256-9JZE3KxcXOqZH9zs3UeadngDiK/yIACTiAR8HSA/TNI=", 447 | "owner": "hyprwm", 448 | "repo": "hyprgraphics", 449 | "rev": "0d77b4895ad5f1bb3b0ee43103a5246c58b65591", 450 | "type": "github" 451 | }, 452 | "original": { 453 | "owner": "hyprwm", 454 | "repo": "hyprgraphics", 455 | "type": "github" 456 | } 457 | }, 458 | "hyprland": { 459 | "inputs": { 460 | "aquamarine": "aquamarine", 461 | "hyprcursor": "hyprcursor", 462 | "hyprgraphics": "hyprgraphics", 463 | "hyprland-protocols": "hyprland-protocols", 464 | "hyprland-qtutils": "hyprland-qtutils", 465 | "hyprlang": "hyprlang_2", 466 | "hyprutils": "hyprutils_2", 467 | "hyprwayland-scanner": "hyprwayland-scanner", 468 | "nixpkgs": "nixpkgs", 469 | "pre-commit-hooks": "pre-commit-hooks", 470 | "systems": "systems", 471 | "xdph": "xdph" 472 | }, 473 | "locked": { 474 | "lastModified": 1738192779, 475 | "narHash": "sha256-NBOE/3axYuIDLPF0rI+yd006kKBQl+ItcK/4aBGw1Og=", 476 | "owner": "hyprwm", 477 | "repo": "Hyprland", 478 | "rev": "75dff7205f6d2bd437abfb4196f700abee92581a", 479 | "type": "github" 480 | }, 481 | "original": { 482 | "owner": "hyprwm", 483 | "repo": "Hyprland", 484 | "rev": "75dff7205f6d2bd437abfb4196f700abee92581a", 485 | "type": "github" 486 | } 487 | }, 488 | "hyprland-protocols": { 489 | "inputs": { 490 | "nixpkgs": [ 491 | "hyprland", 492 | "nixpkgs" 493 | ], 494 | "systems": [ 495 | "hyprland", 496 | "systems" 497 | ] 498 | }, 499 | "locked": { 500 | "lastModified": 1737556638, 501 | "narHash": "sha256-laKgI3mr2qz6tas/q3tuGPxMdsGhBi/w+HO+hO2f1AY=", 502 | "owner": "hyprwm", 503 | "repo": "hyprland-protocols", 504 | "rev": "4c75dd5c015c8a0e5a34c6d02a018a650f57feb5", 505 | "type": "github" 506 | }, 507 | "original": { 508 | "owner": "hyprwm", 509 | "repo": "hyprland-protocols", 510 | "type": "github" 511 | } 512 | }, 513 | "hyprland-qt-support": { 514 | "inputs": { 515 | "hyprlang": "hyprlang", 516 | "nixpkgs": [ 517 | "hyprland", 518 | "hyprland-qtutils", 519 | "nixpkgs" 520 | ], 521 | "systems": [ 522 | "hyprland", 523 | "hyprland-qtutils", 524 | "systems" 525 | ] 526 | }, 527 | "locked": { 528 | "lastModified": 1737634706, 529 | "narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=", 530 | "owner": "hyprwm", 531 | "repo": "hyprland-qt-support", 532 | "rev": "8810df502cdee755993cb803eba7b23f189db795", 533 | "type": "github" 534 | }, 535 | "original": { 536 | "owner": "hyprwm", 537 | "repo": "hyprland-qt-support", 538 | "type": "github" 539 | } 540 | }, 541 | "hyprland-qtutils": { 542 | "inputs": { 543 | "hyprland-qt-support": "hyprland-qt-support", 544 | "hyprutils": [ 545 | "hyprland", 546 | "hyprutils" 547 | ], 548 | "nixpkgs": [ 549 | "hyprland", 550 | "nixpkgs" 551 | ], 552 | "systems": [ 553 | "hyprland", 554 | "systems" 555 | ] 556 | }, 557 | "locked": { 558 | "lastModified": 1737811848, 559 | "narHash": "sha256-WZ7LeiKHk5Y94MU5gHIWn0r8asWxYOvie4LqfCjVIZU=", 560 | "owner": "hyprwm", 561 | "repo": "hyprland-qtutils", 562 | "rev": "9c0831ff98856c0f312fcb8b57553fbe3dd34d5b", 563 | "type": "github" 564 | }, 565 | "original": { 566 | "owner": "hyprwm", 567 | "repo": "hyprland-qtutils", 568 | "type": "github" 569 | } 570 | }, 571 | "hyprlang": { 572 | "inputs": { 573 | "hyprutils": "hyprutils", 574 | "nixpkgs": [ 575 | "hyprland", 576 | "hyprland-qtutils", 577 | "hyprland-qt-support", 578 | "nixpkgs" 579 | ], 580 | "systems": [ 581 | "hyprland", 582 | "hyprland-qtutils", 583 | "hyprland-qt-support", 584 | "systems" 585 | ] 586 | }, 587 | "locked": { 588 | "lastModified": 1737634606, 589 | "narHash": "sha256-W7W87Cv6wqZ9PHegI6rH1+ve3zJPiyevMFf0/HwdbCQ=", 590 | "owner": "hyprwm", 591 | "repo": "hyprlang", 592 | "rev": "f41271d35cc0f370d300413d756c2677f386af9d", 593 | "type": "github" 594 | }, 595 | "original": { 596 | "owner": "hyprwm", 597 | "repo": "hyprlang", 598 | "type": "github" 599 | } 600 | }, 601 | "hyprlang_2": { 602 | "inputs": { 603 | "hyprutils": [ 604 | "hyprland", 605 | "hyprutils" 606 | ], 607 | "nixpkgs": [ 608 | "hyprland", 609 | "nixpkgs" 610 | ], 611 | "systems": [ 612 | "hyprland", 613 | "systems" 614 | ] 615 | }, 616 | "locked": { 617 | "lastModified": 1737634606, 618 | "narHash": "sha256-W7W87Cv6wqZ9PHegI6rH1+ve3zJPiyevMFf0/HwdbCQ=", 619 | "owner": "hyprwm", 620 | "repo": "hyprlang", 621 | "rev": "f41271d35cc0f370d300413d756c2677f386af9d", 622 | "type": "github" 623 | }, 624 | "original": { 625 | "owner": "hyprwm", 626 | "repo": "hyprlang", 627 | "type": "github" 628 | } 629 | }, 630 | "hyprutils": { 631 | "inputs": { 632 | "nixpkgs": [ 633 | "hyprland", 634 | "hyprland-qtutils", 635 | "hyprland-qt-support", 636 | "hyprlang", 637 | "nixpkgs" 638 | ], 639 | "systems": [ 640 | "hyprland", 641 | "hyprland-qtutils", 642 | "hyprland-qt-support", 643 | "hyprlang", 644 | "systems" 645 | ] 646 | }, 647 | "locked": { 648 | "lastModified": 1737632363, 649 | "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=", 650 | "owner": "hyprwm", 651 | "repo": "hyprutils", 652 | "rev": "006620eb29d54ea9086538891404c78563d1bae1", 653 | "type": "github" 654 | }, 655 | "original": { 656 | "owner": "hyprwm", 657 | "repo": "hyprutils", 658 | "type": "github" 659 | } 660 | }, 661 | "hyprutils_2": { 662 | "inputs": { 663 | "nixpkgs": [ 664 | "hyprland", 665 | "nixpkgs" 666 | ], 667 | "systems": [ 668 | "hyprland", 669 | "systems" 670 | ] 671 | }, 672 | "locked": { 673 | "lastModified": 1737725508, 674 | "narHash": "sha256-jGmcPc6y/prg/4A8KGYqJ27nSPaProCMiFadaxNAKvA=", 675 | "owner": "hyprwm", 676 | "repo": "hyprutils", 677 | "rev": "fb0c2d1de3d1ef7396d19c18ac09e12bd956929e", 678 | "type": "github" 679 | }, 680 | "original": { 681 | "owner": "hyprwm", 682 | "repo": "hyprutils", 683 | "type": "github" 684 | } 685 | }, 686 | "hyprwayland-scanner": { 687 | "inputs": { 688 | "nixpkgs": [ 689 | "hyprland", 690 | "nixpkgs" 691 | ], 692 | "systems": [ 693 | "hyprland", 694 | "systems" 695 | ] 696 | }, 697 | "locked": { 698 | "lastModified": 1735493474, 699 | "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=", 700 | "owner": "hyprwm", 701 | "repo": "hyprwayland-scanner", 702 | "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b", 703 | "type": "github" 704 | }, 705 | "original": { 706 | "owner": "hyprwm", 707 | "repo": "hyprwayland-scanner", 708 | "type": "github" 709 | } 710 | }, 711 | "lunarsLib": { 712 | "inputs": { 713 | "nixpkgs": [ 714 | "nixpkgs" 715 | ] 716 | }, 717 | "locked": { 718 | "lastModified": 1747340568, 719 | "narHash": "sha256-3jGYNCNdef481oFCSqP+U9e7VYbYY7o7xAb4j5bpwVA=", 720 | "owner": "lunarnovaa", 721 | "repo": "lunarslib", 722 | "rev": "d7c7578010d8804cf1eae08b4226c54ce09f994b", 723 | "type": "github" 724 | }, 725 | "original": { 726 | "owner": "lunarnovaa", 727 | "repo": "lunarslib", 728 | "type": "github" 729 | } 730 | }, 731 | "lunarsLib_2": { 732 | "inputs": { 733 | "nixpkgs": [ 734 | "novavim", 735 | "nixpkgs" 736 | ] 737 | }, 738 | "locked": { 739 | "lastModified": 1747339442, 740 | "narHash": "sha256-W9395ocjeWb32tNV4dCZRuq7QZG4oWmbvvymLAYJQBs=", 741 | "owner": "Lunarnovaa", 742 | "repo": "LunarsLib", 743 | "rev": "cc1491b0ad0e366a0ed9042ae2649d81386362dd", 744 | "type": "github" 745 | }, 746 | "original": { 747 | "owner": "Lunarnovaa", 748 | "repo": "LunarsLib", 749 | "type": "github" 750 | } 751 | }, 752 | "mnw": { 753 | "locked": { 754 | "lastModified": 1746338991, 755 | "narHash": "sha256-GbyoHjf14LOxZQc+0NFblI4xf/uwGrYo3W8lwE4HcwI=", 756 | "owner": "Gerg-L", 757 | "repo": "mnw", 758 | "rev": "c65407ee9387ef75985dad3e30f58c822c766ec1", 759 | "type": "github" 760 | }, 761 | "original": { 762 | "owner": "Gerg-L", 763 | "repo": "mnw", 764 | "type": "github" 765 | } 766 | }, 767 | "ndg": { 768 | "inputs": { 769 | "flake-compat": "flake-compat_2", 770 | "flake-parts": "flake-parts_2", 771 | "nixpkgs": [ 772 | "hjem-rum", 773 | "nixpkgs" 774 | ] 775 | }, 776 | "locked": { 777 | "lastModified": 1746459301, 778 | "narHash": "sha256-QcAaxXdcPMqY5IppLa9fHCq3Rzq597DQqq8s2fKuE0k=", 779 | "owner": "feel-co", 780 | "repo": "ndg", 781 | "rev": "2864a9901102a86db82157f72998809c570c36bb", 782 | "type": "github" 783 | }, 784 | "original": { 785 | "owner": "feel-co", 786 | "ref": "v2", 787 | "repo": "ndg", 788 | "type": "github" 789 | } 790 | }, 791 | "nil": { 792 | "inputs": { 793 | "flake-utils": [ 794 | "novavim", 795 | "nvf", 796 | "flake-utils" 797 | ], 798 | "nixpkgs": [ 799 | "novavim", 800 | "nvf", 801 | "nixpkgs" 802 | ], 803 | "rust-overlay": "rust-overlay" 804 | }, 805 | "locked": { 806 | "lastModified": 1741118843, 807 | "narHash": "sha256-ggXU3RHv6NgWw+vc+HO4/9n0GPufhTIUjVuLci8Za8c=", 808 | "owner": "oxalica", 809 | "repo": "nil", 810 | "rev": "577d160da311cc7f5042038456a0713e9863d09e", 811 | "type": "github" 812 | }, 813 | "original": { 814 | "owner": "oxalica", 815 | "repo": "nil", 816 | "type": "github" 817 | } 818 | }, 819 | "niqspkgs": { 820 | "inputs": { 821 | "curd": "curd", 822 | "flake-parts": [ 823 | "flake-parts" 824 | ], 825 | "lix": [], 826 | "nixpkgs": [ 827 | "nixpkgs" 828 | ], 829 | "nq": "nq", 830 | "superfreq": "superfreq", 831 | "systems": [ 832 | "systems" 833 | ], 834 | "wayhibitor": "wayhibitor" 835 | }, 836 | "locked": { 837 | "lastModified": 1747504584, 838 | "narHash": "sha256-7q9V12e6Aet5YhVEmVWfxMyDsHcI3ycQ2mQtSjD+jIU=", 839 | "owner": "diniamo", 840 | "repo": "niqspkgs", 841 | "rev": "d9c2b94ce68b45792fbefafa0ebb9d82ed837db3", 842 | "type": "github" 843 | }, 844 | "original": { 845 | "owner": "diniamo", 846 | "repo": "niqspkgs", 847 | "type": "github" 848 | } 849 | }, 850 | "nix-minecraft": { 851 | "inputs": { 852 | "flake-compat": [ 853 | "flake-compat" 854 | ], 855 | "flake-utils": [ 856 | "flake-utils" 857 | ], 858 | "nixpkgs": [ 859 | "nixpkgs" 860 | ] 861 | }, 862 | "locked": { 863 | "lastModified": 1747620481, 864 | "narHash": "sha256-MiZ5Z7MHP42+ck277fzzu4C8w1K6OAxM5PhCQX22+FA=", 865 | "owner": "Infinidoge", 866 | "repo": "nix-minecraft", 867 | "rev": "b15bd5c18f94065f96b5a46e57c506e5f30c3918", 868 | "type": "github" 869 | }, 870 | "original": { 871 | "owner": "Infinidoge", 872 | "repo": "nix-minecraft", 873 | "type": "github" 874 | } 875 | }, 876 | "nixos-hardware": { 877 | "locked": { 878 | "lastModified": 1747684167, 879 | "narHash": "sha256-l6jbonaboCBlB8lCjBkrqgh2zEnvt6F3f4dOU/8CLd4=", 880 | "owner": "NixOS", 881 | "repo": "nixos-hardware", 882 | "rev": "e8f38b2c19c0647e39021c3d47172ff5469af8a9", 883 | "type": "github" 884 | }, 885 | "original": { 886 | "owner": "NixOS", 887 | "ref": "master", 888 | "repo": "nixos-hardware", 889 | "type": "github" 890 | } 891 | }, 892 | "nixpkgs": { 893 | "locked": { 894 | "lastModified": 1737632463, 895 | "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=", 896 | "owner": "NixOS", 897 | "repo": "nixpkgs", 898 | "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9", 899 | "type": "github" 900 | }, 901 | "original": { 902 | "owner": "NixOS", 903 | "ref": "nixos-unstable", 904 | "repo": "nixpkgs", 905 | "type": "github" 906 | } 907 | }, 908 | "nixpkgs-lib": { 909 | "locked": { 910 | "lastModified": 1743296961, 911 | "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", 912 | "owner": "nix-community", 913 | "repo": "nixpkgs.lib", 914 | "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", 915 | "type": "github" 916 | }, 917 | "original": { 918 | "owner": "nix-community", 919 | "repo": "nixpkgs.lib", 920 | "type": "github" 921 | } 922 | }, 923 | "nixpkgs-lib_2": { 924 | "locked": { 925 | "lastModified": 1743296961, 926 | "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", 927 | "owner": "nix-community", 928 | "repo": "nixpkgs.lib", 929 | "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", 930 | "type": "github" 931 | }, 932 | "original": { 933 | "owner": "nix-community", 934 | "repo": "nixpkgs.lib", 935 | "type": "github" 936 | } 937 | }, 938 | "nixpkgs-lib_3": { 939 | "locked": { 940 | "lastModified": 1743296961, 941 | "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", 942 | "owner": "nix-community", 943 | "repo": "nixpkgs.lib", 944 | "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", 945 | "type": "github" 946 | }, 947 | "original": { 948 | "owner": "nix-community", 949 | "repo": "nixpkgs.lib", 950 | "type": "github" 951 | } 952 | }, 953 | "nixpkgs_2": { 954 | "locked": { 955 | "lastModified": 1747542820, 956 | "narHash": "sha256-GaOZntlJ6gPPbbkTLjbd8BMWaDYafhuuYRNrxCGnPJw=", 957 | "owner": "nixos", 958 | "repo": "nixpkgs", 959 | "rev": "292fa7d4f6519c074f0a50394dbbe69859bb6043", 960 | "type": "github" 961 | }, 962 | "original": { 963 | "owner": "nixos", 964 | "ref": "nixos-unstable", 965 | "repo": "nixpkgs", 966 | "type": "github" 967 | } 968 | }, 969 | "nixpkgs_3": { 970 | "locked": { 971 | "lastModified": 1747179050, 972 | "narHash": "sha256-qhFMmDkeJX9KJwr5H32f1r7Prs7XbQWtO0h3V0a0rFY=", 973 | "owner": "nixos", 974 | "repo": "nixpkgs", 975 | "rev": "adaa24fbf46737f3f1b5497bf64bae750f82942e", 976 | "type": "github" 977 | }, 978 | "original": { 979 | "owner": "nixos", 980 | "ref": "nixos-unstable", 981 | "repo": "nixpkgs", 982 | "type": "github" 983 | } 984 | }, 985 | "novavim": { 986 | "inputs": { 987 | "lunarsLib": "lunarsLib_2", 988 | "nixpkgs": "nixpkgs_3", 989 | "nvf": "nvf", 990 | "systems": [ 991 | "systems" 992 | ] 993 | }, 994 | "locked": { 995 | "lastModified": 1747705629, 996 | "narHash": "sha256-LYCXv8HUXGwSmMn7cPEY+7xjyCg64bMJLo6l/DbdzgQ=", 997 | "owner": "lunarnovaa", 998 | "repo": "novavim", 999 | "rev": "5b2ea8dfccc299bbb31affcc5500d86bb313fa0c", 1000 | "type": "github" 1001 | }, 1002 | "original": { 1003 | "owner": "lunarnovaa", 1004 | "repo": "novavim", 1005 | "type": "github" 1006 | } 1007 | }, 1008 | "nq": { 1009 | "inputs": { 1010 | "nixpkgs": [ 1011 | "niqspkgs", 1012 | "nixpkgs" 1013 | ], 1014 | "systems": [ 1015 | "niqspkgs", 1016 | "systems" 1017 | ] 1018 | }, 1019 | "locked": { 1020 | "lastModified": 1747504566, 1021 | "narHash": "sha256-X/s7TZnSBXlNZJkBTJvKzUlYvvBILaGLceYrQhUPTFY=", 1022 | "owner": "diniamo", 1023 | "repo": "nq", 1024 | "rev": "516b65f3132d151d350e9340c1d7c18a355951fc", 1025 | "type": "github" 1026 | }, 1027 | "original": { 1028 | "owner": "diniamo", 1029 | "repo": "nq", 1030 | "type": "github" 1031 | } 1032 | }, 1033 | "nvf": { 1034 | "inputs": { 1035 | "flake-parts": "flake-parts_3", 1036 | "flake-utils": "flake-utils_2", 1037 | "mnw": "mnw", 1038 | "nil": "nil", 1039 | "nixpkgs": [ 1040 | "novavim", 1041 | "nixpkgs" 1042 | ], 1043 | "systems": [ 1044 | "novavim", 1045 | "systems" 1046 | ] 1047 | }, 1048 | "locked": { 1049 | "lastModified": 1747137219, 1050 | "narHash": "sha256-j7EDNWOcImvyx900u8NcPgeqm3YZm2b8ux3fcTP5Y00=", 1051 | "owner": "notashelf", 1052 | "repo": "nvf", 1053 | "rev": "79993c71d88d7bfafc1ae029bd9621cd74e1529d", 1054 | "type": "github" 1055 | }, 1056 | "original": { 1057 | "owner": "notashelf", 1058 | "repo": "nvf", 1059 | "type": "github" 1060 | } 1061 | }, 1062 | "pre-commit-hooks": { 1063 | "inputs": { 1064 | "flake-compat": "flake-compat_3", 1065 | "gitignore": "gitignore", 1066 | "nixpkgs": [ 1067 | "hyprland", 1068 | "nixpkgs" 1069 | ] 1070 | }, 1071 | "locked": { 1072 | "lastModified": 1737465171, 1073 | "narHash": "sha256-R10v2hoJRLq8jcL4syVFag7nIGE7m13qO48wRIukWNg=", 1074 | "owner": "cachix", 1075 | "repo": "git-hooks.nix", 1076 | "rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17", 1077 | "type": "github" 1078 | }, 1079 | "original": { 1080 | "owner": "cachix", 1081 | "repo": "git-hooks.nix", 1082 | "type": "github" 1083 | } 1084 | }, 1085 | "pre-commit-hooks_2": { 1086 | "inputs": { 1087 | "flake-compat": [ 1088 | "flake-compat" 1089 | ], 1090 | "gitignore": "gitignore_2", 1091 | "nixpkgs": [ 1092 | "nixpkgs" 1093 | ] 1094 | }, 1095 | "locked": { 1096 | "lastModified": 1747372754, 1097 | "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", 1098 | "owner": "cachix", 1099 | "repo": "git-hooks.nix", 1100 | "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", 1101 | "type": "github" 1102 | }, 1103 | "original": { 1104 | "owner": "cachix", 1105 | "repo": "git-hooks.nix", 1106 | "type": "github" 1107 | } 1108 | }, 1109 | "root": { 1110 | "inputs": { 1111 | "agenix": "agenix", 1112 | "ags": "ags", 1113 | "astal": "astal", 1114 | "basix": "basix", 1115 | "flake-compat": "flake-compat", 1116 | "flake-parts": "flake-parts", 1117 | "flake-utils": "flake-utils", 1118 | "hjem": "hjem", 1119 | "hjem-rum": "hjem-rum", 1120 | "hyprland": "hyprland", 1121 | "lunarsLib": "lunarsLib", 1122 | "niqspkgs": "niqspkgs", 1123 | "nix-minecraft": "nix-minecraft", 1124 | "nixos-hardware": "nixos-hardware", 1125 | "nixpkgs": "nixpkgs_2", 1126 | "novavim": "novavim", 1127 | "pre-commit-hooks": "pre-commit-hooks_2", 1128 | "spicetify-nix": "spicetify-nix", 1129 | "systems": "systems_3" 1130 | } 1131 | }, 1132 | "rust-overlay": { 1133 | "inputs": { 1134 | "nixpkgs": [ 1135 | "novavim", 1136 | "nvf", 1137 | "nil", 1138 | "nixpkgs" 1139 | ] 1140 | }, 1141 | "locked": { 1142 | "lastModified": 1741055476, 1143 | "narHash": "sha256-52vwEV0oS2lCnx3c/alOFGglujZTLmObit7K8VblnS8=", 1144 | "owner": "oxalica", 1145 | "repo": "rust-overlay", 1146 | "rev": "aefb7017d710f150970299685e8d8b549d653649", 1147 | "type": "github" 1148 | }, 1149 | "original": { 1150 | "owner": "oxalica", 1151 | "repo": "rust-overlay", 1152 | "type": "github" 1153 | } 1154 | }, 1155 | "spicetify-nix": { 1156 | "inputs": { 1157 | "nixpkgs": [ 1158 | "nixpkgs" 1159 | ], 1160 | "systems": [ 1161 | "systems" 1162 | ] 1163 | }, 1164 | "locked": { 1165 | "lastModified": 1747607404, 1166 | "narHash": "sha256-xj2Ji+rE+oYjf0BsTDT7K/StnYuZQK9MTbX8U1DUcC0=", 1167 | "owner": "Gerg-L", 1168 | "repo": "spicetify-nix", 1169 | "rev": "8c1be0e5e9a7f35ccd6f7b10bcfa08f2734dad91", 1170 | "type": "github" 1171 | }, 1172 | "original": { 1173 | "owner": "Gerg-L", 1174 | "repo": "spicetify-nix", 1175 | "type": "github" 1176 | } 1177 | }, 1178 | "superfreq": { 1179 | "inputs": { 1180 | "nixpkgs": [ 1181 | "niqspkgs", 1182 | "nixpkgs" 1183 | ] 1184 | }, 1185 | "locked": { 1186 | "lastModified": 1747341787, 1187 | "narHash": "sha256-p8fl95EW26T2xgZSmIWqjVXvHhRlqdUS/UI8ELNXHtc=", 1188 | "owner": "NotAShelf", 1189 | "repo": "superfreq", 1190 | "rev": "1546da382e1bf4844d409f43e02d2ebb18404515", 1191 | "type": "github" 1192 | }, 1193 | "original": { 1194 | "owner": "NotAShelf", 1195 | "repo": "superfreq", 1196 | "type": "github" 1197 | } 1198 | }, 1199 | "systems": { 1200 | "locked": { 1201 | "lastModified": 1689347949, 1202 | "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", 1203 | "owner": "nix-systems", 1204 | "repo": "default-linux", 1205 | "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", 1206 | "type": "github" 1207 | }, 1208 | "original": { 1209 | "owner": "nix-systems", 1210 | "repo": "default-linux", 1211 | "type": "github" 1212 | } 1213 | }, 1214 | "systems_2": { 1215 | "locked": { 1216 | "lastModified": 1681028828, 1217 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 1218 | "owner": "nix-systems", 1219 | "repo": "default", 1220 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 1221 | "type": "github" 1222 | }, 1223 | "original": { 1224 | "owner": "nix-systems", 1225 | "repo": "default", 1226 | "type": "github" 1227 | } 1228 | }, 1229 | "systems_3": { 1230 | "locked": { 1231 | "lastModified": 1680978846, 1232 | "narHash": "sha256-Gtqg8b/v49BFDpDetjclCYXm8mAnTrUzR0JnE2nv5aw=", 1233 | "owner": "nix-systems", 1234 | "repo": "x86_64-linux", 1235 | "rev": "2ecfcac5e15790ba6ce360ceccddb15ad16d08a8", 1236 | "type": "github" 1237 | }, 1238 | "original": { 1239 | "owner": "nix-systems", 1240 | "repo": "x86_64-linux", 1241 | "type": "github" 1242 | } 1243 | }, 1244 | "treefmt-nix": { 1245 | "inputs": { 1246 | "nixpkgs": [ 1247 | "hjem-rum", 1248 | "nixpkgs" 1249 | ] 1250 | }, 1251 | "locked": { 1252 | "lastModified": 1746216483, 1253 | "narHash": "sha256-4h3s1L/kKqt3gMDcVfN8/4v2jqHrgLIe4qok4ApH5x4=", 1254 | "owner": "numtide", 1255 | "repo": "treefmt-nix", 1256 | "rev": "29ec5026372e0dec56f890e50dbe4f45930320fd", 1257 | "type": "github" 1258 | }, 1259 | "original": { 1260 | "owner": "numtide", 1261 | "repo": "treefmt-nix", 1262 | "type": "github" 1263 | } 1264 | }, 1265 | "wayhibitor": { 1266 | "inputs": { 1267 | "nixpkgs": [ 1268 | "niqspkgs", 1269 | "nixpkgs" 1270 | ], 1271 | "systems": [ 1272 | "niqspkgs", 1273 | "systems" 1274 | ] 1275 | }, 1276 | "locked": { 1277 | "lastModified": 1747340589, 1278 | "narHash": "sha256-ppRqiMzt8MnfUFiRJ9VBSegNLoWbqoZHRmgLIDXEUHU=", 1279 | "owner": "diniamo", 1280 | "repo": "wayhibitor", 1281 | "rev": "f0f8c4ccef53910a07776f210246098c2dbff267", 1282 | "type": "github" 1283 | }, 1284 | "original": { 1285 | "owner": "diniamo", 1286 | "repo": "wayhibitor", 1287 | "type": "github" 1288 | } 1289 | }, 1290 | "xdph": { 1291 | "inputs": { 1292 | "hyprland-protocols": [ 1293 | "hyprland", 1294 | "hyprland-protocols" 1295 | ], 1296 | "hyprlang": [ 1297 | "hyprland", 1298 | "hyprlang" 1299 | ], 1300 | "hyprutils": [ 1301 | "hyprland", 1302 | "hyprutils" 1303 | ], 1304 | "hyprwayland-scanner": [ 1305 | "hyprland", 1306 | "hyprwayland-scanner" 1307 | ], 1308 | "nixpkgs": [ 1309 | "hyprland", 1310 | "nixpkgs" 1311 | ], 1312 | "systems": [ 1313 | "hyprland", 1314 | "systems" 1315 | ] 1316 | }, 1317 | "locked": { 1318 | "lastModified": 1737634991, 1319 | "narHash": "sha256-dBAnb7Kbnier30cA7AgxVSxxARmxKZ1vHZT33THSIr8=", 1320 | "owner": "hyprwm", 1321 | "repo": "xdg-desktop-portal-hyprland", 1322 | "rev": "e09dfe2726c8008f983e45a0aa1a3b7416aaeb8a", 1323 | "type": "github" 1324 | }, 1325 | "original": { 1326 | "owner": "hyprwm", 1327 | "repo": "xdg-desktop-portal-hyprland", 1328 | "type": "github" 1329 | } 1330 | } 1331 | }, 1332 | "root": "root", 1333 | "version": 7 1334 | } 1335 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | # https://github.com/Lunarnovaa/lunix 3 | description = "Lunix: Lunarnova's Nix Flake."; 4 | 5 | outputs = inputs: 6 | inputs.flake-parts.lib.mkFlake {inherit inputs;} { 7 | # This outputs format is heavily inspired by NotAShelf/nyx 8 | 9 | imports = [ 10 | ./parts 11 | ./hosts 12 | ]; 13 | 14 | # Systems for which the flake will be built is made relative 15 | # of the systems flake input (referenced from NotAShelf/nyx) 16 | systems = import inputs.systems; 17 | }; 18 | 19 | inputs = { 20 | ## Systems is a fancy flake to unify the systems ## 21 | ## for which the flake and its inputs are built. ## 22 | 23 | systems = { 24 | # Currently only use x86_64-linux :) 25 | url = "github:nix-systems/x86_64-linux"; 26 | }; 27 | 28 | ## package inputs ## 29 | 30 | # use the unstable branch 31 | nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; 32 | 33 | # used for bibata-hyprcursors 34 | niqspkgs = { 35 | url = "github:diniamo/niqspkgs"; 36 | inputs = { 37 | nixpkgs.follows = "nixpkgs"; 38 | systems.follows = "systems"; 39 | lix.follows = ""; 40 | flake-parts.follows = "flake-parts"; 41 | }; 42 | }; 43 | 44 | ## system infrastructure ## 45 | 46 | # used for my laptop 47 | nixos-hardware.url = "github:NixOS/nixos-hardware/master"; #no nixpkgs necessary 48 | 49 | # secrets management 50 | agenix = { 51 | url = "github:ryantm/agenix"; 52 | inputs = { 53 | nixpkgs.follows = "nixpkgs"; 54 | systems.follows = "systems"; 55 | # stop agenix from importing home-manager and darwin 56 | home-manager.follows = ""; 57 | darwin.follows = ""; 58 | }; 59 | }; 60 | 61 | # modularizing my flake 62 | flake-parts = { 63 | url = "github:hercules-ci/flake-parts"; 64 | }; 65 | 66 | # managing pre-commit hooks with nix 67 | pre-commit-hooks = { 68 | url = "github:cachix/git-hooks.nix"; 69 | inputs = { 70 | nixpkgs.follows = "nixpkgs"; 71 | flake-compat.follows = "flake-compat"; 72 | }; 73 | }; 74 | 75 | ## desktop stuff ## 76 | 77 | # hyprland flake 78 | hyprland.url = "github:hyprwm/Hyprland/75dff7205f6d2bd437abfb4196f700abee92581a"; #v0.47.1 79 | # couple quick notes: 80 | # i use hyprland releases to make it easier to monitor breaking changes. hyprland moves pretty fast and i don't care too much about hyprland's bleeding edge. 81 | # no input follows because hyprland uses a cache 82 | 83 | # astal, a library for aylur's shell 84 | astal = { 85 | url = "github:aylur/astal"; 86 | inputs.nixpkgs.follows = "nixpkgs"; 87 | }; 88 | 89 | # ags, a scaffolding for using astal with typescript 90 | ags = { 91 | url = "github:aylur/ags"; 92 | inputs = { 93 | nixpkgs.follows = "nixpkgs"; 94 | astal.follows = "astal"; 95 | }; 96 | }; 97 | 98 | ## module specific stuff ## 99 | 100 | # a spotify ricer 101 | spicetify-nix = { 102 | url = "github:Gerg-L/spicetify-nix"; 103 | inputs = { 104 | nixpkgs.follows = "nixpkgs"; 105 | systems.follows = "systems"; 106 | }; 107 | }; 108 | 109 | # minecraft server configured with nix and ran as a service 110 | nix-minecraft = { 111 | url = "github:Infinidoge/nix-minecraft"; 112 | inputs = { 113 | nixpkgs.follows = "nixpkgs"; 114 | flake-utils.follows = "flake-utils"; 115 | flake-compat.follows = "flake-compat"; 116 | }; 117 | }; 118 | 119 | ## shelfware ## 120 | 121 | # base16 palettes in nix 122 | basix = { 123 | url = "github:notashelf/basix"; 124 | inputs = { 125 | nixpkgs.follows = "nixpkgs"; 126 | flake-parts.follows = "flake-parts"; 127 | flake-compat.follows = "flake-compat"; 128 | }; 129 | }; 130 | 131 | # Lunarnova's Neovim Configuration 132 | novavim = { 133 | url = "github:lunarnovaa/novavim"; 134 | inputs = { 135 | systems.follows = "systems"; 136 | }; 137 | }; 138 | 139 | # Lunar's (Nix) Libraries 140 | lunarsLib = { 141 | url = "github:lunarnovaa/lunarslib"; 142 | inputs.nixpkgs.follows = "nixpkgs"; 143 | }; 144 | 145 | /* 146 | schizofox = { 147 | url = "path:/home/lunarnova/schizofox"; 148 | inputs = { 149 | nixpkgs.follows = "nixpkgs"; 150 | hjem.follows = "hjem"; 151 | home-manager.follows = ""; 152 | flake-parts.follows = "flake-parts"; 153 | systems.follows = "systems"; 154 | flake-compat.follows = "flake-compat"; 155 | }; 156 | }; 157 | */ 158 | ## hjem business ## 159 | 160 | # hjem, a replacement for home-manager's tooling 161 | hjem = { 162 | url = "github:feel-co/hjem"; 163 | inputs.nixpkgs.follows = "nixpkgs"; 164 | }; 165 | 166 | # i use a local version for dogfeeding 167 | hjem-rum = { 168 | url = "github:snugnug/hjem-rum/"; 169 | #url = "github:nezia1/hjem-rum/use-formats"; 170 | #url = "path:/home/lunarnova/snug/hjem-rum"; 171 | inputs = { 172 | nixpkgs.follows = "nixpkgs"; 173 | #hjem.follows = "hjem"; 174 | }; 175 | }; 176 | 177 | ## input unification, both added to be referenced in ## 178 | ## other flake input's inputs c: ## 179 | flake-utils = { 180 | url = "github:numtide/flake-utils"; 181 | inputs.systems.follows = "systems"; 182 | }; 183 | 184 | flake-compat = { 185 | url = "github:edolstra/flake-compat"; 186 | }; 187 | }; 188 | } 189 | -------------------------------------------------------------------------------- /hosts/default.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs, 3 | withSystem, # flake-parts option 4 | ... 5 | }: let 6 | inherit (inputs.lunarsLib.builders) mkHost; 7 | 8 | top = ./..; 9 | moduleDir = top + /modules; 10 | hostDir = top + /hosts; 11 | 12 | default = { 13 | profiles = [ 14 | "gaming" 15 | "workstation" 16 | #"server" 17 | ]; 18 | desktops = [ 19 | #"hyprland" 20 | #"gnome" 21 | "cosmic" 22 | #"couch" 23 | #"kde" 24 | ]; 25 | }; 26 | in { 27 | flake.nixosConfigurations = { 28 | # If you're wondering what "mkHost" is, check lib/lunar/builders/mkHost.nix 29 | polaris = mkHost { 30 | inherit withSystem inputs; 31 | inherit moduleDir hostDir; 32 | system = "x86_64-linux"; 33 | hostName = "polaris"; 34 | 35 | inherit (default) profiles desktops; 36 | }; 37 | procyon = mkHost { 38 | inherit withSystem inputs; 39 | inherit moduleDir hostDir; 40 | system = "x86_64-linux"; 41 | hostName = "procyon"; 42 | 43 | inherit (default) profiles desktops; 44 | 45 | extraImports = [inputs.nixos-hardware.nixosModules.framework-13-7040-amd]; 46 | }; 47 | }; 48 | } 49 | -------------------------------------------------------------------------------- /hosts/polaris/desktops/_gnome.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | desktops.gnome = { 3 | enable = false; 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /hosts/polaris/desktops/_hyprland.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | primaryDisplay = "HDMI-A-1"; 9 | secondaryDisplay = "DP-4"; 10 | in { 11 | # Configure hyprland 12 | desktops.hyprland = { 13 | enable = false; 14 | smartgaps = true; 15 | monitors = { 16 | configuration = [ 17 | "${primaryDisplay}, preferred, auto, 1" 18 | #"${secondaryDisplay}, preferred, auto-left, 1" 19 | "${secondaryDisplay}, disable" 20 | ]; 21 | bind = mkIf config.profiles.gaming.enable [ 22 | #moves firefox workspace to secondary for gaming, primary when done 23 | #"$mod,B,moveworkspacetomonitor,1 ${secondaryDisplay}" 24 | #"$mod,K,moveworkspacetomonitor,1 ${primaryDisplay}" 25 | ]; 26 | rules = [ 27 | #"3, monitor:${primaryDisplay}" 28 | #"2, monitor:${secondaryDisplay}, default:true" 29 | ]; 30 | }; 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /hosts/polaris/desktops/_kde.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | desktops.kde = { 3 | enable = true; 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /hosts/polaris/desktops/cosmic.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | desktops.cosmic = { 3 | enable = true; 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /hosts/polaris/hardware/hardware-configuration.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 | modulesPath, 8 | ... 9 | }: { 10 | imports = [ 11 | (modulesPath + "/installer/scan/not-detected.nix") 12 | ]; 13 | 14 | boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"]; 15 | boot.initrd.kernelModules = []; 16 | boot.kernelModules = ["kvm-intel"]; 17 | boot.extraModulePackages = []; 18 | 19 | fileSystems."/" = { 20 | device = "/dev/disk/by-uuid/aad961df-b3a6-48fb-97e0-550053a8bb85"; 21 | fsType = "ext4"; 22 | }; 23 | 24 | fileSystems."/boot" = { 25 | device = "/dev/disk/by-uuid/74F0-C95C"; 26 | fsType = "vfat"; 27 | options = ["fmask=0022" "dmask=0022"]; 28 | }; 29 | 30 | fileSystems."/mnt/games" = { 31 | device = "/dev/disk/by-uuid/2daf90cc-5967-4424-aee1-1a5869f99ef3"; 32 | fsType = "ext4"; 33 | }; 34 | 35 | swapDevices = [ 36 | {device = "/dev/disk/by-uuid/0f005e1c-1dac-4d82-b8df-fc62d6c2e6c0";} 37 | ]; 38 | 39 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking 40 | # (the default) this is the recommended approach. When using systemd-networkd it's 41 | # still possible to use this option, but it's recommended to use it in conjunction 42 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`. 43 | networking.useDHCP = lib.mkDefault true; 44 | # networking.interfaces.eno2.useDHCP = lib.mkDefault true; 45 | # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; 46 | 47 | hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 48 | } 49 | -------------------------------------------------------------------------------- /hosts/polaris/hardware/system.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Configure system specific drivers and settings 3 | sysconf = { 4 | nvidia = true; 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /hosts/polaris/profiles.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Set and configure specific profiles 3 | profiles = { 4 | gaming = { 5 | enable = true; 6 | programs.obs.enable = false; 7 | }; 8 | workstation = { 9 | enable = true; 10 | }; 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /hosts/polaris/programs/firefox.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | firefox = { 3 | enable = true; 4 | app = "mozilla"; 5 | verticalTabs = true; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /hosts/polaris/programs/loose.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | loose = { 3 | fastfetch = false; 4 | spicetify = true; 5 | via = false; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /hosts/polaris/specialisations/focusMode.nix: -------------------------------------------------------------------------------- 1 | {lib, ...}: let 2 | inherit (lib.modules) mkForce; 3 | in { 4 | # "Focus Mode": Disables Gaming Modules 5 | specialisation.focusMode.configuration = { 6 | environment.etc."specialisation".text = "focusMode"; 7 | profiles.gaming.enable = mkForce false; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /hosts/procyon/desktops/_hyprland.nix: -------------------------------------------------------------------------------- 1 | {...}: let 2 | primaryDisplay = "eDP-1"; 3 | in { 4 | desktops.hyprland = { 5 | enable = true; 6 | monitors = { 7 | configuration = [ 8 | "${primaryDisplay}, preferred, auto, 1.333333" 9 | ]; 10 | #bind = []; 11 | #rules = []; 12 | }; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /hosts/procyon/desktops/cosmic.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | desktops.cosmic = { 3 | enable = true; 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /hosts/procyon/hardware/hardware-configuration.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 | modulesPath, 8 | ... 9 | }: { 10 | imports = [ 11 | (modulesPath + "/installer/scan/not-detected.nix") 12 | ]; 13 | 14 | boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "thunderbolt"]; 15 | boot.initrd.kernelModules = []; 16 | boot.kernelModules = ["kvm-amd"]; 17 | boot.extraModulePackages = []; 18 | 19 | fileSystems."/" = { 20 | device = "/dev/disk/by-uuid/916df5d8-78fb-4c07-b977-7f62f128e61e"; 21 | fsType = "ext4"; 22 | }; 23 | 24 | fileSystems."/boot" = { 25 | device = "/dev/disk/by-uuid/299C-7DAB"; 26 | fsType = "vfat"; 27 | options = ["fmask=0022" "dmask=0022"]; 28 | }; 29 | 30 | swapDevices = [ 31 | {device = "/dev/disk/by-uuid/275c2bed-be4c-423e-910a-bc8f2a405025";} 32 | ]; 33 | 34 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking 35 | # (the default) this is the recommended approach. When using systemd-networkd it's 36 | # still possible to use this option, but it's recommended to use it in conjunction 37 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`. 38 | networking.useDHCP = lib.mkDefault true; 39 | # networking.interfaces.wlp1s0.useDHCP = lib.mkDefault true; 40 | 41 | hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 42 | } 43 | -------------------------------------------------------------------------------- /hosts/procyon/hardware/system.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | sysconf = { 3 | powersave = true; 4 | }; 5 | } 6 | -------------------------------------------------------------------------------- /hosts/procyon/profiles.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | profiles = { 3 | gaming = { 4 | enable = false; 5 | }; 6 | workstation = { 7 | enable = true; 8 | }; 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /hosts/procyon/programs/firefox.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | firefox = { 3 | enable = true; 4 | app = "mozilla"; 5 | verticalTabs = false; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /hosts/procyon/specialisations/gamingMode.nix: -------------------------------------------------------------------------------- 1 | {lib, ...}: let 2 | inherit (lib.modules) mkForce; 3 | in { 4 | # Specialisation for "Gaming Mode": Enables Gaming Module 5 | specialisation.gamingMode.configuration = { 6 | environment.etc."specialisation".text = "gamingMode"; 7 | profiles.gaming.enable = mkForce true; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /modules/common/desktops/audio.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Enabling Sound with Pipewire. 3 | security.rtkit.enable = true; 4 | services = { 5 | pulseaudio.enable = false; 6 | pipewire = { 7 | enable = true; 8 | alsa.enable = true; 9 | alsa.support32Bit = true; 10 | pulse.enable = true; 11 | #jack.enable = true; 12 | }; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /modules/common/desktops/fonts.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | theme, 4 | ... 5 | }: let 6 | inherit (theme) fonts; 7 | 8 | fallbackPackages = [ 9 | pkgs.corefonts 10 | pkgs.vistafonts 11 | ]; 12 | fallbackFonts = [ 13 | "corefonts" 14 | "vistafonts" 15 | ]; 16 | in { 17 | fonts = { 18 | enableDefaultPackages = false; 19 | packages = 20 | [ 21 | fonts.monospace.package 22 | fonts.sans.package 23 | fonts.serif.package 24 | fonts.emoji.package 25 | fonts.cjk.sans.package 26 | fonts.cjk.serif.package 27 | ] 28 | ++ fallbackPackages; 29 | fontconfig = { 30 | defaultFonts = { 31 | serif = 32 | [ 33 | fonts.serif.name 34 | fonts.cjk.serif.name 35 | ] 36 | ++ fallbackFonts; 37 | sansSerif = 38 | [ 39 | fonts.sans.name 40 | fonts.cjk.sans.name 41 | ] 42 | ++ fallbackFonts; 43 | monospace = 44 | [ 45 | fonts.monospace.name 46 | fonts.cjk.serif.name 47 | ] 48 | ++ fallbackFonts; 49 | emoji = [ 50 | fonts.emoji.name 51 | ]; 52 | }; 53 | }; 54 | }; 55 | } 56 | -------------------------------------------------------------------------------- /modules/common/desktops/keyboard.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Enables Colemak systemwide 3 | services.xserver.xkb = { 4 | layout = "us"; 5 | variant = "colemak"; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /modules/common/desktops/pinyin.nix: -------------------------------------------------------------------------------- 1 | {pkgs, ...}: { 2 | # Add support for typing Pinyin -> Hanzi 3 | i18n.inputMethod = { 4 | enable = true; 5 | type = "fcitx5"; 6 | fcitx5.waylandFrontend = true; 7 | fcitx5.addons = [ 8 | pkgs.rime-data 9 | pkgs.fcitx5-rime 10 | pkgs.fcitx5-gtk 11 | pkgs.fcitx5-configtool #if having issues with qt compatibility, run fcitx5-config-qt 12 | pkgs.fcitx5-chinese-addons 13 | pkgs.fcitx5-mozc 14 | ]; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /modules/common/desktops/sddm.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | pkgs, 4 | lib, 5 | theme, 6 | ... 7 | }: let 8 | inherit (lib.modules) mkIf mkForce; 9 | inherit (theme) fonts wallpapers; 10 | 11 | cfg = config.desktops; 12 | in { 13 | config = mkIf (cfg.kde.enable || cfg.hyprland.enable) { 14 | environment.systemPackages = [ 15 | ( 16 | pkgs.catppuccin-sddm.override { 17 | flavor = "mocha"; 18 | font = "${fonts.monospace.name}"; 19 | fontSize = "11"; 20 | background = "${wallpapers.primary}"; # for some reason, this doesn't work rn 21 | loginBackground = true; 22 | } 23 | ) 24 | ]; 25 | services.displayManager.sddm = { 26 | enable = true; 27 | wayland.enable = true; 28 | theme = "catppuccin-mocha"; 29 | package = mkForce pkgs.kdePackages.sddm; 30 | }; 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /modules/common/desktops/theming/gtk.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | pkgs, 4 | theme, 5 | lib, 6 | ... 7 | }: let 8 | inherit (theme) fonts; 9 | inherit (lib.strings) optionalString; 10 | inherit (builtins) readFile toString; 11 | 12 | packages = { 13 | theme = pkgs.catppuccin-gtk.override { 14 | accents = ["rosewater"]; 15 | variant = "mocha"; 16 | size = "standard"; 17 | tweaks = ["normal"]; 18 | }; 19 | iconTheme = pkgs.catppuccin-papirus-folders.override { 20 | accent = "rosewater"; 21 | flavor = "mocha"; 22 | }; 23 | cursorTheme = pkgs.bibata-cursors; 24 | }; 25 | 26 | cfg = config.hjem.users.lunarnova.rum.misc.gtk; 27 | in { 28 | hjem.users.lunarnova.rum.misc.gtk = { 29 | enable = true; 30 | packages = [ 31 | packages.theme 32 | packages.iconTheme 33 | packages.cursorTheme 34 | ]; 35 | settings = { 36 | application-prefer-dark-theme = true; 37 | theme-name = "catppuccin-mocha-rosewater-standard+normal"; 38 | icon-theme-name = "Papirus-Dark"; 39 | font-name = "${fonts.sans.name} ${toString fonts.size}"; 40 | cursor-theme-name = "Bibata-Modern-Classic"; 41 | }; 42 | css = let 43 | darkTheme = cfg.settings.application-prefer-dark-theme; 44 | fileCSS = ver: "${packages.theme}/share/themes/${cfg.settings.theme-name}/gtk-${ver}/gtk${optionalString darkTheme "-dark"}.css"; 45 | in { 46 | gtk3 = readFile (fileCSS "3.0"); 47 | gtk4 = readFile (fileCSS "4.0"); 48 | }; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /modules/common/desktops/theming/qt.nix: -------------------------------------------------------------------------------- 1 | {pkgs, ...}: let 2 | envVars = { 3 | QT_STYLE_OVERRIDE = "Catppuccin-Mocha-Dark"; 4 | QT_QPA_PLATFORMTHEME = "gtk"; 5 | }; 6 | in { 7 | environment.variables = envVars; 8 | hjem.users.lunarnova = { 9 | packages = [ 10 | (pkgs.catppuccin-kde.override { 11 | flavour = ["mocha"]; 12 | accents = ["rosewater"]; 13 | }) 14 | ]; 15 | environment.sessionVariables = envVars; 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /modules/common/programs/_schizofox/schizofox.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs, 3 | lib, 4 | config, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.firefox; 10 | in { 11 | imports = [ 12 | inputs.schizofox.nixosModule 13 | ]; 14 | 15 | config = mkIf (cfg.enable && (cfg.app == "schizofox")) { 16 | hjem.users.lunarnova.programs.schizofox = { 17 | enable = true; 18 | misc = { 19 | displayBookmarksInToolbar = "always"; 20 | firefoxSync = true; 21 | }; 22 | search.defaultSearchEngine = "DuckDuckGo"; 23 | }; 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /modules/common/programs/_schizofox/search-engines.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | cfg = config.firefox; 9 | in { 10 | hjem.users.lunarnova.programs.schizofox.search.addEngines = mkIf (cfg.enable && (cfg.app == "schizofox")) [ 11 | { 12 | Name = "Nix Packages"; 13 | URLTemplate = "https://search.nixos.org/packages?channel=unstable&query={searchTerms}"; 14 | Method = "GET"; 15 | Alias = "@np"; 16 | } 17 | { 18 | Name = "Nix Options"; 19 | URLTemplate = "https://search.nixos.org/options?channel=unstable&query={searchTerms}"; 20 | Method = "GET"; 21 | Alias = "@no"; 22 | } 23 | { 24 | Name = "NixOS Wiki"; 25 | URLTemplate = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; 26 | Method = "GET"; 27 | Alias = "@nw"; 28 | } 29 | { 30 | Name = "Home Manager Options"; 31 | URLTemplate = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master"; 32 | Method = "GET"; 33 | Alias = "@hmo"; 34 | } 35 | { 36 | Name = "ProtonDB"; 37 | URLTemplate = "https://www.protondb.com/search?q={searchTerms}"; 38 | Method = "GET"; 39 | Alias = "@pdb"; 40 | IconURL = "https://www.protondb.com/sites/protondb/images/site-logo.svg"; 41 | } 42 | { 43 | Name = "Rate My Professor"; 44 | URLTemplate = "https://www.ratemyprofessors.com/search/professors/1506?q={searchTerms}"; 45 | Method = "GET"; 46 | Alias = "@rmp"; 47 | } 48 | ]; 49 | } 50 | -------------------------------------------------------------------------------- /modules/common/programs/_schizofox/theme.nix: -------------------------------------------------------------------------------- 1 | { 2 | theme, 3 | lib, 4 | config, 5 | ... 6 | }: let 7 | inherit (theme.fonts) sans; 8 | inherit (lib.strings) removePrefix; 9 | inherit (lib.attrsets) mapAttrs; 10 | inherit (lib.modules) mkIf; 11 | inherit (schizoCol) base00 base01 base05 base06; 12 | 13 | schizoCol = mapAttrs (n: v: removePrefix "#" v) theme.colors; 14 | 15 | cfg = config.firefox; 16 | in { 17 | hjem.users.lunarnova.programs.schizofox = mkIf (cfg.enable && (cfg.app == "schizofox")) { 18 | theme = { 19 | font = sans.name; 20 | colors = { 21 | background-darker = base01; 22 | background = base00; 23 | foreground = base05; 24 | primary = base06; 25 | }; 26 | }; 27 | }; 28 | } 29 | -------------------------------------------------------------------------------- /modules/common/programs/_schizofox/vertical-tabs.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | config, 4 | lib, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (builtins) readFile; 9 | 10 | firefox-csshacks = pkgs.fetchFromGitHub { 11 | owner = "MrOtherGuy"; 12 | repo = "firefox-csshacks"; 13 | rev = "91efcba213560eeaa67812672c60b9137e222676"; 14 | hash = "sha256-+psMiy3WFkYDL7HI5KBKU5b+r9qxudytkYlmqGNJS3o="; 15 | }; 16 | 17 | cfg = config.firefox; 18 | in { 19 | hjem.users.lunarnova.programs.schizofox = mkIf (cfg.enable && (cfg.app == "schizofox") && cfg.verticalTabs) { 20 | theme.extraUserChrome = 21 | readFile "${firefox-csshacks}/chrome/window_control_placeholder_support.css" 22 | + readFile "${firefox-csshacks}/chrome/hide_tabs_toolbar.css"; 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /modules/common/programs/firefox/firefox.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | lib, 4 | config, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (builtins) toJSON; 9 | 10 | toINI = lib.generators.toINI {}; 11 | 12 | cfg = config.firefox; 13 | in { 14 | hjem.users.lunarnova = mkIf (cfg.enable && (cfg.app == "mozilla")) { 15 | packages = [pkgs.firefox]; 16 | files = { 17 | ".mozilla/firefox/profiles.ini".text = toINI { 18 | Profile0 = { 19 | # creates lunarnova profile and sets it as default 20 | Name = "lunarnova"; 21 | IsRelative = 1; 22 | Path = "lunarnova"; 23 | Default = 1; 24 | }; 25 | }; 26 | ".mozilla/firefox/distribution/policies.json".text = toJSON { 27 | policies = { 28 | SearchEngines.Default = "DuckDuckGo"; 29 | }; 30 | }; 31 | }; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /modules/common/programs/firefox/search-engines.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | inherit (builtins) toJSON; 8 | 9 | cfg = config.firefox; 10 | in { 11 | hjem.users.lunarnova.files."mozilla/firefox/distribution/policies.json".text = mkIf (cfg.enable && (cfg.app == "mozilla")) (toJSON { 12 | policies.SearchEngines.Add = [ 13 | { 14 | Name = "Nix Packages"; 15 | URLTemplate = "https://search.nixos.org/packages?channel=unstable&query={searchTerms}"; 16 | Method = "GET"; 17 | Alias = "@np"; 18 | } 19 | { 20 | Name = "Nix Options"; 21 | URLTemplate = "https://search.nixos.org/options?channel=unstable&query={searchTerms}"; 22 | Method = "GET"; 23 | Alias = "@no"; 24 | } 25 | { 26 | Name = "NixOS Wiki"; 27 | URLTemplate = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; 28 | Method = "GET"; 29 | Alias = "@nw"; 30 | } 31 | { 32 | Name = "Home Manager Options"; 33 | URLTemplate = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master"; 34 | Method = "GET"; 35 | Alias = "@hmo"; 36 | } 37 | { 38 | Name = "ProtonDB"; 39 | URLTemplate = "https://www.protondb.com/search?q={searchTerms}"; 40 | Method = "GET"; 41 | IconURL = "https://www.protondb.com/sites/protondb/images/site-logo.svg"; 42 | Alias = "@pdb"; 43 | } 44 | { 45 | Name = "Rate My Professor"; 46 | URLTemplate = "https://www.ratemyprofessors.com/search/professors/1506?q={searchTerms}"; 47 | Method = "GET"; 48 | Alias = "@rmp"; 49 | } 50 | ]; 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /modules/common/programs/firefox/tab-groups.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | inherit (builtins) toJSON; 8 | 9 | cfg = config.firefox; 10 | in { 11 | config = mkIf (cfg.enable && (cfg.app == "mozilla")) { 12 | hjem.users.lunarnova.files.".mozilla/firefox/distribution/policies.json".text = toJSON { 13 | policies.preferences."browser.tabs.groups.enable" = true; 14 | }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /modules/common/programs/firefox/vertical-tabs.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | lib, 4 | config, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (builtins) toJSON readFile; 9 | 10 | firefox-csshacks = pkgs.fetchFromGitHub { 11 | owner = "MrOtherGuy"; 12 | repo = "firefox-csshacks"; 13 | rev = "91efcba213560eeaa67812672c60b9137e222676"; 14 | hash = "sha256-+psMiy3WFkYDL7HI5KBKU5b+r9qxudytkYlmqGNJS3o="; 15 | }; 16 | 17 | cfg = config.firefox; 18 | in { 19 | config = mkIf (cfg.enable && (cfg.app == "mozilla") && cfg.verticalTabs) { 20 | hjem.users.lunarnova.files = { 21 | ".mozilla/firefox/distribution/policies.json".text = toJSON { 22 | policies.preferences = { 23 | "sidebar.verticalTabs" = true; 24 | "toolkit.legacyUserProfileCustomizations.stylesheets" = true; 25 | }; 26 | }; 27 | ".mozilla/firefox/lunarnova/chrome/userChrome.css".source = ( 28 | readFile "${firefox-csshacks}/chrome/window_control_placeholder_support.css" 29 | + readFile "${firefox-csshacks}/chrome/hide_tabs_toolbar.css" 30 | ); 31 | }; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /modules/common/programs/git.nix: -------------------------------------------------------------------------------- 1 | {...}: let 2 | in { 3 | programs.git = { 4 | enable = true; 5 | config = { 6 | user = { 7 | email = "35857948+Lunarnovaa@users.noreply.github.com"; 8 | name = "lunarnovaa"; 9 | }; 10 | init.defaultBranch = "main"; 11 | }; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /modules/common/programs/keyd.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | services.keyd = { 3 | enable = true; 4 | keyboards.default = { 5 | ids = ["*"]; # Any keyboard 6 | 7 | # For some reason, when using non-QWERTY keyboard layouts, 8 | # keyd still accepts keys from their QWERTY position. 9 | # e.g. to set `capslock-n = left`, one must set `capslock-j = left` 10 | settings = { 11 | main = { 12 | capslock = "overload(capslock, esc)"; 13 | }; 14 | "capslock:C" = { 15 | j = "left"; 16 | k = "down"; 17 | l = "right"; 18 | i = "up"; 19 | }; 20 | "capslock+shift" = { 21 | j = "C-left"; 22 | k = "C-down"; 23 | l = "C-right"; 24 | i = "C-up"; 25 | }; 26 | }; 27 | }; 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /modules/common/programs/nh.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | programs.nh = { 3 | enable = true; 4 | flake = "/home/lunarnova/lunix"; 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /modules/common/programs/novavim.nix: -------------------------------------------------------------------------------- 1 | {inputs', ...}: { 2 | environment.systemPackages = [inputs'.novavim.packages.default]; 3 | environment.variables.EDITOR = "nvim"; 4 | hjem.users.lunarnova.environment.sessionVariables.EDITOR = "nvim"; 5 | } 6 | -------------------------------------------------------------------------------- /modules/common/programs/spotify/spicetify.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs, 3 | lib, 4 | config, 5 | pkgs, 6 | ... 7 | }: let 8 | inherit (lib.modules) mkIf; 9 | in { 10 | imports = [inputs.spicetify-nix.nixosModules.default]; 11 | config = mkIf config.loose.spicetify { 12 | programs.spicetify = let 13 | spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; 14 | in { 15 | enable = true; 16 | enabledExtensions = with spicePkgs.extensions; [ 17 | powerBar 18 | fullAlbumDate 19 | fullAppDisplay 20 | listPlaylistsWithSong 21 | playNext 22 | volumePercentage 23 | ]; 24 | enabledCustomApps = with spicePkgs.apps; [ 25 | lyricsPlus 26 | newReleases 27 | ]; 28 | theme = spicePkgs.themes.catppuccin; 29 | colorScheme = "mocha"; 30 | }; 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /modules/common/programs/spotify/spotify-player.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | pkgs, 4 | ... 5 | }: let 6 | catppuccin-spotify-player = pkgs.fetchFromGitHub { 7 | owner = "catppuccin"; 8 | repo = "spotify-player"; 9 | rev = "34b3d23806770185b72466d777853c73454b85a6"; 10 | hash = "sha256-eenf1jB8b2s2qeG7wAApGwkjJZWVNzQj/wEZMUgnn5U="; 11 | }; 12 | in { 13 | hjem.users.lunarnova = { 14 | rum.programs.spotify-player = { 15 | enable = true; 16 | settings = { 17 | client_id_command = "cat ${config.age.secrets.spotifyClientID.path}"; 18 | theme = "Catppuccin-mocha"; 19 | device = { 20 | name = "${config.networking.hostName}"; 21 | device_type = "computer"; 22 | volume = 60; 23 | normalization = true; 24 | }; 25 | }; 26 | }; 27 | files.".config/spotify-player/theme.toml".source = "${catppuccin-spotify-player}/theme.toml"; 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /modules/common/programs/terminal/alacritty.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | #pkgs, 5 | theme, 6 | ... 7 | }: let 8 | inherit (lib.modules) mkIf; 9 | inherit (theme) colors fonts; 10 | #toTOML = (pkgs.formats.toml {}).generate; 11 | in { 12 | config = mkIf config.terminal.apps.alacritty { 13 | hjem.users.lunarnova.rum.programs.alacritty = { 14 | enable = true; 15 | settings = { 16 | font = { 17 | size = fonts.size; 18 | normal.family = "${fonts.monospace.name}"; 19 | }; 20 | window = { 21 | dimensions = { 22 | lines = 28; 23 | columns = 101; 24 | }; 25 | padding = { 26 | x = 6; 27 | y = 3; 28 | }; 29 | }; 30 | colors = { 31 | bright = { 32 | black = "${colors.base00}"; 33 | blue = "${colors.base0D}"; 34 | cyan = "${colors.base0C}"; 35 | green = "${colors.base0B}"; 36 | magenta = "${colors.base0E}"; 37 | red = "${colors.base08}"; 38 | white = "${colors.base06}"; 39 | yellow = "${colors.base09}"; 40 | }; 41 | cursor = { 42 | cursor = "${colors.base06}"; 43 | text = "${colors.base06}"; 44 | }; 45 | normal = { 46 | black = "${colors.base00}"; 47 | blue = "${colors.base0D}"; 48 | cyan = "${colors.base0C}"; 49 | green = "${colors.base0B}"; 50 | magenta = "${colors.base0E}"; 51 | red = "${colors.base08}"; 52 | white = "${colors.base06}"; 53 | yellow = "${colors.base0A}"; 54 | }; 55 | primary = { 56 | background = "${colors.base00}"; 57 | foreground = "${colors.base06}"; 58 | }; 59 | }; 60 | }; 61 | }; 62 | 63 | /* 64 | hjem.users.lunarnova = { 65 | packages = with pkgs; [alacritty]; 66 | files.".config/alacritty/alacritty.toml".source = toTOML "alacritty config" { 67 | font = { 68 | size = fonts.size; 69 | normal.family = "${fonts.monospace}"; 70 | }; 71 | window = { 72 | dimensions = { 73 | lines = 28; 74 | columns = 101; 75 | }; 76 | padding = { 77 | x = 6; 78 | y = 3; 79 | }; 80 | }; 81 | colors = { 82 | bright = { 83 | black = "0x${colors.base00}"; 84 | blue = "0x${colors.base0D}"; 85 | cyan = "0x${colors.base0C}"; 86 | green = "0x${colors.base0B}"; 87 | magenta = "0x${colors.base0E}"; 88 | red = "0x${colors.base08}"; 89 | white = "0x${colors.base06}"; 90 | yellow = "0x${colors.base09}"; 91 | }; 92 | cursor = { 93 | cursor = "0x${colors.base06}"; 94 | text = "0x${colors.base06}"; 95 | }; 96 | normal = { 97 | black = "0x${colors.base00}"; 98 | blue = "0x${colors.base0D}"; 99 | cyan = "0x${colors.base0C}"; 100 | green = "0x${colors.base0B}"; 101 | magenta = "0x${colors.base0E}"; 102 | red = "0x${colors.base08}"; 103 | white = "0x${colors.base06}"; 104 | yellow = "0x${colors.base0A}"; 105 | }; 106 | primary = { 107 | background = "0x${colors.base00}"; 108 | foreground = "0x${colors.base06}"; 109 | }; 110 | }; 111 | }; 112 | }; 113 | */ 114 | }; 115 | } 116 | -------------------------------------------------------------------------------- /modules/common/programs/terminal/foot.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | theme, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (lib.strings) removePrefix; 9 | inherit (theme) fonts; 10 | inherit (builtins) mapAttrs toString; 11 | 12 | colors = mapAttrs (_: v: removePrefix "#" v) theme.colors; 13 | 14 | cfg = config.terminal.apps.foot; 15 | in { 16 | config = mkIf cfg.enable { 17 | hjem.users.lunarnova.rum.programs.foot = { 18 | enable = true; 19 | settings = { 20 | main = { 21 | font = "${fonts.monospace.name}:size=${toString fonts.size}"; 22 | pad = "6x3"; 23 | }; 24 | mouse.hide-when-typing = "yes"; 25 | 26 | cursor = { 27 | blink = "yes"; 28 | color = "${colors.base11} ${colors.base06}"; 29 | }; 30 | colors = { 31 | foreground = colors.base05; 32 | background = colors.base01; 33 | 34 | regular0 = colors.base03; 35 | regular1 = colors.base08; 36 | regular2 = colors.base0B; 37 | regular3 = colors.base0A; 38 | regular4 = colors.base0D; 39 | regular5 = colors.base17; 40 | regular6 = colors.base0C; 41 | regular7 = "bac2de"; # subtext 1, not in basix 42 | 43 | bright0 = colors.base04; 44 | bright1 = colors.base08; 45 | bright2 = colors.base0B; 46 | bright3 = colors.base0A; 47 | bright4 = colors.base0D; 48 | bright5 = colors.base17; 49 | bright6 = colors.base0C; 50 | bright7 = "a6adc8"; # subtext 0, not in basix 51 | 52 | "16" = colors.base09; 53 | "17" = colors.base06; 54 | 55 | selection-foreground = colors.base05; 56 | selection-background = colors.base03; 57 | 58 | search-box-no-match = "${colors.base11} ${colors.base08}"; 59 | search-box-match = "${colors.base05} ${colors.base02}"; 60 | 61 | jump-labels = "${colors.base11} ${colors.base09}"; 62 | urls = colors.base0D; 63 | }; 64 | }; 65 | }; 66 | }; 67 | } 68 | -------------------------------------------------------------------------------- /modules/common/programs/terminal/nushell.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (lib.strings) concatStringsSep; 9 | inherit (lib.attrsets) mapAttrsToList; 10 | 11 | starshipCache = "${config.hjem.users.lunarnova.directory}/.cache/starship"; 12 | 13 | novavimDir = "${config.hjem.users.lunarnova.directory}/projects/novavim"; 14 | 15 | variables = config.hjem.users.lunarnova.environment.sessionVariables; 16 | nuVars = concatStringsSep ", " (mapAttrsToList (n: v: "${n}: ${v}") variables); 17 | in { 18 | config = mkIf config.terminal.apps.nushell { 19 | users.users.lunarnova.shell = pkgs.nushell; 20 | hjem.users.lunarnova = { 21 | packages = [pkgs.nushell]; 22 | files = { 23 | ".config/nushell/config.nu".text = '' 24 | 25 | # disabling the basic banner on startup 26 | $env.config.show_banner = false 27 | 28 | load-env {${nuVars}} 29 | 30 | # aliases and other stuff 31 | 32 | alias ll = ls -l 33 | alias ndev = nix develop --command nu 34 | 35 | alias spp = spotify_player 36 | 37 | alias devnovavim = nix run ${novavimDir} ${novavimDir} 38 | 39 | def nbuild [] { 40 | cd ~/nix-tools 41 | nix develop --command nu 42 | } 43 | 44 | def agsr [] { 45 | nix shell github:aylur/ags#agsFull -c ags run ~/nixconf/modules/desktop/hyprland/astal/src/app.ts --gtk4 46 | } 47 | 48 | def webdev [--run (-r)] { 49 | cd ~/aurabora.org 50 | if $run { 51 | nix develop --command pnpm run dev 52 | } else { 53 | nix develop --command nu 54 | } 55 | } 56 | 57 | 58 | # starship init 59 | 60 | use ${starshipCache}/init.nu 61 | ''; 62 | ".config/nushell/env.nu".text = '' 63 | # defines the starship init process 64 | mkdir ${starshipCache} 65 | starship init nu | save -f ${starshipCache}/init.nu 66 | ''; 67 | }; 68 | }; 69 | }; 70 | } 71 | -------------------------------------------------------------------------------- /modules/common/programs/terminal/starship.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | pkgs, 4 | config, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | toTOML = (pkgs.formats.toml {}).generate; 10 | in { 11 | config = mkIf config.terminal.apps.spaceship { 12 | hjem.users.lunarnova = { 13 | packages = [pkgs.starship]; 14 | files.".config/starship.toml".source = toTOML "starship config" { 15 | add_newline = false; 16 | }; 17 | }; 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /modules/common/system/bootloader.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Configure the Bootloader 3 | boot.loader = { 4 | systemd-boot = { 5 | enable = true; 6 | }; 7 | efi = { 8 | canTouchEfiVariables = true; 9 | }; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /modules/common/system/caches.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Enable caches to avoid building from source 3 | nix.settings = { 4 | substituters = [ 5 | "https://hyprland.cachix.org" 6 | "https://cosmic.cachix.org/" 7 | ]; 8 | trusted-public-keys = [ 9 | "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" 10 | "cosmic.cachix.org-1:Dya9IyXD4xdBehWjrkPv6rtxpmMdRel02smYzA85dPE=" 11 | ]; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /modules/common/system/drivers/graphics.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | hardware.graphics = { 3 | enable = true; 4 | enable32Bit = true; 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /modules/common/system/drivers/nvidia.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | ... 5 | }: { 6 | config = lib.mkIf config.sysconf.nvidia { 7 | services.xserver.videoDrivers = ["nvidia"]; 8 | 9 | hardware.nvidia = { 10 | # Use Production Driver by default - Currently 570.124.04 11 | package = config.boot.kernelPackages.nvidiaPackages.production; 12 | 13 | modesetting.enable = true; 14 | nvidiaSettings = true; #accessible via nvidia-settings 15 | open = false; #suspend issues 16 | 17 | powerManagement.enable = true; 18 | }; 19 | boot.kernelParams = ["nvidia.NVreg_PreserveVideoMemoryAllocations=1"]; 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /modules/common/system/drivers/printing.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Enable CUPS to Print 3 | services.printing.enable = true; 4 | 5 | # Enable Autodiscovery of Printers 6 | services.avahi = { 7 | enable = true; 8 | nssmdns4 = true; 9 | openFirewall = true; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /modules/common/system/drivers/via.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs, 3 | lib, 4 | config, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | in { 9 | config = mkIf config.loose.via { 10 | services.udev.packages = [pkgs.vial]; 11 | environment.systemPackages = [pkgs.vial]; 12 | 13 | /* 14 | NOTE FOR FUTURE SELF 15 | holy fucking christ shit I HATE THIS 16 | I spent hours trying to FIGURE OUT WHY IT WASNT WORKING 17 | here it is. 18 | For K6 PRO: 19 | Download json from keychron website for via shit 20 | on vial, go to File->Sideload via JSON and select the downloaded file 21 | NOW UNPLUG THE DAMN KEYBAORD 22 | PLUG IT BACK IN. 23 | NOW IT WORKS. 24 | */ 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /modules/common/system/locales.nix: -------------------------------------------------------------------------------- 1 | {...}: { 2 | # Configure Timezone 3 | time.timeZone = "America/Los_Angeles"; 4 | 5 | # Select internationalisation properties. 6 | i18n.defaultLocale = "en_US.UTF-8"; 7 | i18n.extraLocaleSettings = { 8 | LC_ADDRESS = "en_US.UTF-8"; 9 | LC_IDENTIFICATION = "en_US.UTF-8"; 10 | LC_MEASUREMENT = "en_US.UTF-8"; 11 | LC_MONETARY = "en_US.UTF-8"; 12 | LC_NAME = "en_US.UTF-8"; 13 | LC_NUMERIC = "en_US.UTF-8"; 14 | LC_PAPER = "en_US.UTF-8"; 15 | LC_TELEPHONE = "en_US.UTF-8"; 16 | LC_TIME = "en_US.UTF-8"; 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /modules/common/system/maintenance.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | pkgs, 4 | ... 5 | }: { 6 | config = { 7 | systemd.services.system-maintenance = { 8 | description = "Attended Automatic System Maintenance"; 9 | 10 | restartIfChanged = false; 11 | unitConfig.X-StopOnRemoval = false; 12 | 13 | serviceConfig.Type = "oneshot"; 14 | 15 | environment = config.nix.envVars; 16 | 17 | path = with pkgs; [ 18 | nh 19 | alacritty 20 | nushell 21 | ]; 22 | 23 | script = let 24 | alacritty = "${pkgs.alacritty}/bin/alacritty"; 25 | nh = "${pkgs.nh}/bin/nh"; 26 | nu = "${pkgs.nushell}/bin/nu"; 27 | nix-store = "${config.nix.package}/bin/nix-store"; 28 | in 29 | # Couldn't figure out how to feed alacritty multiple programs so I just fed it into nu. 30 | '' 31 | ${alacritty} -e ${nu} -c "\ 32 | ${nh} os boot ${config.programs.nh.flake} --update --ask ; \ 33 | ${nh} clean all --keep-since 7d --keep 3 ; \ 34 | ${nix-store} --optimise" 35 | ''; 36 | 37 | startAt = "Mon,Wed,Sat 08:00:00"; 38 | 39 | after = ["network-online.target"]; 40 | wants = ["network-online.target"]; 41 | }; 42 | 43 | systemd.timers.system-maintenance = { 44 | timerConfig.Persistent = true; # Will update on next boot after timer went off 45 | }; 46 | }; 47 | } 48 | -------------------------------------------------------------------------------- /modules/common/system/networking.nix: -------------------------------------------------------------------------------- 1 | {config, ...}: let 2 | inherit (config.age.secrets) wifiPassword; 3 | in { 4 | # Enable Networking 5 | networking = { 6 | networkmanager = { 7 | enable = true; 8 | ensureProfiles = { 9 | environmentFiles = [ 10 | wifiPassword.path 11 | ]; 12 | profiles = { 13 | aquacell = { 14 | connection = { 15 | id = "Aquacell 5G"; 16 | type = "wifi"; 17 | autoconnect = true; 18 | }; 19 | ipv4.method = "auto"; 20 | wifi = { 21 | ssid = "Aquacell 5G"; 22 | }; 23 | wifi-security = { 24 | key-mgmt = "wpa-psk"; 25 | psk = "$psk_Aquacell5G"; 26 | }; 27 | }; 28 | ethernet = { 29 | connection = { 30 | id = "Ethernet"; 31 | type = "ethernet"; 32 | autoconnect = true; 33 | }; 34 | ipv4.method = "auto"; 35 | }; 36 | }; 37 | }; 38 | }; 39 | firewall = { 40 | enable = true; 41 | allowedTCPPorts = [25565]; 42 | }; 43 | }; 44 | #Enable Bluetooth 45 | hardware.bluetooth.enable = true; 46 | } 47 | -------------------------------------------------------------------------------- /modules/common/system/nix.nix: -------------------------------------------------------------------------------- 1 | {inputs, ...}: { 2 | # Allow unfree packages to be installed 3 | nixpkgs.config.allowUnfree = true; 4 | 5 | # Enable Flakes 6 | nix.settings.experimental-features = ["nix-command" "flakes"]; 7 | 8 | # Flake registry 9 | nix.registry.system.flake = inputs.self; 10 | 11 | # Don't change from 24.05 12 | system.stateVersion = "24.05"; # Did you read the comment? 13 | } 14 | -------------------------------------------------------------------------------- /modules/common/users/agenix.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs', 3 | inputs, 4 | ... 5 | }: let 6 | secretsDir = ../../../secrets; 7 | in { 8 | environment.systemPackages = [inputs'.agenix.packages.default]; 9 | age.secrets = { 10 | userPassword.file = secretsDir + /userPassword.age; 11 | wifiPassword.file = secretsDir + /wifiPassword.age; 12 | spotifyPassword.file = secretsDir + /spotifyPassword.age; 13 | spotifyClientID.file = secretsDir + /spotifyClientID.age; 14 | }; 15 | imports = [inputs.agenix.nixosModules.default]; 16 | age.identityPaths = ["/etc/ssh/ssh_host_ed25519_key"]; 17 | } 18 | -------------------------------------------------------------------------------- /modules/common/users/lunarnova.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | inputs, 4 | ... 5 | }: { 6 | imports = [inputs.hjem.nixosModules.default]; 7 | 8 | # Define the User 9 | users.users.lunarnova = { 10 | isNormalUser = true; 11 | extraGroups = ["networkmanager" "wheel"]; 12 | hashedPasswordFile = config.age.secrets.userPassword.path; 13 | }; 14 | 15 | # Setup hjem 16 | hjem = { 17 | extraModules = [inputs.hjem-rum.hjemModules.default]; 18 | clobberByDefault = true; 19 | users.lunarnova = { 20 | enable = true; 21 | directory = "/home/lunarnova"; 22 | user = "lunarnova"; 23 | }; 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/apps/files.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | inputs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (inputs.lunarsLib.generators.ron) mkRON; 9 | 10 | cfg = config.desktops.cosmic; 11 | in { 12 | config = mkIf cfg.enable { 13 | desktops.cosmic.settings.CosmicFiles = { 14 | tab = { 15 | show_hidden = true; 16 | view = mkRON "enum" "Grid"; 17 | }; 18 | }; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/config.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | theme, 5 | inputs, 6 | ... 7 | }: let 8 | inherit (lib.modules) mkIf; 9 | inherit (theme) wallpapers; 10 | inherit (inputs.lunarsLib.generators.ron) mkRON importRON; 11 | 12 | cfg = config.desktops.cosmic; 13 | in { 14 | config = mkIf cfg.enable { 15 | desktops.cosmic.settings = { 16 | CosmicBackground = { 17 | all = { 18 | output = "all"; 19 | rotation_frequency = 300; 20 | filter_method = mkRON "enum" "Lanczos"; 21 | scaling_mode = mkRON "enum" "Zoom"; 22 | sampling_method = mkRON "enum" "Alphanumeric"; 23 | source = mkRON "enum" { 24 | value = [wallpapers.primary]; 25 | variant = "Path"; 26 | }; 27 | filter_by_theme = true; 28 | }; 29 | same-on-all = true; 30 | }; 31 | "CosmicSettings.Wallpaper".custom-images = [wallpapers.primary]; 32 | 33 | CosmicSettings.active-page = "mouse"; 34 | 35 | CosmicIdle.suspend_on_ac_time = mkRON "enum" "None"; 36 | 37 | CosmicPanel.entries = ["Panel"]; 38 | 39 | "CosmicPanel.Panel" = { 40 | anchor = mkRON "enum" "Left"; 41 | anchor_gap = false; 42 | autohide = mkRON "enum" "None"; 43 | exclusive_zone = true; 44 | expand_to_edges = true; 45 | opacity = 1.0; 46 | size = mkRON "enum" "XS"; 47 | 48 | plugins_center = mkRON "optional" [ 49 | "com.system76.CosmicAppletTime" 50 | ]; 51 | 52 | plugins_wings = mkRON "optional" (mkRON "tuple" [ 53 | # Top / Right 54 | [ 55 | "com.system76.CosmicAppletWorkspaces" 56 | ] 57 | # Bottom / Left 58 | [ 59 | "com.system76.CosmicAppletInputSources" 60 | "com.system76.CosmicAppletStatusArea" 61 | "com.system76.CosmicAppletTiling" 62 | "com.system76.CosmicAppletAudio" 63 | "com.system76.CosmicAppletNetwork" 64 | "com.system76.CosmicAppletBattery" 65 | "com.system76.CosmicAppletNotifications" 66 | "com.system76.CosmicAppletBluetooth" 67 | "com.system76.CosmicAppletPower" 68 | ] 69 | ]); 70 | }; 71 | 72 | CosmicAppletTime = { 73 | first_day_of_week = 0; # Monday 74 | military_time = true; # 24hr time 75 | show_date_in_top_panel = true; 76 | show_seconds = false; 77 | }; 78 | 79 | CosmicAppletAudio.show_media_controls_in_top_panel = false; 80 | 81 | CosmicTk = { 82 | interface_font = { 83 | family = theme.fonts.sans.name; 84 | weight = mkRON "enum" "Normal"; 85 | }; 86 | monospace_font = { 87 | family = theme.fonts.monospace.name; 88 | weight = mkRON "enum" "Normal"; 89 | }; 90 | show_maximize = false; 91 | show_minimize = false; 92 | }; 93 | 94 | CosmicPortal.screenshot = { 95 | save_location = mkRON "enum" "Clipboard"; 96 | choice = mkRON "enum" "Rectangle"; 97 | }; 98 | 99 | CosmicComp = { 100 | active_hint = true; 101 | autotile = true; 102 | autotile-behavior = mkRON "enum" "PerWorkspace"; 103 | focus_follows_cursor = true; 104 | focus_follows_cursor_delay = 50; # ms 105 | /* 106 | input_default = { 107 | state = mkRON "enum" "Enabled"; 108 | acceleration = mkRON "optional" { 109 | profile = mkRON "optional" (mkRON "enum" "Flat"); 110 | speed = mkRON "raw" "-.52.6"; 111 | }; 112 | }; 113 | 114 | xkb_config = { 115 | rules = ""; 116 | model = "pc104"; 117 | layout = "us,us"; 118 | variant = "colemak,"; 119 | options = mkRON "optional" ",caps:super"; 120 | repeat-delay = 600; 121 | repeat_rate = 25; 122 | }; 123 | */ 124 | }; 125 | }; 126 | }; 127 | } 128 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/cosmic.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | cfg = config.desktops.cosmic; 9 | in { 10 | config = mkIf cfg.enable { 11 | services.desktopManager.cosmic = { 12 | enable = true; 13 | xwayland.enable = true; # By default this is enabled 14 | }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/greeter.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | cfg = config.desktops.cosmic; 9 | in { 10 | config = mkIf cfg.enable { 11 | services.displayManager.cosmic-greeter.enable = true; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/module.nix: -------------------------------------------------------------------------------- 1 | {inputs, ...}: { 2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.; 3 | } 4 | -------------------------------------------------------------------------------- /modules/desktops/cosmic/settings.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | inputs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | inherit (inputs.lunarsLib.generators.ron) toRON; 9 | inherit (lib.attrsets) mergeAttrsList mapAttrsToList mapAttrs' nameValuePair; 10 | 11 | /* 12 | Credit to dindresto for assistance with the function 'mkSettings' 13 | 14 | # In essence, it takes an attrset like: 15 | 16 | settings = { 17 | foo = { 18 | x = 1; 19 | y = 2; 20 | }; 21 | bar = { 22 | z = { 23 | n = 1; 24 | m = 2; 25 | }; 26 | }; 27 | }; 28 | 29 | # and turns it into a set of files managed by hjem like: 30 | 31 | ".config/cosmic/com.system76.foo/v1/x".text = ''1''; 32 | ".config/cosmic/com.system76.foo/v1/y".text = ''2''; 33 | ".config/cosmic/com.system76.bar/v1/z".text = '' 34 | ( 35 | n: 1, 36 | m: 2, 37 | ) 38 | ''; 39 | 40 | # the attrset is of course converted with the toRON generator 41 | # seen in parts/lib/lunar/generators/ron.nix 42 | 43 | # in the future, the version ("v1") may become configurable, 44 | # but for now, i could not see why that would be useful. 45 | */ 46 | mkSettings = settings: 47 | mergeAttrsList ( 48 | mapAttrsToList ( 49 | n: 50 | mapAttrs' ( 51 | n': v': 52 | nameValuePair ".config/cosmic/com.system76.${n}/v1/${n'}" { 53 | text = toRON 0 v'; 54 | } 55 | ) 56 | ) 57 | settings 58 | ); 59 | 60 | cfg = config.desktops.cosmic; 61 | in { 62 | config = mkIf cfg.enable { 63 | hjem.users.lunarnova.files = mkSettings cfg.settings; 64 | }; 65 | } 66 | -------------------------------------------------------------------------------- /modules/desktops/couch/gaming.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | loginScript = pkgs.pkgs.writeShellScriptBin "login-startup" '' 10 | #!/usr/bin/env bash 11 | set -xeuo pipefail 12 | 13 | gamescopeArgs=( 14 | --adaptive-sync # VRR support 15 | #--hdr-enabled 16 | --mangoapp # performance overlay 17 | --rt 18 | --steam 19 | ) 20 | steamArgs=( 21 | -pipewire-dmabuf 22 | -tenfoot 23 | ) 24 | mangoConfig=( 25 | cpu_temp 26 | gpu_temp 27 | ram 28 | vram 29 | ) 30 | mangoVars=( 31 | MANGOHUD=1 32 | MANGOHUD_CONFIG="$(IFS=,; echo "$mangoConfig")" 33 | ) 34 | 35 | export "$mangoVars" 36 | exec gamescope "$gamescopeArgs" -- steam "$steamArgs" 37 | ''; 38 | 39 | cfg = config.profiles.gaming; 40 | in { 41 | config = mkIf (cfg.enable && cfg.programs.steam.enable) { 42 | programs = { 43 | gamescope = { 44 | enable = true; 45 | }; 46 | steam.gamescopeSession = { 47 | enable = true; 48 | }; 49 | }; 50 | services.getty.autoLoginUser = "lunarnova"; 51 | environment.loginShellInit = '' 52 | [[ "$(tty)" = "/dev/tty1" ]] && ${loginScript}/bin/loginstartup 53 | ''; 54 | }; 55 | } 56 | -------------------------------------------------------------------------------- /modules/desktops/couch/module.nix: -------------------------------------------------------------------------------- 1 | {inputs, ...}: { 2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.; 3 | } 4 | -------------------------------------------------------------------------------- /modules/desktops/gnome/apps/exclude.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.desktops.gnome; 10 | in { 11 | config = mkIf cfg.enable { 12 | environment.gnome.excludePackages = with pkgs; [ 13 | orca 14 | evince 15 | # file-roller 16 | geary 17 | gnome-disk-utility 18 | # seahorse 19 | # sushi 20 | # sysprof 21 | # 22 | # gnome-shell-extensions 23 | # 24 | # adwaita-icon-theme 25 | # nixos-background-info 26 | gnome-backgrounds 27 | # gnome-bluetooth 28 | # gnome-color-manager 29 | # gnome-control-center 30 | # gnome-shell-extensions 31 | gnome-tour # GNOME Shell detects the .desktop file on first log-in. 32 | gnome-user-docs 33 | # glib # for gsettings program 34 | # gnome-menus 35 | # gtk3.out # for gtk-launch program 36 | # xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/ 37 | # xdg-user-dirs-gtk # Used to create the default bookmarks 38 | # 39 | baobab 40 | epiphany 41 | gnome-text-editor 42 | gnome-calculator 43 | gnome-calendar 44 | gnome-characters 45 | # gnome-clocks 46 | gnome-console 47 | gnome-contacts 48 | gnome-font-viewer 49 | gnome-logs 50 | gnome-maps 51 | gnome-music 52 | # gnome-system-monitor 53 | gnome-weather 54 | # loupe 55 | # nautilus 56 | gnome-connections 57 | simple-scan 58 | snapshot 59 | totem 60 | yelp 61 | gnome-software 62 | ]; 63 | }; 64 | } 65 | -------------------------------------------------------------------------------- /modules/desktops/gnome/config.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | theme, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.desktops.gnome; 10 | in { 11 | config = mkIf cfg.enable { 12 | programs.dconf.profiles.lunarnova.databases = [ 13 | { 14 | settings = { 15 | "org/gnome/desktop/interface" = { 16 | }; 17 | "org/gnome/desktop/background".picture-uri = theme.wallpapers.primary; 18 | }; 19 | } 20 | ]; 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /modules/desktops/gnome/extensions/appindicator.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.desktops.gnome; 10 | in { 11 | config = mkIf (cfg.enable && cfg.extensions.enable) { 12 | desktops.gnome.extensions.packages = [pkgs.gnomeExtensions.appindicator]; 13 | services.udev.packages = [pkgs.gnome-settings-daemon]; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /modules/desktops/gnome/extensions/blur-my-shell.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.desktops.gnome; 10 | in { 11 | config = mkIf (cfg.enable && cfg.extensions.enable) { 12 | desktops.gnome.extensions.packages = [pkgs.gnomeExtensions.blur-my-shell]; 13 | /* 14 | programs.dconf.profiles.lunarnova.databases = [ 15 | { 16 | settings."org/gnome/shell/extensions/blur-my-shell" = { 17 | brightness = 0.75; 18 | noise-amount = 0; 19 | }; 20 | } 21 | ]; 22 | */ 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /modules/desktops/gnome/extensions/extensions.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | inherit (lib.lists) flatten; 8 | inherit (lib.trivial) pipe; 9 | inherit (lib.attrsets) getAttrs; 10 | inherit (builtins) map attrValues; 11 | 12 | extensionUUIDs = pipe cfg.extensions.packages [ 13 | (map (extension: 14 | pipe extension [ 15 | (getAttrs ["extensionUuid"]) 16 | attrValues 17 | ])) 18 | flatten 19 | ]; 20 | 21 | cfg = config.desktops.gnome; 22 | in { 23 | config = mkIf (cfg.enable && cfg.extensions.enable) { 24 | environment.systemPackages = cfg.extensions.packages; 25 | programs.dconf.profiles.lunarnova.databases = [ 26 | { 27 | settings."org/gnome/shell" = { 28 | disable-user-extensions = false; # Enable user extensions (lol) 29 | enabled-extensions = extensionUUIDs; 30 | }; 31 | } 32 | ]; 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /modules/desktops/gnome/gdm.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | cfg = config.desktops.gnome; 9 | in { 10 | config = mkIf cfg.enable { 11 | services.xserver.displayManager.gdm = { 12 | enable = true; 13 | settings = { 14 | daemon = { 15 | User = "lunarnova"; 16 | }; 17 | }; 18 | }; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /modules/desktops/gnome/gnome.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | ... 5 | }: let 6 | inherit (lib.modules) mkIf; 7 | 8 | cfg = config.desktops.gnome; 9 | in { 10 | config = mkIf cfg.enable { 11 | services.xserver = { 12 | enable = true; 13 | desktopManager.gnome.enable = true; 14 | }; 15 | programs.dconf.enable = true; 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /modules/desktops/gnome/module.nix: -------------------------------------------------------------------------------- 1 | {inputs, ...}: { 2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.; 3 | } 4 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/apps/nemo.nix: -------------------------------------------------------------------------------- 1 | { 2 | lib, 3 | config, 4 | pkgs, 5 | ... 6 | }: let 7 | inherit (lib.modules) mkIf; 8 | 9 | cfg = config.desktops.hyprland; 10 | in { 11 | config = mkIf cfg.enable { 12 | hjem.users.lunarnova.packages = [pkgs.nemo]; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | @girs/ 3 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/app.ts: -------------------------------------------------------------------------------- 1 | import { App } from "astal/gtk4" 2 | import style from "./style.scss" 3 | import Bar from "./widget/Bar/Bar" 4 | 5 | 6 | App.start({ 7 | css: style, 8 | main() { 9 | Bar(0) 10 | }, 11 | }) 12 | 13 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/env.d.ts: -------------------------------------------------------------------------------- 1 | declare const SRC: string 2 | 3 | declare module "inline:*" { 4 | const content: string 5 | export default content 6 | } 7 | 8 | declare module "*.scss" { 9 | const content: string 10 | export default content 11 | } 12 | 13 | declare module "*.blp" { 14 | const content: string 15 | export default content 16 | } 17 | 18 | declare module "*.css" { 19 | const content: string 20 | export default content 21 | } 22 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "astal-shell", 3 | "dependencies": { 4 | "astal": "/nix/store/hd98qfcisszjr5prmb9dz0wd7fq74ffn-astal-gjs/share/astal/gjs" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/style.scss: -------------------------------------------------------------------------------- 1 | $base00: #1e1e2e; 2 | $base02: #313244; 3 | $base05: #cdd6f4; 4 | $font: "Ioshelfka Mono Nerdfont"; 5 | 6 | 7 | window.Bar { 8 | background: $base00; 9 | color: $base05; 10 | font-family: $font; 11 | font-weight: bold; 12 | font-size: 20px; 13 | 14 | >centerbox { 15 | border-radius: 5px; 16 | margin: 8px; 17 | } 18 | 19 | .element { 20 | background: $base02; 21 | color: $base05; 22 | font-weight: bold; 23 | font-size: 20px; 24 | font-family: $font; 25 | margin: 2px; 26 | } 27 | button { 28 | border-radius: 0px; 29 | background: transparent; 30 | border-width: 4px; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "experimentalDecorators": true, 5 | "strict": true, 6 | "target": "ES2022", 7 | "module": "ES2022", 8 | "moduleResolution": "Bundler", 9 | // "checkJs": true, 10 | // "allowJs": true, 11 | "jsx": "react-jsx", 12 | "jsxImportSource": "astal/gtk4", 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/widget/Bar/Bar.tsx: -------------------------------------------------------------------------------- 1 | import { Astal, Gtk } from "astal/gtk4" 2 | 3 | 4 | import Workspaces from "./elements/Workspaces" 5 | import SysTray from "./elements/SysTray" 6 | import Time from "./elements/Time" 7 | import Power from "./elements/Power" 8 | 9 | export default function Bar(monitor = 0) { 10 | const { TOP, LEFT, BOTTOM } = Astal.WindowAnchor 11 | return 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/widget/Bar/elements/AppMenu.tsx: -------------------------------------------------------------------------------- 1 | import { bind } from "astal" 2 | import { App, Astal, Gdk, Gtk } from "astal/gtk4" 3 | import { Variable } from "astal" 4 | 5 | import Apps from "gi://AstalApps" 6 | 7 | const MAX_ITEMS = 8 8 | 9 | function hide() { 10 | App.get_window("launcher")!.hide() 11 | } 12 | 13 | function AppButton({ app}: {app: Apps.Application}) { 14 | return 34 | } 35 | 36 | export default function AppLauncher() { 37 | const { CENTER } = Gtk.Align 38 | const apps = new Apps.Apps() 39 | const width = Variable(1000) 40 | 41 | const text = Variable("") 42 | const list = text(text => apps.fuzzy_query(text).slice(0, MAX_ITEMS)) 43 | const onEnter = () => { 44 | apps.fuzzy_query(text.get())?.[0].launch() 45 | hide() 46 | } 47 | 48 | return { 55 | text.set("") 56 | width.set(self.get_current_monitor().workarea.width) 57 | }} 58 | onKeyPressEven={function (self, event: Gdk.Event) { 59 | if (event.get_keyval()[1] === Gdk.KEY_Escape) 60 | self.hide() 61 | }}> 62 | 63 | 64 | } 65 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/widget/Bar/elements/Power.tsx: -------------------------------------------------------------------------------- 1 | import { Astal,Gtk } from "astal/gtk4" 2 | import { Variable } from "astal" 3 | 4 | const Show = Variable(false) 5 | function Confirm(Show) { 6 | const { TOP } = Astal.WindowAnchor 7 | 8 | return 13 | 16 | Shutdown? 17 | 18 | 27 | 28 | 29 | 30 | } 31 | 32 | function BatteryLevel() { 33 | const bat = Battery.get_default() 34 | 35 | return 36 | 38 | `${Math.floor(p * 100)}%` 39 | )} 40 | iconName={bind(bat, "batteryIconName")} 41 | /> 42 | 43 | } 44 | 45 | function Wifi() { 46 | const network = Network.get_default() 47 | const wifi = bind(network, "wifi") 48 | const wired = bind(network, "wired") 49 | 50 | let content 51 | 52 | if (wired.as(Boolean)) { 53 | content = wired.as(wired => wired && ( 54 | 58 | )) 59 | 60 | } else if (wifi.as(Boolean)) { 61 | content = wifi.as(wifi => wifi && ( 62 | 66 | )) 67 | } else { 68 | content = wifi.as(wifi => wifi && ( 69 | 70 | 74 | ))} 75 | 76 | return 77 | } 78 | 79 | function BT() { 80 | const bluetooth = Bluetooth.get_default() 81 | 82 | let icon 83 | 84 | if (bluetooth.get_is_connected()) { 85 | icon = "󰂱" 86 | } else if (bluetooth.get_is_powered()) { 87 | icon = "󰂯" 88 | } else if (!bluetooth.get_is_powered()) { 89 | icon = "󰂲" 90 | } else { 91 | icon = "?" 92 | } 93 | 94 | return 99 | } 100 | 101 | export default function SysTray() { 102 | return 107 | 108 | 109 | 110 | 111 | 112 | } 113 | -------------------------------------------------------------------------------- /modules/desktops/hyprland/astal/src/widget/Bar/elements/Time.tsx: -------------------------------------------------------------------------------- 1 | import { Variable, GLib } from "astal" 2 | 3 | 4 | export default function Time({ format = "%H %M" }) { 5 | const time = Variable("").poll(1000, () => 6 | GLib.DateTime.new_now_local().format(format)!) 7 | 8 | return