├── 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 |
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 |
28 | P
29 |
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 { hide(); app.launch() }}>
16 |
17 |
20 |
21 |
26 | {app.description && }
31 |
32 |
33 |
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 |
22 |
26 |
27 | }
28 |
29 | export default function Power() {
30 | return
37 |
38 |
39 | test
40 |
41 |
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/astal/src/widget/Bar/elements/SysTray.tsx:
--------------------------------------------------------------------------------
1 | import { bind } from "astal"
2 | import { Gtk } from "astal/gtk4"
3 |
4 | import Wp from "gi://AstalWp"
5 | import Network from "gi://AstalNetwork"
6 | import Bluetooth from "gi://AstalBluetooth"
7 | import Battery from "gi://AstalBattery"
8 |
9 | function AudioSlider() {
10 | const speaker = Wp.get_default()?.audio.defaultSpeaker!
11 |
12 | return
13 |
14 |
15 |
16 | (speaker.set_volume(value))}
19 | value={bind(speaker,"volume")}
20 | round_digits={2}
21 | />
22 |
23 |
26 |
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 {content}
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
97 |
98 |
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 time.drop()}
11 | label={time()}
12 | maxWidthChars={2}
13 | wrap
14 | cssClasses={["element", "time"]}
15 | />
16 | }
17 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/astal/src/widget/Bar/elements/Workspaces.tsx:
--------------------------------------------------------------------------------
1 | import { bind } from "astal"
2 |
3 | import Hyprland from "gi://AstalHyprland"
4 |
5 | export default function Workspaces() {
6 | const hypr = Hyprland.get_default()
7 |
8 | return
9 | {bind(hypr, "workspaces").as(wss => wss
10 | .filter(ws => !(ws.id >= -99 && ws.id <= -2)) // filter out special workspaces
11 | .sort((a, b) => a.id - b.id)
12 | .map(ws => (
13 |
15 | ws === fw ? "focused" : "")}
16 | onClicked={() => ws.focus()}>
17 | {ws.id}
18 |
19 | ))
20 | )}
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/binds.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | pkgs,
4 | lib,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 | inherit (builtins) concatLists;
9 | killactive = pkgs.pkgs.writeShellScriptBin "save-steam" ''
10 | if [ "$(hyprctl activewindow -j | jq -r ".class")" = "Steam" ]; then
11 | xdotool getactivewindow windowunmap
12 | else
13 | hyprctl dispatch killactive ""
14 | fi
15 | '';
16 |
17 | cfg = config.desktops.hyprland;
18 | in {
19 | config = mkIf cfg.enable {
20 | programs.hyprland.settings = {
21 | "$mod" = "SUPER";
22 |
23 | bindm = [
24 | "$mod, mouse:272, movewindow"
25 | "$mod, mouse:273, resizewindow"
26 | ];
27 |
28 | bind = concatLists [
29 | cfg.monitors.bind
30 | [
31 | "$mod, G, exec, firefox"
32 | "$mod, Return, exec, alacritty"
33 | "$mod, M, exec, vesktop --disable-gpu-compositing"
34 |
35 | "$mod, D, exec, ${killactive}/bin/save-steam"
36 |
37 | ", Print, exec, ${pkgs.grimblast}/bin/grimblast --notify --freeze copy area"
38 | "ALT, Tab, cyclenext,"
39 | "ALT, Tab, bringactivetotop,"
40 |
41 | "ALT, 1, workspace, 1"
42 | "ALT, 2, workspace, 2"
43 | "ALT, 3, workspace, 3"
44 | "ALT, 4, workspace, 4"
45 | "$mod, 1, movetoworkspace, 1"
46 | "$mod, 2, movetoworkspace, 2"
47 | "$mod, 3, movetoworkspace, 3"
48 | "$mod, 4, movetoworkspace, 4"
49 |
50 | "$mod, BackSpace, togglefloating, active"
51 |
52 | # Creates arrow keys on homerow :)
53 | "Control_L, n, sendshortcut,, Left, activewindow"
54 | "Control_L, e, sendshortcut,, Down, activewindow"
55 | "Control_L, i, sendshortcut,, Right, activewindow"
56 | "Control_L, u, sendshortcut,, Up, activewindow"
57 | ]
58 | ];
59 | bindr = [
60 | "SUPER, SUPER_L, exec, tofi-drun --drun-launch=true"
61 | ];
62 | bindel = [
63 | # support for media keys
64 | ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
65 | ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
66 | ", XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%-"
67 | ", XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl set +5%"
68 | ];
69 | bindl = [
70 | # more support for media keys
71 | ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
72 | ", XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl play-pause"
73 | ", XF86AudioPrev, exec, ${pkgs.playerctl}/bin/playerctl previous"
74 | ", XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl next"
75 |
76 | # opening and closing of the lid
77 | ", switch:on:Lid Switch, exec, systemctl suspend"
78 | ];
79 | };
80 | };
81 | }
82 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/config.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | pkgs,
4 | lib,
5 | theme,
6 | self',
7 | inputs',
8 | ...
9 | }: let
10 | inherit (lib.modules) mkIf;
11 | inherit (theme) colors;
12 | inherit (lib.strings) removePrefix;
13 | inherit (builtins) mapAttrs;
14 |
15 | # cleansing the imported colors from basix of the prepended '#'
16 | # bc colors don't work here without it
17 | # optimized by notashelf
18 | hyprCol = mapAttrs (n: v: removePrefix "#" v) colors;
19 |
20 | startupScript = pkgs.pkgs.writeShellScriptBin "start" ''
21 | dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
22 | ${pkgs.mako}/bin/mako &
23 | systemctl --user start ${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1 &
24 | ${self'.packages.lags}/bin/lags &
25 | ${pkgs.sway-audio-idle-inhibit}/bin/sway-audio-idle-inhibit &
26 | '';
27 |
28 | cfg = config.desktops.hyprland;
29 | in {
30 | config = mkIf cfg.enable {
31 | hjem.users.lunarnova.packages = [inputs'.niqspkgs.packages.bibata-hyprcursor];
32 |
33 | programs.hyprland.settings = {
34 | exec-once = ''${startupScript}/bin/start'';
35 |
36 | monitor = cfg.monitors.configuration;
37 |
38 | input = {
39 | # Set Colemak as the primary layout and QWERTY as secondary
40 | kb_layout = "us,us";
41 | kb_variant = "colemak,";
42 |
43 | # Remap CAPSLOCK to CTRL, WIN+SPACE kb layout change
44 | kb_options = "ctrl:nocaps,grp:win_space_toggle";
45 | accel_profile = "flat";
46 |
47 | sensitivity = "-0.2";
48 | };
49 |
50 | misc = {
51 | middle_click_paste = false;
52 | };
53 |
54 | env = [
55 | "ELECTRON_OZONE_PLATFORM_HINT,auto"
56 |
57 | "HYPRCURSOR_THEME,Bibata-modern"
58 | "HYPRCURSOR_SIZE,24"
59 | ];
60 |
61 | general = {
62 | border_size = "3";
63 | gaps_out = "10,10,10,10";
64 | gaps_in = "4";
65 |
66 | "col.inactive_border" = "0x00${hyprCol.base03}";
67 | "col.active_border" = "0xee${hyprCol.base04} 0xee${hyprCol.base06} 45deg"; #Gradient from surface2 to red
68 | };
69 |
70 | decoration = {
71 | rounding = "5";
72 |
73 | shadow = {
74 | #range = 6;
75 | render_power = 1;
76 | };
77 |
78 | active_opacity = 0.95;
79 | inactive_opacity = 0.95;
80 |
81 | blur = {
82 | };
83 | };
84 | };
85 | # hjem is working on implementation
86 | #hjem.users.lunarnova.sessionVariables.NIXOS_OZONE_WL = "1";
87 | };
88 | }
89 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/hyprland.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | inputs,
4 | lib,
5 | inputs',
6 | ...
7 | }: let
8 | inherit (lib.modules) mkIf;
9 |
10 | pkgs-unstable = inputs'.hyprland.packages;
11 |
12 | cfg = config.desktops.hyprland;
13 | in {
14 | imports = [inputs.hyprland.nixosModules.default];
15 |
16 | config = mkIf cfg.enable {
17 | # Make Chromium + Electron apps use Wayland
18 | environment.sessionVariables.NIXOS_OZONE_WL = "1";
19 |
20 | programs.hyprland = {
21 | enable = true;
22 | # Set package to version defined in the flake
23 | package = pkgs-unstable.hyprland;
24 | # Set portal package as well so that they are in sync
25 | portalPackage = pkgs-unstable.xdg-desktop-portal-hyprland;
26 |
27 | # Install and use UWSM, a wayland compositor wrapper for tighter service integration
28 | withUWSM = true;
29 | };
30 | };
31 | }
32 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/module.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.;
3 | }
4 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/optionals/gaming.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | pkgs,
4 | lib,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 | gamemode = pkgs.pkgs.writeShellScriptBin "enable-gamemode" ''
9 | HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
10 | if [ "$HYPRGAMEMODE" = 1 ] ; then
11 | hyprctl --batch "\
12 | keyword animations:enabled 0;\
13 | keyword decoration:drop_shadow 0;\
14 | keyword decoration:blur:enabled 0;\
15 | keyword general:gaps_in 0;\
16 | keyword general:gaps_out 0;\
17 | keyword general:border_size 1;\
18 | keyword decoration:rounding 0"
19 | exit
20 | fi
21 | hyprctl reload
22 | '';
23 |
24 | cfg = config.desktops.hyprland;
25 | gamingCfg = config.profiles.gaming;
26 | in {
27 | config = mkIf (cfg.enable && gamingCfg.enable) {
28 | programs.hyprland.settings = {
29 | "$mod" = "SUPER";
30 | bind = [
31 | "$mod, F1, exec, ${gamemode}/bin/enable-gamemode"
32 |
33 | # Game mode settings
34 |
35 | ## Unbinding the homerow arrow keys for The Core RTS keybinds
36 | "$mod, B, exec, hyprctl keyword unbind CONTROL, n"
37 | "$mod, B, exec, hyprctl keyword unbind CONTROL, e"
38 | "$mod, B, exec, hyprctl keyword unbind CONTROL, i"
39 | "$mod, B, exec, hyprctl keyword unbind CONTROL, u"
40 |
41 | ## Rebinding homerow arrow keys
42 | "$mod, K, exec, hyprctl keyword bind CONTROL, n, sendshortcut,, Left, activewindow"
43 | "$mod, K, exec, hyprctl keyword bind CONTROL, e, sendshortcut,, Down, activewindow"
44 | "$mod, K, exec, hyprctl keyword bind CONTROL, i, sendshortcut,, Right, activewindow"
45 | "$mod, K, exec, hyprctl keyword bind CONTROL, u, sendshortcut,, Up, activewindow"
46 | ];
47 | };
48 | };
49 | }
50 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/optionals/nvidia.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | ...
5 | }: let
6 | inherit (lib.modules) mkIf;
7 |
8 | cfg = config.desktops.hyprland;
9 | syscfg = config.sysconf;
10 | in {
11 | config = mkIf (cfg.enable && syscfg.nvidia) {
12 | programs.hyprland.settings = {
13 | env = [
14 | "LIBVA_DRIVER_NAME,nvidia"
15 | "XDG_SESSION_TYPE,wayland"
16 | "GBM_BACKEND,nvidia-drm"
17 | "__GLX_VENDOR_LIBRARY_NAME,nvidia"
18 | ];
19 | };
20 | };
21 | }
22 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/optionals/powersave.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | ...
5 | }: let
6 | inherit (lib.modules) mkIf;
7 |
8 | cfg = config.desktops.hyprland;
9 | syscfg = config.sysconf;
10 | in {
11 | config = mkIf (cfg.enable && syscfg.powersave) {
12 | programs.hyprland.settings = {
13 | decoration = {
14 | blur.enabled = false;
15 | shadow.enabled = false;
16 | };
17 | misc.vfr = true;
18 | };
19 | };
20 | }
21 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/optionals/smartgaps.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | ...
5 | }: let
6 | inherit (lib.modules) mkIf;
7 |
8 | cfg = config.desktops.hyprland;
9 | in {
10 | config = mkIf (cfg.enable && cfg.smartgaps) {
11 | programs.hyprland.settings = {
12 | windowrulev2 = [
13 | "bordersize 0, floating:0, onworkspace:w[tv1]"
14 | "rounding 0, floating:0, onworkspace:w[tv1]"
15 | "bordersize 0, floating:0, onworkspace:f[1]"
16 | "rounding 0, floating:0, onworkspace:f[1]"
17 | ];
18 |
19 | workspace = [
20 | "w[tv1], gapsout:0, gapsin:0"
21 | "f[1], gapsout:0, gapsin:0"
22 | ];
23 | };
24 | };
25 | }
26 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/rules.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | ...
5 | }: let
6 | inherit (lib.modules) mkIf;
7 | inherit (builtins) concatLists;
8 |
9 | cfg = config.desktops.hyprland;
10 | in {
11 | config = mkIf cfg.enable {
12 | programs.hyprland.settings = {
13 | windowrulev2 = [
14 | # Gaming
15 | "workspace 3, class:(steam)"
16 | "workspace 3, initialTitle:(Lutris)"
17 | "workspace 3, class:(org.prismlauncher.PrismLauncher)"
18 |
19 | # Comforts
20 | "workspace 2, class:(vesktop)"
21 | "workspace 2, initialTitle:(Spotify Premium)"
22 |
23 | # Productivity
24 | "workspace 1, class:(firefox)"
25 | "workspace 1, initialTitle:(Visual Studio Code)"
26 | ];
27 |
28 | workspace = concatLists [
29 | cfg.monitors.rules
30 | [
31 | # for smart gaps, reference https://wiki.hyprland.org/Configuring/Workspace-Rules/#smart-gaps
32 | ]
33 | ];
34 | };
35 | };
36 | }
37 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/utils/hypridle.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | inputs,
6 | ...
7 | }: let
8 | inherit (lib.modules) mkIf;
9 | inherit (inputs.lunarsLib.generators) toHyprconf;
10 |
11 | swaylock = "${pkgs.swaylock-effects}/bin/swaylock -C /home/lunarnova/.config/swaylock/config";
12 |
13 | cfg = config.desktops.hyprland;
14 | in {
15 | config = mkIf cfg.enable {
16 | hjem.users.lunarnova.files.".config/hypr/hypridle.conf".text = toHyprconf {
17 | attrs = {
18 | general = {
19 | lock_cmd = "pidof ${swaylock} || ${swaylock}";
20 | before_sleep_cmd = "${swaylock}";
21 | after_sleep_cmd = "hyprctl dispatch dpms on";
22 | };
23 | listener = [
24 | {
25 | timeout = 300; # 5 minute idle = screenlock
26 | on-timeout = "${swaylock}";
27 | }
28 | {
29 | timeout = 900; # 15 minute idle = monitor off
30 | on-timeout = "hyprctl dispatch dpms off";
31 | on-resume = "hyprctl dispatch dpms on";
32 | }
33 | ];
34 | };
35 | };
36 |
37 | systemd.user.services.hypridle = {
38 | description = "an idle daemon for hyprland";
39 | after = ["graphical-session.target"];
40 | wantedBy = ["graphical-session.target"];
41 | partOf = ["graphical-session.target"];
42 | reloadTriggers = ["${config.hjem.users.lunarnova.files.".config/hypr/hypridle.conf".text}"];
43 |
44 | unitConfig.ConditionEnvironment = "WAYLAND_DISPLAY";
45 | serviceConfig = {
46 | Type = "simple";
47 | ExecStart = "${pkgs.hypridle}/bin/hypridle";
48 | Restart = "always";
49 | RestartSec = "10";
50 | };
51 | };
52 | };
53 | }
54 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/utils/hyprpaper.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | theme,
6 | inputs,
7 | ...
8 | }: let
9 | inherit (lib.attrsets) mergeAttrsList optionalAttrs;
10 | inherit (lib.modules) mkIf;
11 | inherit (inputs.lunarsLib.generators) toHyprconf;
12 | inherit (theme) wallpapers;
13 |
14 | hyprpaper-conf = pkgs.writeTextFile {
15 | name = "hyprpaper-conf";
16 | text = toHyprconf {
17 | attrs = mergeAttrsList [
18 | {
19 | preload = [
20 | "${wallpapers.primary}"
21 | ];
22 | wallpaper = [
23 | ",${wallpapers.primary}"
24 | ];
25 | }
26 | (optionalAttrs config.sysconf.powersave {
27 | ipc = false;
28 | })
29 | ];
30 | };
31 | };
32 |
33 | cfg = config.desktops.hyprland;
34 | in {
35 | config = mkIf cfg.enable {
36 | systemd.user.services.hyprpaper = {
37 | description = "wallpaper service for hyprland";
38 | partOf = ["graphical-session.target"];
39 | wantedBy = ["graphical-session.target"];
40 | after = ["graphical-session.target"];
41 | reloadTriggers = ["${hyprpaper-conf}"];
42 |
43 | unitConfig.ConditionEnvironment = "WAYLAND_DISPLAY";
44 | serviceConfig = {
45 | ExecStart = "${pkgs.hyprpaper}/bin/hyprpaper -c ${hyprpaper-conf}";
46 | Restart = "always";
47 | RestartSec = "10";
48 | };
49 | };
50 | };
51 | }
52 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/utils/mako.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | theme,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 | inherit (theme) colors fonts;
9 | #hyprland-settings = config.wayland.windowManager.hyprland.settings;
10 |
11 | cfg = config.desktops.hyprland;
12 | in {
13 | config = mkIf cfg.enable {
14 | hjem.users.lunarnova.files.".config/mako/config".text = ''
15 | max-visible=5
16 | sort=-time
17 |
18 | layer=overlay
19 | anchor=top-center
20 |
21 | font=${fonts.sans.name}
22 | background-color=${colors.base01}
23 | text-color=${colors.base05}
24 | width=300
25 | height=80
26 | margin=10
27 | padding=5
28 | border-size=2
29 | border-color=${colors.base08}
30 | border-radius=3
31 | progress-color=#5588aa
32 | icons=true
33 | max-icon-size=64
34 |
35 | markup=true
36 | actions=true
37 | format=%s \n%b
38 | default-timeout=10000
39 | ignore-timeout=false
40 | '';
41 | };
42 | }
43 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/utils/swaylock.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | theme,
5 | inputs,
6 | ...
7 | }: let
8 | inherit (lib.modules) mkIf;
9 | inherit (theme) wallpapers fonts colors;
10 | inherit (inputs.lunarsLib.generators) toSwaylockConf;
11 |
12 | cfg = config.desktops.hyprland;
13 | in {
14 | config = mkIf cfg.enable {
15 | # config and pam module both referenced in part from notashelf/nyx
16 | hjem.users.lunarnova.files.".config/swaylock/config".text = toSwaylockConf {
17 | attrs = {
18 | font = fonts.sans.name;
19 | font-size = 18;
20 |
21 | image = "${wallpapers.primary}";
22 | effect-blur = "7x6";
23 |
24 | clock = true;
25 | indicator = true;
26 | timestr = "%H:%M";
27 | datestr = "%m.%d.%y";
28 |
29 | line-color = "${colors.base01}";
30 | text-color = "${colors.base05}";
31 | ring-color = "${colors.base00}";
32 | key-hl-color = "${colors.base08}";
33 |
34 | ring-ver-color = "${colors.base17}";
35 | inside-ver-color = "${colors.base0E}";
36 |
37 | ring-clear-color = "${colors.base14}";
38 | inside-clear-color = "${colors.base0B}";
39 |
40 | ring-wrong-color = "${colors.base10}";
41 | inside-wrong-color = "${colors.base12}";
42 | };
43 | };
44 | security.pam.services = {
45 | swaylock = {
46 | name = "swaylock";
47 | text = ''
48 | auth include login
49 | '';
50 | };
51 | };
52 | };
53 | }
54 |
--------------------------------------------------------------------------------
/modules/desktops/hyprland/utils/tofi.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | pkgs,
4 | lib,
5 | theme,
6 | ...
7 | }: let
8 | inherit (lib.modules) mkIf;
9 | inherit (theme) colors fonts;
10 | toINI = lib.generators.toINIWithGlobalSection {};
11 | #hyprland-settings = config.wayland.windowManager.hyprland.settings;
12 |
13 | cfg = config.desktops.hyprland;
14 | in {
15 | config = mkIf cfg.enable {
16 | hjem.users.lunarnova = {
17 | packages = [pkgs.tofi];
18 | files.".config/tofi/config".text = toINI {
19 | globalSection = {
20 | outline-width = 0;
21 | border-width = 3;
22 | corner-radius = 3;
23 | width = "25%";
24 | height = "15%";
25 | font = fonts.sans.path;
26 | font-size = 13;
27 | background-color = "${colors.base00}";
28 | border-color = "${colors.base08}";
29 | text-color = "${colors.base05}";
30 | selection-color = "${colors.base12}";
31 | };
32 | };
33 | };
34 | };
35 | }
36 |
--------------------------------------------------------------------------------
/modules/desktops/kde/kde.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.desktops.kde;
10 | in {
11 | config = mkIf cfg.enable {
12 | services = {
13 | desktopManager.plasma6.enable = true;
14 | xserver.enable = true;
15 | };
16 | environment.plasma6.excludePackages = with pkgs.kdePackages; [
17 | plasma-browser-integration
18 | konsole
19 | kate
20 | ];
21 | hjem.users.lunarnova.environment.sessionVariables.NIXOS_OZONE_WL = "1";
22 | };
23 | }
24 |
--------------------------------------------------------------------------------
/modules/desktops/kde/module.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.;
3 | }
4 |
--------------------------------------------------------------------------------
/modules/options/common/config/sysconf.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption;
3 | in {
4 | options.sysconf = {
5 | nvidia = mkEnableOption ''
6 | Nvidia modules. This enables special driver configuration
7 | and configures the DE for nvidia optimizations and bugfixes.
8 | '';
9 |
10 | powersave = mkEnableOption ''
11 | signals that the system wants to maximize power usage. This
12 | currently configures Hyprland to minimize performance expensive
13 | eye candy.
14 | '';
15 | };
16 | }
17 |
--------------------------------------------------------------------------------
/modules/options/common/config/terminal.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | ...
5 | }: let
6 | inherit (lib.options) mkEnableOption;
7 | inherit (lib.modules) mkDefault mkIf;
8 | in {
9 | options.terminal = {
10 | enable = mkEnableOption ''
11 | Enables the terminal modules, installing and configuring
12 | the terminal emulator, shell, and prompt.
13 | '';
14 | apps = {
15 | alacritty = mkEnableOption ''
16 | the Alacritty terminal.
17 | '';
18 | foot.enable = mkEnableOption "foot terminal";
19 | nushell = mkEnableOption ''
20 | nushell & its aliases.
21 | '';
22 | spaceship = mkEnableOption ''
23 | the spaceship prompt.
24 | '';
25 | };
26 | };
27 | config = {
28 | terminal.enable = mkDefault true;
29 |
30 | terminal.apps = mkIf config.terminal.enable {
31 | #alacritty = mkDefault false;
32 | foot.enable = mkDefault true;
33 | nushell = mkDefault true;
34 | spaceship = mkDefault true;
35 | };
36 | };
37 | }
38 |
--------------------------------------------------------------------------------
/modules/options/common/programs/firefox.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption mkOption;
3 | inherit (lib.types) enum;
4 | in {
5 | options.firefox = {
6 | enable = mkEnableOption "Firefox Browser";
7 | app = mkOption {
8 | type = enum ["mozilla" "schizofox"];
9 | default = "mozilla";
10 | example = "schizofox";
11 | description = ''
12 | The app to install and configure Firefox with.
13 | '';
14 | };
15 | verticalTabs = mkEnableOption "vertical tabs in Firefox";
16 | };
17 | }
18 |
--------------------------------------------------------------------------------
/modules/options/common/programs/loose.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption;
3 | in {
4 | options.loose = {
5 | bottom = mkEnableOption ''
6 | bottom, a graphical process/system monitor tool.
7 | '';
8 |
9 | fastfetch = mkEnableOption ''
10 | fastfetch, a highly-configurable fetching tool.
11 | '';
12 |
13 | spicetify = mkEnableOption ''
14 | the official Spotify client with theming from Spicetify.
15 | '';
16 |
17 | via = mkEnableOption ''
18 | via, a keyboard configuration tool, and set udev rules
19 | for functionality.
20 | '';
21 | };
22 | }
23 |
--------------------------------------------------------------------------------
/modules/options/desktops/cosmic.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption mkOption;
3 | inherit (lib.types) attrsOf anything;
4 | in {
5 | options.desktops.cosmic = {
6 | enable = mkEnableOption "Cosmic Desktop Environment";
7 |
8 | settings = mkOption {
9 | type = attrsOf anything;
10 | example = {
11 | "CosmicTheme.Dark.Builder" = {
12 | palette = {
13 | name = "lunartheme";
14 | bright_red = {
15 | red = 1.0;
16 | green = 0.6524;
17 | blue = 0.5454;
18 | alpha = 1.0;
19 | };
20 | };
21 | is_frosted = true;
22 | };
23 | "CosmicFiles" = {
24 | tab.show_hidden = true;
25 | };
26 | };
27 | description = ''
28 | '';
29 | };
30 | };
31 | }
32 |
--------------------------------------------------------------------------------
/modules/options/desktops/couch.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption;
3 | in {
4 | options.desktops.couch = {
5 | enable = mkEnableOption "couch desktop mode";
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/modules/options/desktops/gnome.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | pkgs,
4 | config,
5 | ...
6 | }: let
7 | inherit (lib.options) mkEnableOption mkOption;
8 | inherit (lib.types) listOf package;
9 | inherit (lib.modules) mkIf;
10 |
11 | cfg = config.desktops.gnome;
12 | in {
13 | options.desktops.gnome = {
14 | enable = mkEnableOption "GNOME Desktop Environment";
15 | extensions = {
16 | enable = mkEnableOption "GNOME Extensions";
17 | packages = mkOption {
18 | type = listOf package;
19 | default = [];
20 | example = with pkgs.gnomeExtensions; [
21 | blur-my-shell
22 | pop-shell
23 | ];
24 | };
25 | };
26 | };
27 |
28 | config.desktops.gnome = mkIf cfg.enable {
29 | extensions.enable = true; # Extensions are enabled by default
30 | };
31 | }
32 |
--------------------------------------------------------------------------------
/modules/options/desktops/hyprland.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkOption mkEnableOption;
3 | inherit (lib.types) listOf str attrs;
4 | in {
5 | options.desktops.hyprland = {
6 | enable = mkEnableOption ''
7 | the Hyprland Wayland Compositor.
8 | '';
9 | settings = mkOption {
10 | type = attrs;
11 | example = {
12 | "$mod" = "$super";
13 | decoration = {
14 | rounding = "3";
15 | };
16 | };
17 | description = ''
18 | Settings for Hyprland Wayland Compositor to be
19 | written to the config file.
20 | '';
21 | };
22 | monitors = {
23 | configuration = mkOption {
24 | type = listOf str;
25 | default = [
26 | ", preferred, auto, 1"
27 | ];
28 | example = [
29 | "HDMI-A-1, 1920x1080@60, auto, 1"
30 | "DP-4, 1920x1080@60, auto-left, 1"
31 | ];
32 | description = "Monitor configurations for Hyprland";
33 | };
34 | bind = mkOption {
35 | type = listOf str;
36 | default = [];
37 | description = "Sets special 'bind' binds for monitor configuration";
38 | };
39 | rules = mkOption {
40 | type = listOf str;
41 | default = [];
42 | example = [
43 | "3, monitor:HDMI-A-1"
44 | "2, monitor:DP-4, default:true"
45 | ];
46 | description = "Sets workspace rules for monitors";
47 | };
48 | };
49 | smartgaps = mkEnableOption ''
50 | smartgaps for Hyprland.
51 | '';
52 | };
53 | }
54 |
--------------------------------------------------------------------------------
/modules/options/desktops/kde.nix:
--------------------------------------------------------------------------------
1 | {lib, ...}: let
2 | inherit (lib.options) mkEnableOption;
3 | in {
4 | options.desktops.kde = {
5 | enable = mkEnableOption "KDE Plasma 6";
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/modules/options/profiles/gaming.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | ...
5 | }: let
6 | inherit (lib.options) mkEnableOption;
7 | inherit (lib.modules) mkDefault mkIf;
8 |
9 | cfg = config.profiles.gaming;
10 | in {
11 | options.profiles.gaming = {
12 | enable = mkEnableOption ''
13 | the gaming modules. By default, this enables special
14 | driver and DE configuration related to gaming, and enables
15 | apps related to gaming.
16 | '';
17 | vr.enable = mkEnableOption ''
18 | VR.
19 | ''; # VR is not enabled by default.
20 | programs = {
21 | heroic.enable = mkEnableOption ''
22 | Heroic Games Launcher, for Epic Games.
23 | '';
24 | lutris.enable = mkEnableOption ''
25 | Lutris.
26 | '';
27 | minecraft.enable = mkEnableOption ''
28 | Minecraft, installing Prism-Launcher.
29 | '';
30 | obs.enable = mkEnableOption ''
31 | "Open Broadcast Software."
32 | ''; # OBS is not enabled by default.
33 | steam.enable = mkEnableOption ''
34 | Steam.
35 | '';
36 | };
37 | };
38 | config = mkIf cfg.enable {
39 | profiles.gaming.programs = {
40 | heroic.enable = mkDefault true;
41 | lutris.enable = mkDefault true;
42 | minecraft.enable = mkDefault true;
43 | steam.enable = mkDefault true;
44 | };
45 | };
46 | }
47 |
--------------------------------------------------------------------------------
/modules/options/profiles/server.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | ...
5 | }: let
6 | inherit (lib.options) mkEnableOption;
7 | inherit (lib.modules) mkIf mkDefault;
8 |
9 | cfg = config.profiles.server;
10 | in {
11 | options.profiles.server = {
12 | enable = mkEnableOption ''
13 | the server modules. Currently this doesn't do much
14 | since I haven't delved into server stuff quite yet.
15 | '';
16 | services = {
17 | minecraft.enable = mkEnableOption ''
18 | the Minecraft Server to run on boot.
19 | '';
20 | };
21 | };
22 | config = mkIf cfg.enable {
23 | profiles.server.services.minecraft.enable = mkDefault true;
24 | };
25 | }
26 |
--------------------------------------------------------------------------------
/modules/options/profiles/workstation.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | ...
5 | }: let
6 | inherit (lib.options) mkEnableOption;
7 | inherit (lib.modules) mkDefault mkIf;
8 |
9 | cfg = config.profiles.workstation;
10 | in {
11 | options.profiles.workstation = {
12 | enable = mkEnableOption ''
13 | the workstation modules. This mainly installs and
14 | configures noteable programs like neovim and obsidian for
15 | writing and programming.
16 | '';
17 | programs = {
18 | obsidian.enable = mkEnableOption ''
19 | Obsidian Markdown Editor.
20 | '';
21 | libreoffice.enable = mkEnableOption ''
22 | Libre Office Suite.
23 | '';
24 | vscode.enable = mkEnableOption ''
25 | VSCode, a code editor.
26 | '';
27 | zed.enable = mkEnableOption ''
28 | Zed, a code editor.
29 | ''; # Zed is currently disabled by default.
30 | };
31 | };
32 | config = mkIf cfg.enable {
33 | profiles.workstation.programs = {
34 | obsidian.enable = mkDefault true;
35 | libreoffice.enable = mkDefault true;
36 | vscode.enable = mkDefault true;
37 | };
38 | };
39 | }
40 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/module.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.;
3 | }
4 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/element.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 | inherit (builtins) toJSON;
9 |
10 | cfg = config.profiles.gaming;
11 | in {
12 | config = mkIf cfg.enable {
13 | hjem.users.lunarnova = {
14 | packages = [pkgs.element-desktop];
15 | files.".config/Element/config.json".text = toJSON {
16 | "setting_defaults" = {
17 | "custom_themes" = [
18 | {
19 | "name" = "Catppuccin Mocha";
20 | "is_dark" = true;
21 | "colors" = {
22 | "accent-color" = "#b4befe";
23 | "primary-color" = "#b4befe";
24 | "warning-color" = "#f38ba8";
25 | "alert" = "#f9e2af";
26 | "sidebar-color" = "#11111b";
27 | "roomlist-background-color" = "#181825";
28 | "roomlist-text-color" = "#cdd6f4";
29 | "roomlist-text-secondary-color" = "#9399b2";
30 | "roomlist-highlights-color" = "#45475a";
31 | "roomlist-separator-color" = "#7f849c";
32 | "timeline-background-color" = "#1e1e2e";
33 | "timeline-text-color" = "#cdd6f4";
34 | "secondary-content" = "#cdd6f4";
35 | "tertiary-content" = "#cdd6f4";
36 | "timeline-text-secondary-color" = "#a6adc8";
37 | "timeline-highlights-color" = "#181825";
38 | "reaction-row-button-selected-bg-color" = "#45475a";
39 | "menu-selected-color" = "#45475a";
40 | "focus-bg-color" = "#585b70";
41 | "room-highlight-color" = "#89dceb";
42 | "togglesw-off-color" = "#9399b2";
43 | "other-user-pill-bg-color" = "#89dceb";
44 | "username-colors" = [
45 | "#cba6f7"
46 | "#eba0ac"
47 | "#fab387"
48 | "#a6e3a1"
49 | "#94e2d5"
50 | "#89dceb"
51 | "#74c7ec"
52 | "#b4befe"
53 | ];
54 | "avatar-background-colors" = [
55 | "#89b4fa"
56 | "#cba6f7"
57 | "#a6e3a1"
58 | ];
59 | };
60 | }
61 | ];
62 | };
63 | };
64 | };
65 | };
66 | }
67 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/gamemode.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | ...
5 | }: let
6 | inherit (lib.modules) mkIf;
7 |
8 | cfg = config.profiles.gaming;
9 | in {
10 | config = mkIf cfg.enable {
11 | programs.gamemode = {
12 | enable = true;
13 | };
14 | };
15 | }
16 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/heroic-games-launcher.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.gaming.programs.heroic;
10 | in {
11 | config = mkIf cfg.enable {
12 | environment.systemPackages = [pkgs.heroic];
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/lutris.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.gaming.programs.lutris;
10 | in {
11 | config = mkIf cfg.enable {
12 | environment.systemPackages = [pkgs.lutris];
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/obs.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | catppuccin-mocha = pkgs.fetchFromGitHub {
10 | owner = "catppuccin";
11 | repo = "obs";
12 | rev = "3f8af3bf1a1742529259a19d923277786b99e3ef";
13 | hash = "sha256-+X2ZkteIHVq9eP8yrzAERVp7IC2V9MWfcsJsBb+WBd0=";
14 | };
15 |
16 | cfg = config.profiles.gaming.programs.obs;
17 | in {
18 | config = mkIf cfg.enable {
19 | hjem.users.lunarnova = {
20 | rum.programs.obs-studio = {
21 | enable = true;
22 | plugins = with pkgs.obs-studio-plugins; [
23 | wlrobs #for screen capture w/wayland, will be mandatory in future
24 | obs-vkcapture #vulkan/opengl game capture #ref https://github.com/nowrep/obs-vkcapture for game setup
25 | input-overlay #kb, contr, & mouse input
26 | obs-multi-rtmp #multi-site broadcast
27 | obs-mute-filter #improves muting capability for sources
28 | obs-livesplit-one #livesplit one source
29 | obs-pipewire-audio-capture
30 | ];
31 | };
32 | files.".config/obs-studio/themes".source = "${catppuccin-mocha}/themes";
33 | };
34 | };
35 | }
36 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/prism-launcher.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | catppuccin-prism-launcher = pkgs.fetchFromGitHub {
10 | owner = "catppuccin";
11 | repo = "prismlauncher";
12 | rev = "2edbdf5295bc3c12c3dd53b203ab91028fce2c54";
13 | hash = "sha256-+yGrSZztf2sZ9frPT3ydIJDavo4eXs03cQWfdTAmn3w=";
14 | };
15 |
16 | cfg = config.profiles.gaming.programs.minecraft;
17 | in {
18 | config = mkIf cfg.enable {
19 | hjem.users.lunarnova = {
20 | packages = [pkgs.prismlauncher];
21 | files = {
22 | ".local/share/PrismLauncher/themes/catppuccin-mocha/theme.json".source = "${catppuccin-prism-launcher}/themes/Mocha/theme.json";
23 | ".local/share/PrismLauncher/themes/catppuccin-mocha/themeStyle.css".source = "${catppuccin-prism-launcher}/themes/Mocha/themeStyle.css";
24 | };
25 | };
26 | };
27 | }
28 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/steam.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.gaming.programs.steam;
10 | in {
11 | config = mkIf cfg.enable {
12 | programs = {
13 | steam.enable = true;
14 | gamescope.enable = true;
15 | };
16 | environment = {
17 | sessionVariables = {
18 | STEAM_EXTRA_COMPAT_TOOLS_PATHS = "/home/lunarnova/.steam/root/compatibilitytools.d";
19 | };
20 | systemPackages = [pkgs.protonup];
21 | };
22 | };
23 | }
24 |
--------------------------------------------------------------------------------
/modules/profiles/gaming/programs/vr.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.gaming;
10 | in {
11 | config = mkIf (cfg.enable && cfg.vr.enable) {
12 | services.wivrn = {
13 | enable = true;
14 |
15 | # Opens firewall for wivrn to stream through wifi
16 | openFirewall = true;
17 |
18 | # Autostarts wivrn daemon
19 | autoStart = true;
20 |
21 | defaultRuntime = true;
22 |
23 | # fixes crash with nvidia proprietary drivers
24 | extraPackages = [pkgs.monado-vulkan-layers];
25 |
26 | config = {
27 | enable = true;
28 | json = {
29 | encoders = [
30 | {
31 | encoder = "nvenc";
32 | codec = "h265";
33 | }
34 | ];
35 | };
36 | };
37 | };
38 | };
39 | }
40 |
--------------------------------------------------------------------------------
/modules/profiles/server/module.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.;
3 | }
4 |
--------------------------------------------------------------------------------
/modules/profiles/server/services/minecraft-server.nix:
--------------------------------------------------------------------------------
1 | {
2 | pkgs,
3 | inputs,
4 | config,
5 | lib,
6 | ...
7 | }: let
8 | inherit (lib.modules) mkIf;
9 |
10 | cfg = config.profiles.server.services.minecraft;
11 | in {
12 | imports = [inputs.nix-minecraft.nixosModules.minecraft-servers];
13 |
14 | config = mkIf cfg.enable {
15 | nixpkgs.overlays = [inputs.nix-minecraft.overlay];
16 |
17 | services.minecraft-servers = {
18 | enable = true;
19 | eula = true;
20 |
21 | servers = {
22 | family-server = {
23 | enable = true;
24 | package = pkgs.fabricServers.fabric-1_21_1;
25 | jvmOpts = "-Xmx4096";
26 | #restart = "no";
27 | #enableReload = true;
28 |
29 | serverProperties = {
30 | difficulty = 3;
31 | gamemode = 1;
32 | motd = "hello friends c:";
33 | white-list = false;
34 | view-distance = 10;
35 | server-port = 25565; #use if adding a second server, default 25565
36 | };
37 | /*
38 | whitelist = {
39 | };
40 | */
41 |
42 | symlinks = {
43 | "mods" = pkgs.linkFarmFromDrvs "mods" (builtins.attrValues {
44 | Lithium = pkgs.fetchurl {
45 | url = "https://cdn.modrinth.com/data/gvQqBUqZ/versions/5szYtenV/lithium-fabric-mc1.21.1-0.13.0.jar";
46 | sha256 = "0q8dj7j2z7s6y41idq665p62ni2n9k2n7n72w4307gwpwgz73lqh";
47 | };
48 | FerriteCore = pkgs.fetchurl {
49 | url = "https://cdn.modrinth.com/data/uXXizFIs/versions/wmIZ4wP4/ferritecore-7.0.0-fabric.jar";
50 | sha256 = "08q3cs3z97i4z3f4idf4c3hf2dh640wksk6wbv7s7rjx3w6j0c9c";
51 | };
52 | ModernFix = pkgs.fetchurl {
53 | url = "https://shorturl.at/26t5C"; #uses a shorturl because the original uses an illegal character
54 | sha256 = "1mqx9zvnb19nz93wwa3p1i7gx05wd7whraysj555g7bcxcf69fgz";
55 | };
56 | Krypton = pkgs.fetchurl {
57 | url = "https://cdn.modrinth.com/data/fQEb0iXm/versions/Acz3ttTp/krypton-0.2.8.jar";
58 | sha256 = "1zp394pvrdmsk380zzz8fp63cj6qrlaxmjgxxxjdmr94kf0rbwcl";
59 | };
60 | });
61 | };
62 | };
63 | };
64 | };
65 |
66 | environment.systemPackages = [pkgs.ngrok];
67 | };
68 | }
69 |
--------------------------------------------------------------------------------
/modules/profiles/workstation/module.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = inputs.lunarsLib.importers.listNixRecursive ./.;
3 | }
4 |
--------------------------------------------------------------------------------
/modules/profiles/workstation/programs/libreoffice.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.workstation.programs.libreoffice;
10 | in {
11 | config = mkIf cfg.enable {
12 | hjem.users.lunarnova = {
13 | packages = [pkgs.libreoffice];
14 | };
15 | };
16 | }
17 |
--------------------------------------------------------------------------------
/modules/profiles/workstation/programs/obsidian.nix:
--------------------------------------------------------------------------------
1 | {
2 | lib,
3 | config,
4 | pkgs,
5 | ...
6 | }: let
7 | inherit (lib.modules) mkIf;
8 |
9 | cfg = config.profiles.workstation.programs.obsidian;
10 | in {
11 | config = mkIf cfg.enable {
12 | hjem.users.lunarnova = {
13 | packages = [pkgs.obsidian];
14 | };
15 | };
16 | }
17 |
--------------------------------------------------------------------------------
/modules/profiles/workstation/programs/vscode.nix:
--------------------------------------------------------------------------------
1 | {
2 | inputs,
3 | lib,
4 | config,
5 | pkgs,
6 | theme,
7 | ...
8 | }: let
9 | inherit (lib.modules) mkIf;
10 | inherit (theme) fonts;
11 |
12 | flakeRev = "github:lunarnovaa/nixconf/f0d8932b16f1055fe2e1647d2a02e5a3213206d2";
13 | flakeOptions = "(builtins.getFlake ${flakeRev}).nixosConfigurations.${config.networking.hostName}.options";
14 |
15 | cfg = config.profiles.workstation.programs.vscode;
16 | in {
17 | config = mkIf cfg.enable {
18 | hjem.users.lunarnova = {
19 | rum.programs.vscode = {
20 | enable = true;
21 | settings = {
22 | "editor.semanticHighlighting.enabled" = true;
23 | "terminal.integrated.minimumContrastRatio" = 1;
24 | "window.titleBarStyle" = "custom";
25 |
26 | "editor.fontFamily" = "${fonts.monospace.name}";
27 | "editor.fontLigatures" = true;
28 | "workbench.colorTheme" = "Catppuccin Mocha";
29 |
30 | "catppuccin"."accentColor" = "rosewater";
31 |
32 | "nix.serverPath" = "${pkgs.nixd}/bin/nixd";
33 | "nix.enableLanguageServer" = true;
34 |
35 | "nix.serverSettings"."nixd" = {
36 | "nixpkgs"."expr" = "import ${inputs.nixpkgs} { }";
37 |
38 | "formatting"."command" = ["${pkgs.alejandra}/bin/alejandra"];
39 |
40 | "options"."nixos"."expr" = flakeOptions;
41 | };
42 |
43 | "files.exclude" = {
44 | "**/.git" = false;
45 | };
46 | };
47 | };
48 | };
49 | };
50 | }
51 |
--------------------------------------------------------------------------------
/parts/apps/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | imports = [
3 | ./lags.nix
4 | ];
5 | }
6 |
--------------------------------------------------------------------------------
/parts/apps/lags.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | perSystem = {
3 | inputs',
4 | system,
5 | pkgs,
6 | ...
7 | }: let
8 | astalPackages = with inputs'.ags.packages; [
9 | hyprland
10 | wireplumber
11 | network
12 | bluetooth
13 | battery
14 | apps
15 | ];
16 | nixPackages = [
17 | pkgs.pwvucontrol
18 | pkgs.blueberry
19 | ];
20 | extraPackages = astalPackages ++ nixPackages;
21 | in {
22 | # ags derivation for typescript
23 | packages.lags = inputs.ags.lib.bundle {
24 | src = ../../modules/desktop/hyprland/astal/src;
25 | inherit pkgs extraPackages;
26 | name = "lags";
27 | entry = "app.ts";
28 | gtk4 = true;
29 | };
30 | devShells.${system}.lags = pkgs.mkShell {
31 | buildInputs = [
32 | (inputs'.ags.packages.default.override {
33 | inherit extraPackages;
34 | })
35 | ];
36 | };
37 | };
38 | }
39 |
--------------------------------------------------------------------------------
/parts/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | imports = [
3 | ./apps # Special derivations to be run with 'nix run'
4 |
5 | ./misc # Miscellaneous flake settings
6 |
7 | ./modules # Special modules designed to be included in specialArgs
8 |
9 | ./pkgs # My own packages
10 | ];
11 | }
12 |
--------------------------------------------------------------------------------
/parts/misc/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | imports = [
3 | ./formatter.nix
4 | ];
5 | }
6 |
--------------------------------------------------------------------------------
/parts/misc/formatter.nix:
--------------------------------------------------------------------------------
1 | {
2 | perSystem = {pkgs, ...}: {
3 | # Declare the formatter to be called on 'nix fmt'
4 | formatter = pkgs.alejandra;
5 | };
6 | }
7 |
--------------------------------------------------------------------------------
/parts/modules/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | imports = [
3 | ./theme.nix
4 | ];
5 | }
6 |
--------------------------------------------------------------------------------
/parts/modules/theme.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | # withSystem makes 'pkgs' available so that different systems have the respective package set
3 | perSystem = {
4 | pkgs,
5 | lunixpkgs,
6 | ...
7 | }: {
8 | _module.args.theme = {
9 | colors = inputs.basix.schemeData.base24.catppuccin-mocha.palette;
10 | fonts = {
11 | monospace = {
12 | package = lunixpkgs.ioshelfka; # packaged by yours truly
13 | name = "Ioshelfka Mono Nerdfont";
14 | };
15 | sans = {
16 | package = pkgs.inter;
17 | name = "Inter";
18 | path = "${pkgs.inter}/share/fonts/truetype/Inter.ttc";
19 | };
20 | serif = {
21 | package = pkgs.roboto-serif;
22 | name = "Roboto Serif";
23 | };
24 | emoji = {
25 | package = pkgs.noto-fonts-color-emoji;
26 | name = "Noto Color Emoji";
27 | };
28 | cjk = {
29 | sans = {
30 | package = pkgs.noto-fonts-cjk-sans;
31 | name = "Noto Sans CJK SC";
32 | };
33 | serif = {
34 | package = pkgs.noto-fonts-cjk-serif;
35 | name = "Noto Serif CJK SC";
36 | };
37 | };
38 | size = 11;
39 | };
40 | wallpapers = {
41 | primary = "/home/lunarnova/wallpapers/nauragarden.png";
42 | };
43 | };
44 | };
45 | }
46 |
--------------------------------------------------------------------------------
/parts/pkgs/default.nix:
--------------------------------------------------------------------------------
1 | {inputs, ...}: {
2 | imports = [inputs.flake-parts.flakeModules.easyOverlay];
3 | perSystem = {
4 | config,
5 | pkgs,
6 | lib,
7 | system,
8 | ...
9 | }: let
10 | inherit (lib.filesystem) packagesFromDirectoryRecursive;
11 | in {
12 | # My overlay is declared in a separate attrset to allow for
13 | # 1. People to reference my packages easily as an input
14 | # 2. My own reference of it within modules as self'.package.
15 | packages = packagesFromDirectoryRecursive {
16 | inherit (pkgs) callPackage;
17 | directory = ./packages;
18 | };
19 |
20 | # Here the packages are actually given to the flake-parts module
21 | # to create the overlay for each system
22 | overlayAttrs = config.packages;
23 |
24 | # flake-parts does not actually pass the overlay to my flake, so I
25 | # must do it myself, unfortunately
26 | legacyPackages = import inputs.nixpkgs {
27 | inherit system;
28 |
29 | # This configures my pkgs version as needed within the flake
30 | # as opposed to at the nixosModules level. This allows me to
31 | # pass my overlayed 'pkgs' as the pkgs used in my nixosModules,
32 | # meaning I do not need to use something confusing like "self'.packages.ioshelfka"
33 | config = {
34 | allowUnfree = true;
35 | allowUnsupportedSystem = true;
36 | };
37 | overlays = [inputs.self.overlays.default];
38 | };
39 |
40 | _module.args.lunixpkgs = config.legacyPackages;
41 | };
42 | }
43 |
--------------------------------------------------------------------------------
/parts/pkgs/packages/catppuccin-cosmic.nix:
--------------------------------------------------------------------------------
1 | {
2 | pkgs ? import {},
3 | flavor ? "mocha",
4 | accent ? "rosewater",
5 | roundness ? "square",
6 | window_hint_color ? accent,
7 | bg_alpha ? 1.0,
8 | frosted ? true,
9 | outer_gap_size ? 4,
10 | inner_gap_size ? outer_gap_size,
11 | active_hint_size ? 1,
12 | }: let
13 | inherit (pkgs) fetchFromGitHub stdenv;
14 | inherit (builtins) toJSON;
15 |
16 | settings = toJSON {
17 | inherit
18 | accent
19 | roundness
20 | window_hint_color
21 | bg_alpha
22 | frosted
23 | outer_gap_size
24 | inner_gap_size
25 | active_hint_size
26 | ;
27 | };
28 | in
29 | stdenv.mkDerivation {
30 | name = "catppuccin-cosmic";
31 |
32 | src = fetchFromGitHub {
33 | owner = "catppuccin";
34 | repo = "cosmic-desktop";
35 | rev = "fea2e508f3ab53cf5762a7610f4b6cc3a8f42a95";
36 | hash = "sha256-P9RFwivSAVJaaX0xpt6Kgn2s7U0O9+yF195BIimn1oI=";
37 | };
38 |
39 | nativeBuildInputs = [pkgs.catppuccin-whiskers];
40 |
41 | buildPhase = ''
42 | runHook preBuild
43 |
44 | mkdir result
45 | cd result
46 | whiskers ../templates/cosmic-settings.tera --flavor ${flavor} --overrides='${settings}'
47 |
48 | runHook postBuild
49 | '';
50 |
51 | installPhase = ''
52 | runHook preInstall
53 |
54 | mkdir -p "$out/share/themes/cosmic-settings"
55 | cp themes/cosmic-settings/catppuccin-${flavor}-${accent}+${roundness}.ron "$out/share/themes/cosmic-settings/catppuccin-cosmic.ron"
56 |
57 | runHook postInstall
58 | '';
59 |
60 | installTargets = ["themes"];
61 |
62 | meta = {
63 | description = "Catppuccin theme for COSMIC.";
64 | };
65 | }
66 |
--------------------------------------------------------------------------------
/parts/pkgs/packages/ioshelfka.nix:
--------------------------------------------------------------------------------
1 | {
2 | pkgs ? import {},
3 | lib ? pkgs.lib,
4 | version ? "v0.1.3",
5 | nerd ? true, # Include nerdfont icons
6 | type ? "Mono", # 'Mono' or 'Term'
7 | }: let
8 | inherit (pkgs) fetchurl stdenv;
9 | inherit (lib.strings) concatStrings optionalString;
10 |
11 | fontName = concatStrings [
12 | type
13 | (optionalString nerd "Nerd")
14 | ];
15 |
16 | hash = {
17 | "v0.1.3" = {
18 | "Mono" = "1dkw4x9vsw2ysjn6m6p9r4rg012hl8hwfkmap8jivr6xs8yrncn5";
19 | "MonoNerd" = "08asdzan247m5cginjk5wr1cnc5idhn50i5fva7hhb3qisx3hmys";
20 | "Term" = "1sg7fyhpf6awaw7pbfpmg9a9qrpza7440rcx78ki4spjg5ly6zkw";
21 | "TermNerd" = "0r4nii9v3nr1vpgg6sbf9w94q8sqjjnyq02naj1rf5k8brwhyc9a";
22 | };
23 | };
24 | in
25 | stdenv.mkDerivation {
26 | pname = "ioshelfka";
27 | inherit version;
28 |
29 | src = fetchurl {
30 | # note: if url is changed, so too must hash be
31 | url = "https://github.com/NotAShelf/Ioshelfka/releases/download/${version}/Ioshelfka${fontName}.zip";
32 | sha256 = hash.${version}.${fontName};
33 | };
34 |
35 | sourceRoot = ".";
36 |
37 | nativeBuildInputs = with pkgs; [
38 | unzip
39 | ];
40 |
41 | installPhase = ''
42 | runHook preInstall
43 |
44 | install -Dm644 result/share/fonts/truetype/*.ttf -t $out/share/fonts/truetype
45 |
46 | ${
47 | optionalString nerd
48 | "install -Dm644 result/share/fonts/truetype/NerdFonts/NerdFonts/Ioshelfka${type}/*.ttf -t $out/share/fonts/truetype/NerdFonts/NerdFonts/Ioshelfka${type}"
49 | }
50 |
51 | runHook postInstall
52 | '';
53 |
54 | meta = {
55 | description = "Ioshelfka font.";
56 | };
57 | }
58 |
--------------------------------------------------------------------------------
/secrets/secrets.nix:
--------------------------------------------------------------------------------
1 | let
2 | #generated with sudo ssh-keygen -A
3 | #sourced from /etc/ssh/ssh_host_ed25519_key.pub
4 | polaris = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG2iAb15Y/Zwrt8k5BPfneZ0Cl8tcr7bEPZ4/UUlCZIG";
5 | procyon = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHQGQ9oOq+wEYNkGwZ/IXAaCIzzKudjNTu4yoGPDzxx8";
6 | in {
7 | "userPassword.age".publicKeys = [polaris procyon];
8 | "wifiPassword.age".publicKeys = [polaris procyon];
9 | "spotifyPassword.age".publicKeys = [polaris procyon];
10 | "spotifyClientID.age".publicKeys = [polaris procyon];
11 | }
12 |
--------------------------------------------------------------------------------
/secrets/spotifyClientID.age:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lunarnovaa/lunix/dec91a71d116310495aa10f5573183217b8aa868/secrets/spotifyClientID.age
--------------------------------------------------------------------------------
/secrets/spotifyPassword.age:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lunarnovaa/lunix/dec91a71d116310495aa10f5573183217b8aa868/secrets/spotifyPassword.age
--------------------------------------------------------------------------------
/secrets/userPassword.age:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lunarnovaa/lunix/dec91a71d116310495aa10f5573183217b8aa868/secrets/userPassword.age
--------------------------------------------------------------------------------
/secrets/wifiPassword.age:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Lunarnovaa/lunix/dec91a71d116310495aa10f5573183217b8aa868/secrets/wifiPassword.age
--------------------------------------------------------------------------------