forked from aylac.top/nixcfg
this repo has no description

well let's retry this without putting a bunch of garbage files. kind of a bad first commit now that i think

aylac.top 42a612f9

+2
.gitignore
···
+
result
+
secrets/fonts/emoji
+598
LICENSE.md
···
+
# GNU General Public License
+
+
_Version 3, 29 June 2007_\
+
_Copyright © 2007 Free Software Foundation, Inc. \<<http://fsf.org/>>_
+
+
Everyone is permitted to copy and distribute verbatim copies of this license
+
document, but changing it is not allowed.
+
+
## Preamble
+
+
The GNU General Public License is a free, copyleft license for software and other
+
kinds of works.
+
+
The licenses for most software and other practical works are designed to take away
+
your freedom to share and change the works. By contrast, the GNU General Public
+
License is intended to guarantee your freedom to share and change all versions of a
+
program--to make sure it remains free software for all its users. We, the Free
+
Software Foundation, use the GNU General Public License for most of our software; it
+
applies also to any other work released this way by its authors. You can apply it to
+
your programs, too.
+
+
When we speak of free software, we are referring to freedom, not price. Our General
+
Public Licenses are designed to make sure that you have the freedom to distribute
+
copies of free software (and charge for them if you wish), that you receive source
+
code or can get it if you want it, that you can change the software or use pieces of
+
it in new free programs, and that you know you can do these things.
+
+
To protect your rights, we need to prevent others from denying you these rights or
+
asking you to surrender the rights. Therefore, you have certain responsibilities if
+
you distribute copies of the software, or if you modify it: responsibilities to
+
respect the freedom of others.
+
+
For example, if you distribute copies of such a program, whether gratis or for a fee,
+
you must pass on to the recipients the same freedoms that you received. You must make
+
sure that they, too, receive or can get the source code. And you must show them these
+
terms so they know their rights.
+
+
Developers that use the GNU GPL protect your rights with two steps: **(1)** assert
+
copyright on the software, and **(2)** offer you this License giving you legal permission
+
to copy, distribute and/or modify it.
+
+
For the developers' and authors' protection, the GPL clearly explains that there is
+
no warranty for this free software. For both users' and authors' sake, the GPL
+
requires that modified versions be marked as changed, so that their problems will not
+
be attributed erroneously to authors of previous versions.
+
+
Some devices are designed to deny users access to install or run modified versions of
+
the software inside them, although the manufacturer can do so. This is fundamentally
+
incompatible with the aim of protecting users' freedom to change the software. The
+
systematic pattern of such abuse occurs in the area of products for individuals to
+
use, which is precisely where it is most unacceptable. Therefore, we have designed
+
this version of the GPL to prohibit the practice for those products. If such problems
+
arise substantially in other domains, we stand ready to extend this provision to
+
those domains in future versions of the GPL, as needed to protect the freedom of
+
users.
+
+
Finally, every program is threatened constantly by software patents. States should
+
not allow patents to restrict development and use of software on general-purpose
+
computers, but in those that do, we wish to avoid the special danger that patents
+
applied to a free program could make it effectively proprietary. To prevent this, the
+
GPL assures that patents cannot be used to render the program non-free.
+
+
The precise terms and conditions for copying, distribution and modification follow.
+
+
## TERMS AND CONDITIONS
+
+
### 0. Definitions
+
+
“This License” refers to version 3 of the GNU General Public License.
+
+
“Copyright” also means copyright-like laws that apply to other kinds of
+
works, such as semiconductor masks.
+
+
“The Program” refers to any copyrightable work licensed under this
+
License. Each licensee is addressed as “you”. “Licensees” and
+
“recipients” may be individuals or organizations.
+
+
To “modify” a work means to copy from or adapt all or part of the work in
+
a fashion requiring copyright permission, other than the making of an exact copy. The
+
resulting work is called a “modified version” of the earlier work or a
+
work “based on” the earlier work.
+
+
A “covered work” means either the unmodified Program or a work based on
+
the Program.
+
+
To “propagate” a work means to do anything with it that, without
+
permission, would make you directly or secondarily liable for infringement under
+
applicable copyright law, except executing it on a computer or modifying a private
+
copy. Propagation includes copying, distribution (with or without modification),
+
making available to the public, and in some countries other activities as well.
+
+
To “convey” a work means any kind of propagation that enables other
+
parties to make or receive copies. Mere interaction with a user through a computer
+
network, with no transfer of a copy, is not conveying.
+
+
An interactive user interface displays “Appropriate Legal Notices” to the
+
extent that it includes a convenient and prominently visible feature that **(1)**
+
displays an appropriate copyright notice, and **(2)** tells the user that there is no
+
warranty for the work (except to the extent that warranties are provided), that
+
licensees may convey the work under this License, and how to view a copy of this
+
License. If the interface presents a list of user commands or options, such as a
+
menu, a prominent item in the list meets this criterion.
+
+
### 1. Source Code
+
+
The “source code” for a work means the preferred form of the work for
+
making modifications to it. “Object code” means any non-source form of a
+
work.
+
+
A “Standard Interface” means an interface that either is an official
+
standard defined by a recognized standards body, or, in the case of interfaces
+
specified for a particular programming language, one that is widely used among
+
developers working in that language.
+
+
The “System Libraries” of an executable work include anything, other than
+
the work as a whole, that **(a)** is included in the normal form of packaging a Major
+
Component, but which is not part of that Major Component, and **(b)** serves only to
+
enable use of the work with that Major Component, or to implement a Standard
+
Interface for which an implementation is available to the public in source code form.
+
A “Major Component”, in this context, means a major essential component
+
(kernel, window system, and so on) of the specific operating system (if any) on which
+
the executable work runs, or a compiler used to produce the work, or an object code
+
interpreter used to run it.
+
+
The “Corresponding Source” for a work in object code form means all the
+
source code needed to generate, install, and (for an executable work) run the object
+
code and to modify the work, including scripts to control those activities. However,
+
it does not include the work's System Libraries, or general-purpose tools or
+
generally available free programs which are used unmodified in performing those
+
activities but which are not part of the work. For example, Corresponding Source
+
includes interface definition files associated with source files for the work, and
+
the source code for shared libraries and dynamically linked subprograms that the work
+
is specifically designed to require, such as by intimate data communication or
+
control flow between those subprograms and other parts of the work.
+
+
The Corresponding Source need not include anything that users can regenerate
+
automatically from other parts of the Corresponding Source.
+
+
The Corresponding Source for a work in source code form is that same work.
+
+
### 2. Basic Permissions
+
+
All rights granted under this License are granted for the term of copyright on the
+
Program, and are irrevocable provided the stated conditions are met. This License
+
explicitly affirms your unlimited permission to run the unmodified Program. The
+
output from running a covered work is covered by this License only if the output,
+
given its content, constitutes a covered work. This License acknowledges your rights
+
of fair use or other equivalent, as provided by copyright law.
+
+
You may make, run and propagate covered works that you do not convey, without
+
conditions so long as your license otherwise remains in force. You may convey covered
+
works to others for the sole purpose of having them make modifications exclusively
+
for you, or provide you with facilities for running those works, provided that you
+
comply with the terms of this License in conveying all material for which you do not
+
control copyright. Those thus making or running the covered works for you must do so
+
exclusively on your behalf, under your direction and control, on terms that prohibit
+
them from making any copies of your copyrighted material outside their relationship
+
with you.
+
+
Conveying under any other circumstances is permitted solely under the conditions
+
stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+
+
### 3. Protecting Users' Legal Rights From Anti-Circumvention Law
+
+
No covered work shall be deemed part of an effective technological measure under any
+
applicable law fulfilling obligations under article 11 of the WIPO copyright treaty
+
adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention
+
of such measures.
+
+
When you convey a covered work, you waive any legal power to forbid circumvention of
+
technological measures to the extent such circumvention is effected by exercising
+
rights under this License with respect to the covered work, and you disclaim any
+
intention to limit operation or modification of the work as a means of enforcing,
+
against the work's users, your or third parties' legal rights to forbid circumvention
+
of technological measures.
+
+
### 4. Conveying Verbatim Copies
+
+
You may convey verbatim copies of the Program's source code as you receive it, in any
+
medium, provided that you conspicuously and appropriately publish on each copy an
+
appropriate copyright notice; keep intact all notices stating that this License and
+
any non-permissive terms added in accord with section 7 apply to the code; keep
+
intact all notices of the absence of any warranty; and give all recipients a copy of
+
this License along with the Program.
+
+
You may charge any price or no price for each copy that you convey, and you may offer
+
support or warranty protection for a fee.
+
+
### 5. Conveying Modified Source Versions
+
+
You may convey a work based on the Program, or the modifications to produce it from
+
the Program, in the form of source code under the terms of section 4, provided that
+
you also meet all of these conditions:
+
+
- **a)** The work must carry prominent notices stating that you modified it, and giving a
+
relevant date.
+
- **b)** The work must carry prominent notices stating that it is released under this
+
License and any conditions added under section 7. This requirement modifies the
+
requirement in section 4 to “keep intact all notices”.
+
- **c)** You must license the entire work, as a whole, under this License to anyone who
+
comes into possession of a copy. This License will therefore apply, along with any
+
applicable section 7 additional terms, to the whole of the work, and all its parts,
+
regardless of how they are packaged. This License gives no permission to license the
+
work in any other way, but it does not invalidate such permission if you have
+
separately received it.
+
- **d)** If the work has interactive user interfaces, each must display Appropriate Legal
+
Notices; however, if the Program has interactive interfaces that do not display
+
Appropriate Legal Notices, your work need not make them do so.
+
+
A compilation of a covered work with other separate and independent works, which are
+
not by their nature extensions of the covered work, and which are not combined with
+
it such as to form a larger program, in or on a volume of a storage or distribution
+
medium, is called an “aggregate” if the compilation and its resulting
+
copyright are not used to limit the access or legal rights of the compilation's users
+
beyond what the individual works permit. Inclusion of a covered work in an aggregate
+
does not cause this License to apply to the other parts of the aggregate.
+
+
### 6. Conveying Non-Source Forms
+
+
You may convey a covered work in object code form under the terms of sections 4 and
+
5, provided that you also convey the machine-readable Corresponding Source under the
+
terms of this License, in one of these ways:
+
+
- **a)** Convey the object code in, or embodied in, a physical product (including a
+
physical distribution medium), accompanied by the Corresponding Source fixed on a
+
durable physical medium customarily used for software interchange.
+
- **b)** Convey the object code in, or embodied in, a physical product (including a
+
physical distribution medium), accompanied by a written offer, valid for at least
+
three years and valid for as long as you offer spare parts or customer support for
+
that product model, to give anyone who possesses the object code either **(1)** a copy of
+
the Corresponding Source for all the software in the product that is covered by this
+
License, on a durable physical medium customarily used for software interchange, for
+
a price no more than your reasonable cost of physically performing this conveying of
+
source, or **(2)** access to copy the Corresponding Source from a network server at no
+
charge.
+
- **c)** Convey individual copies of the object code with a copy of the written offer to
+
provide the Corresponding Source. This alternative is allowed only occasionally and
+
noncommercially, and only if you received the object code with such an offer, in
+
accord with subsection 6b.
+
- **d)** Convey the object code by offering access from a designated place (gratis or for
+
a charge), and offer equivalent access to the Corresponding Source in the same way
+
through the same place at no further charge. You need not require recipients to copy
+
the Corresponding Source along with the object code. If the place to copy the object
+
code is a network server, the Corresponding Source may be on a different server
+
(operated by you or a third party) that supports equivalent copying facilities,
+
provided you maintain clear directions next to the object code saying where to find
+
the Corresponding Source. Regardless of what server hosts the Corresponding Source,
+
you remain obligated to ensure that it is available for as long as needed to satisfy
+
these requirements.
+
- **e)** Convey the object code using peer-to-peer transmission, provided you inform
+
other peers where the object code and Corresponding Source of the work are being
+
offered to the general public at no charge under subsection 6d.
+
+
A separable portion of the object code, whose source code is excluded from the
+
Corresponding Source as a System Library, need not be included in conveying the
+
object code work.
+
+
A “User Product” is either **(1)** a “consumer product”, which
+
means any tangible personal property which is normally used for personal, family, or
+
household purposes, or **(2)** anything designed or sold for incorporation into a
+
dwelling. In determining whether a product is a consumer product, doubtful cases
+
shall be resolved in favor of coverage. For a particular product received by a
+
particular user, “normally used” refers to a typical or common use of
+
that class of product, regardless of the status of the particular user or of the way
+
in which the particular user actually uses, or expects or is expected to use, the
+
product. A product is a consumer product regardless of whether the product has
+
substantial commercial, industrial or non-consumer uses, unless such uses represent
+
the only significant mode of use of the product.
+
+
“Installation Information” for a User Product means any methods,
+
procedures, authorization keys, or other information required to install and execute
+
modified versions of a covered work in that User Product from a modified version of
+
its Corresponding Source. The information must suffice to ensure that the continued
+
functioning of the modified object code is in no case prevented or interfered with
+
solely because modification has been made.
+
+
If you convey an object code work under this section in, or with, or specifically for
+
use in, a User Product, and the conveying occurs as part of a transaction in which
+
the right of possession and use of the User Product is transferred to the recipient
+
in perpetuity or for a fixed term (regardless of how the transaction is
+
characterized), the Corresponding Source conveyed under this section must be
+
accompanied by the Installation Information. But this requirement does not apply if
+
neither you nor any third party retains the ability to install modified object code
+
on the User Product (for example, the work has been installed in ROM).
+
+
The requirement to provide Installation Information does not include a requirement to
+
continue to provide support service, warranty, or updates for a work that has been
+
modified or installed by the recipient, or for the User Product in which it has been
+
modified or installed. Access to a network may be denied when the modification itself
+
materially and adversely affects the operation of the network or violates the rules
+
and protocols for communication across the network.
+
+
Corresponding Source conveyed, and Installation Information provided, in accord with
+
this section must be in a format that is publicly documented (and with an
+
implementation available to the public in source code form), and must require no
+
special password or key for unpacking, reading or copying.
+
+
### 7. Additional Terms
+
+
“Additional permissions” are terms that supplement the terms of this
+
License by making exceptions from one or more of its conditions. Additional
+
permissions that are applicable to the entire Program shall be treated as though they
+
were included in this License, to the extent that they are valid under applicable
+
law. If additional permissions apply only to part of the Program, that part may be
+
used separately under those permissions, but the entire Program remains governed by
+
this License without regard to the additional permissions.
+
+
When you convey a copy of a covered work, you may at your option remove any
+
additional permissions from that copy, or from any part of it. (Additional
+
permissions may be written to require their own removal in certain cases when you
+
modify the work.) You may place additional permissions on material, added by you to a
+
covered work, for which you have or can give appropriate copyright permission.
+
+
Notwithstanding any other provision of this License, for material you add to a
+
covered work, you may (if authorized by the copyright holders of that material)
+
supplement the terms of this License with terms:
+
+
- **a)** Disclaiming warranty or limiting liability differently from the terms of
+
sections 15 and 16 of this License; or
+
- **b)** Requiring preservation of specified reasonable legal notices or author
+
attributions in that material or in the Appropriate Legal Notices displayed by works
+
containing it; or
+
- **c)** Prohibiting misrepresentation of the origin of that material, or requiring that
+
modified versions of such material be marked in reasonable ways as different from the
+
original version; or
+
- **d)** Limiting the use for publicity purposes of names of licensors or authors of the
+
material; or
+
- **e)** Declining to grant rights under trademark law for use of some trade names,
+
trademarks, or service marks; or
+
- **f)** Requiring indemnification of licensors and authors of that material by anyone
+
who conveys the material (or modified versions of it) with contractual assumptions of
+
liability to the recipient, for any liability that these contractual assumptions
+
directly impose on those licensors and authors.
+
+
All other non-permissive additional terms are considered “further
+
restrictions” within the meaning of section 10. If the Program as you received
+
it, or any part of it, contains a notice stating that it is governed by this License
+
along with a term that is a further restriction, you may remove that term. If a
+
license document contains a further restriction but permits relicensing or conveying
+
under this License, you may add to a covered work material governed by the terms of
+
that license document, provided that the further restriction does not survive such
+
relicensing or conveying.
+
+
If you add terms to a covered work in accord with this section, you must place, in
+
the relevant source files, a statement of the additional terms that apply to those
+
files, or a notice indicating where to find the applicable terms.
+
+
Additional terms, permissive or non-permissive, may be stated in the form of a
+
separately written license, or stated as exceptions; the above requirements apply
+
either way.
+
+
### 8. Termination
+
+
You may not propagate or modify a covered work except as expressly provided under
+
this License. Any attempt otherwise to propagate or modify it is void, and will
+
automatically terminate your rights under this License (including any patent licenses
+
granted under the third paragraph of section 11).
+
+
However, if you cease all violation of this License, then your license from a
+
particular copyright holder is reinstated **(a)** provisionally, unless and until the
+
copyright holder explicitly and finally terminates your license, and **(b)** permanently,
+
if the copyright holder fails to notify you of the violation by some reasonable means
+
prior to 60 days after the cessation.
+
+
Moreover, your license from a particular copyright holder is reinstated permanently
+
if the copyright holder notifies you of the violation by some reasonable means, this
+
is the first time you have received notice of violation of this License (for any
+
work) from that copyright holder, and you cure the violation prior to 30 days after
+
your receipt of the notice.
+
+
Termination of your rights under this section does not terminate the licenses of
+
parties who have received copies or rights from you under this License. If your
+
rights have been terminated and not permanently reinstated, you do not qualify to
+
receive new licenses for the same material under section 10.
+
+
### 9. Acceptance Not Required for Having Copies
+
+
You are not required to accept this License in order to receive or run a copy of the
+
Program. Ancillary propagation of a covered work occurring solely as a consequence of
+
using peer-to-peer transmission to receive a copy likewise does not require
+
acceptance. However, nothing other than this License grants you permission to
+
propagate or modify any covered work. These actions infringe copyright if you do not
+
accept this License. Therefore, by modifying or propagating a covered work, you
+
indicate your acceptance of this License to do so.
+
+
### 10. Automatic Licensing of Downstream Recipients
+
+
Each time you convey a covered work, the recipient automatically receives a license
+
from the original licensors, to run, modify and propagate that work, subject to this
+
License. You are not responsible for enforcing compliance by third parties with this
+
License.
+
+
An “entity transaction” is a transaction transferring control of an
+
organization, or substantially all assets of one, or subdividing an organization, or
+
merging organizations. If propagation of a covered work results from an entity
+
transaction, each party to that transaction who receives a copy of the work also
+
receives whatever licenses to the work the party's predecessor in interest had or
+
could give under the previous paragraph, plus a right to possession of the
+
Corresponding Source of the work from the predecessor in interest, if the predecessor
+
has it or can get it with reasonable efforts.
+
+
You may not impose any further restrictions on the exercise of the rights granted or
+
affirmed under this License. For example, you may not impose a license fee, royalty,
+
or other charge for exercise of rights granted under this License, and you may not
+
initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging
+
that any patent claim is infringed by making, using, selling, offering for sale, or
+
importing the Program or any portion of it.
+
+
### 11. Patents
+
+
A “contributor” is a copyright holder who authorizes use under this
+
License of the Program or a work on which the Program is based. The work thus
+
licensed is called the contributor's “contributor version”.
+
+
A contributor's “essential patent claims” are all patent claims owned or
+
controlled by the contributor, whether already acquired or hereafter acquired, that
+
would be infringed by some manner, permitted by this License, of making, using, or
+
selling its contributor version, but do not include claims that would be infringed
+
only as a consequence of further modification of the contributor version. For
+
purposes of this definition, “control” includes the right to grant patent
+
sublicenses in a manner consistent with the requirements of this License.
+
+
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license
+
under the contributor's essential patent claims, to make, use, sell, offer for sale,
+
import and otherwise run, modify and propagate the contents of its contributor
+
version.
+
+
In the following three paragraphs, a “patent license” is any express
+
agreement or commitment, however denominated, not to enforce a patent (such as an
+
express permission to practice a patent or covenant not to sue for patent
+
infringement). To “grant” such a patent license to a party means to make
+
such an agreement or commitment not to enforce a patent against the party.
+
+
If you convey a covered work, knowingly relying on a patent license, and the
+
Corresponding Source of the work is not available for anyone to copy, free of charge
+
and under the terms of this License, through a publicly available network server or
+
other readily accessible means, then you must either **(1)** cause the Corresponding
+
Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the
+
patent license for this particular work, or **(3)** arrange, in a manner consistent with
+
the requirements of this License, to extend the patent license to downstream
+
recipients. “Knowingly relying” means you have actual knowledge that, but
+
for the patent license, your conveying the covered work in a country, or your
+
recipient's use of the covered work in a country, would infringe one or more
+
identifiable patents in that country that you have reason to believe are valid.
+
+
If, pursuant to or in connection with a single transaction or arrangement, you
+
convey, or propagate by procuring conveyance of, a covered work, and grant a patent
+
license to some of the parties receiving the covered work authorizing them to use,
+
propagate, modify or convey a specific copy of the covered work, then the patent
+
license you grant is automatically extended to all recipients of the covered work and
+
works based on it.
+
+
A patent license is “discriminatory” if it does not include within the
+
scope of its coverage, prohibits the exercise of, or is conditioned on the
+
non-exercise of one or more of the rights that are specifically granted under this
+
License. You may not convey a covered work if you are a party to an arrangement with
+
a third party that is in the business of distributing software, under which you make
+
payment to the third party based on the extent of your activity of conveying the
+
work, and under which the third party grants, to any of the parties who would receive
+
the covered work from you, a discriminatory patent license **(a)** in connection with
+
copies of the covered work conveyed by you (or copies made from those copies), or **(b)**
+
primarily for and in connection with specific products or compilations that contain
+
the covered work, unless you entered into that arrangement, or that patent license
+
was granted, prior to 28 March 2007.
+
+
Nothing in this License shall be construed as excluding or limiting any implied
+
license or other defenses to infringement that may otherwise be available to you
+
under applicable patent law.
+
+
### 12. No Surrender of Others' Freedom
+
+
If conditions are imposed on you (whether by court order, agreement or otherwise)
+
that contradict the conditions of this License, they do not excuse you from the
+
conditions of this License. If you cannot convey a covered work so as to satisfy
+
simultaneously your obligations under this License and any other pertinent
+
obligations, then as a consequence you may not convey it at all. For example, if you
+
agree to terms that obligate you to collect a royalty for further conveying from
+
those to whom you convey the Program, the only way you could satisfy both those terms
+
and this License would be to refrain entirely from conveying the Program.
+
+
### 13. Use with the GNU Affero General Public License
+
+
Notwithstanding any other provision of this License, you have permission to link or
+
combine any covered work with a work licensed under version 3 of the GNU Affero
+
General Public License into a single combined work, and to convey the resulting work.
+
The terms of this License will continue to apply to the part which is the covered
+
work, but the special requirements of the GNU Affero General Public License, section
+
13, concerning interaction through a network will apply to the combination as such.
+
+
### 14. Revised Versions of this License
+
+
The Free Software Foundation may publish revised and/or new versions of the GNU
+
General Public License from time to time. Such new versions will be similar in spirit
+
to the present version, but may differ in detail to address new problems or concerns.
+
+
Each version is given a distinguishing version number. If the Program specifies that
+
a certain numbered version of the GNU General Public License “or any later
+
version” applies to it, you have the option of following the terms and
+
conditions either of that numbered version or of any later version published by the
+
Free Software Foundation. If the Program does not specify a version number of the GNU
+
General Public License, you may choose any version ever published by the Free
+
Software Foundation.
+
+
If the Program specifies that a proxy can decide which future versions of the GNU
+
General Public License can be used, that proxy's public statement of acceptance of a
+
version permanently authorizes you to choose that version for the Program.
+
+
Later license versions may give you additional or different permissions. However, no
+
additional obligations are imposed on any author or copyright holder as a result of
+
your choosing to follow a later version.
+
+
### 15. Disclaimer of Warranty
+
+
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+
PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER
+
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+
QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+
### 16. Limitation of Liability
+
+
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
+
COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
+
PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+
PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
+
OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
+
WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+
POSSIBILITY OF SUCH DAMAGES.
+
+
### 17. Interpretation of Sections 15 and 16
+
+
If the disclaimer of warranty and limitation of liability provided above cannot be
+
given local legal effect according to their terms, reviewing courts shall apply local
+
law that most closely approximates an absolute waiver of all civil liability in
+
connection with the Program, unless a warranty or assumption of liability accompanies
+
a copy of the Program in return for a fee.
+
+
_END OF TERMS AND CONDITIONS_
+
+
## How to Apply These Terms to Your New Programs
+
+
If you develop a new program, and you want it to be of the greatest possible use to
+
the public, the best way to achieve this is to make it free software which everyone
+
can redistribute and change under these terms.
+
+
To do so, attach the following notices to the program. It is safest to attach them
+
to the start of each source file to most effectively state the exclusion of warranty;
+
and each file should have at least the “copyright” line and a pointer to
+
where the full notice is found.
+
+
```
+
<one line to give the program's name and a brief idea of what it does.>
+
Copyright (C) <year> <name of author>
+
+
This program is free software: you can redistribute it and/or modify
+
it under the terms of the GNU General Public License as published by
+
the Free Software Foundation, either version 3 of the License, or
+
(at your option) any later version.
+
+
This program is distributed in the hope that it will be useful,
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+
GNU General Public License for more details.
+
+
You should have received a copy of the GNU General Public License
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
+
```
+
+
Also add information on how to contact you by electronic and paper mail.
+
+
If the program does terminal interaction, make it output a short notice like this
+
when it starts in an interactive mode:
+
+
```
+
<program> Copyright (C) <year> <name of author>
+
This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
+
This is free software, and you are welcome to redistribute it
+
under certain conditions; type 'show c' for details.
+
```
+
+
The hypothetical commands `show w` and `show c` should show the appropriate parts of
+
the General Public License. Of course, your program's commands might be different;
+
for a GUI interface, you would use an “about box”.
+
+
You should also get your employer (if you work as a programmer) or school, if any, to
+
sign a “copyright disclaimer” for the program, if necessary. For more
+
information on this, and how to apply and follow the GNU GPL, see
+
\<<http://www.gnu.org/licenses/>>.
+
+
The GNU General Public License does not permit incorporating your program into
+
proprietary programs. If your program is a subroutine library, you may consider it
+
more useful to permit linking proprietary applications with the library. If this is
+
what you want to do, use the GNU Lesser General Public License instead of this
+
License. But first, please read
+
\<<http://www.gnu.org/philosophy/why-not-lgpl.html>>.
+3
README.md
···
+
My NixOS config!
+
+
Heavily inspired/stolen from https://github.com/alyraffauf/nixcfg, aly you're really cool!!!
+404
flake.lock
···
+
{
+
"nodes": {
+
"agenix": {
+
"inputs": {
+
"darwin": "darwin",
+
"home-manager": "home-manager",
+
"nixpkgs": [
+
"nixpkgs"
+
],
+
"systems": "systems"
+
},
+
"locked": {
+
"lastModified": 1754433428,
+
"narHash": "sha256-NA/FT2hVhKDftbHSwVnoRTFhes62+7dxZbxj5Gxvghs=",
+
"owner": "ryantm",
+
"repo": "agenix",
+
"rev": "9edb1787864c4f59ae5074ad498b6272b3ec308d",
+
"type": "github"
+
},
+
"original": {
+
"owner": "ryantm",
+
"repo": "agenix",
+
"type": "github"
+
}
+
},
+
"crane": {
+
"locked": {
+
"lastModified": 1731098351,
+
"narHash": "sha256-HQkYvKvaLQqNa10KEFGgWHfMAbWBfFp+4cAgkut+NNE=",
+
"owner": "ipetkov",
+
"repo": "crane",
+
"rev": "ef80ead953c1b28316cc3f8613904edc2eb90c28",
+
"type": "github"
+
},
+
"original": {
+
"owner": "ipetkov",
+
"repo": "crane",
+
"type": "github"
+
}
+
},
+
"darwin": {
+
"inputs": {
+
"nixpkgs": [
+
"agenix",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1744478979,
+
"narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
+
"owner": "lnl7",
+
"repo": "nix-darwin",
+
"rev": "43975d782b418ebf4969e9ccba82466728c2851b",
+
"type": "github"
+
},
+
"original": {
+
"owner": "lnl7",
+
"ref": "master",
+
"repo": "nix-darwin",
+
"type": "github"
+
}
+
},
+
"flake-compat": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1696426674,
+
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+
"owner": "edolstra",
+
"repo": "flake-compat",
+
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+
"type": "github"
+
},
+
"original": {
+
"owner": "edolstra",
+
"repo": "flake-compat",
+
"type": "github"
+
}
+
},
+
"flake-parts": {
+
"inputs": {
+
"nixpkgs-lib": "nixpkgs-lib"
+
},
+
"locked": {
+
"lastModified": 1754487366,
+
"narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=",
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18",
+
"type": "github"
+
},
+
"original": {
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"type": "github"
+
}
+
},
+
"flake-parts_2": {
+
"inputs": {
+
"nixpkgs-lib": [
+
"lanzaboote",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1730504689,
+
"narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=",
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"rev": "506278e768c2a08bec68eb62932193e341f55c90",
+
"type": "github"
+
},
+
"original": {
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"type": "github"
+
}
+
},
+
"flake-parts_3": {
+
"inputs": {
+
"nixpkgs-lib": [
+
"nur",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1733312601,
+
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
+
"type": "github"
+
},
+
"original": {
+
"owner": "hercules-ci",
+
"repo": "flake-parts",
+
"type": "github"
+
}
+
},
+
"gitignore": {
+
"inputs": {
+
"nixpkgs": [
+
"lanzaboote",
+
"pre-commit-hooks-nix",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1709087332,
+
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+
"owner": "hercules-ci",
+
"repo": "gitignore.nix",
+
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+
"type": "github"
+
},
+
"original": {
+
"owner": "hercules-ci",
+
"repo": "gitignore.nix",
+
"type": "github"
+
}
+
},
+
"home-manager": {
+
"inputs": {
+
"nixpkgs": [
+
"agenix",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1745494811,
+
"narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
+
"owner": "nix-community",
+
"repo": "home-manager",
+
"rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"repo": "home-manager",
+
"type": "github"
+
}
+
},
+
"home-manager_2": {
+
"inputs": {
+
"nixpkgs": [
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1754842705,
+
"narHash": "sha256-2vvncPLsBWV6dRM5LfGHMGYZ+vzqRDqSPBzxPAS0R/A=",
+
"owner": "nix-community",
+
"repo": "home-manager",
+
"rev": "91586008a23c01cc32894ee187dca8c0a7bd20a4",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"ref": "master",
+
"repo": "home-manager",
+
"type": "github"
+
}
+
},
+
"lanzaboote": {
+
"inputs": {
+
"crane": "crane",
+
"flake-compat": "flake-compat",
+
"flake-parts": "flake-parts_2",
+
"nixpkgs": [
+
"nixpkgs"
+
],
+
"pre-commit-hooks-nix": "pre-commit-hooks-nix",
+
"rust-overlay": "rust-overlay"
+
},
+
"locked": {
+
"lastModified": 1737639419,
+
"narHash": "sha256-AEEDktApTEZ5PZXNDkry2YV2k6t0dTgLPEmAZbnigXU=",
+
"owner": "nix-community",
+
"repo": "lanzaboote",
+
"rev": "a65905a09e2c43ff63be8c0e86a93712361f871e",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"ref": "v0.4.2",
+
"repo": "lanzaboote",
+
"type": "github"
+
}
+
},
+
"nixpkgs": {
+
"locked": {
+
"lastModified": 1754725699,
+
"narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
+
"owner": "NixOS",
+
"repo": "nixpkgs",
+
"rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NixOS",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"nixpkgs-lib": {
+
"locked": {
+
"lastModified": 1753579242,
+
"narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=",
+
"owner": "nix-community",
+
"repo": "nixpkgs.lib",
+
"rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"repo": "nixpkgs.lib",
+
"type": "github"
+
}
+
},
+
"nixpkgs-stable": {
+
"locked": {
+
"lastModified": 1730741070,
+
"narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=",
+
"owner": "NixOS",
+
"repo": "nixpkgs",
+
"rev": "d063c1dd113c91ab27959ba540c0d9753409edf3",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NixOS",
+
"ref": "nixos-24.05",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"nixpkgs-unstable": {
+
"locked": {
+
"lastModified": 1754800730,
+
"narHash": "sha256-HfVZCXic9XLBgybP0318ym3cDnGwBs/+H5MgxFVYF4I=",
+
"owner": "NixOS",
+
"repo": "nixpkgs",
+
"rev": "641d909c4a7538f1539da9240dedb1755c907e40",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NixOS",
+
"ref": "nixpkgs-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"nixpkgs_2": {
+
"locked": {
+
"lastModified": 1754725699,
+
"narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
+
"owner": "nixos",
+
"repo": "nixpkgs",
+
"rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nixos",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
+
}
+
},
+
"nur": {
+
"inputs": {
+
"flake-parts": "flake-parts_3",
+
"nixpkgs": "nixpkgs_2"
+
},
+
"locked": {
+
"lastModified": 1754883319,
+
"narHash": "sha256-DUddNJ5q6sxzQ8SZaWt2KgNIATwSviQnpoeoUWCGopY=",
+
"owner": "nix-community",
+
"repo": "NUR",
+
"rev": "f657c3820a06481f3a037ffba0e69d01f2cedfb2",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"repo": "NUR",
+
"type": "github"
+
}
+
},
+
"pre-commit-hooks-nix": {
+
"inputs": {
+
"flake-compat": [
+
"lanzaboote",
+
"flake-compat"
+
],
+
"gitignore": "gitignore",
+
"nixpkgs": [
+
"lanzaboote",
+
"nixpkgs"
+
],
+
"nixpkgs-stable": "nixpkgs-stable"
+
},
+
"locked": {
+
"lastModified": 1731363552,
+
"narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=",
+
"owner": "cachix",
+
"repo": "pre-commit-hooks.nix",
+
"rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0",
+
"type": "github"
+
},
+
"original": {
+
"owner": "cachix",
+
"repo": "pre-commit-hooks.nix",
+
"type": "github"
+
}
+
},
+
"root": {
+
"inputs": {
+
"agenix": "agenix",
+
"flake-parts": "flake-parts",
+
"home-manager": "home-manager_2",
+
"lanzaboote": "lanzaboote",
+
"nixpkgs": "nixpkgs",
+
"nixpkgs-unstable": "nixpkgs-unstable",
+
"nur": "nur"
+
}
+
},
+
"rust-overlay": {
+
"inputs": {
+
"nixpkgs": [
+
"lanzaboote",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1731897198,
+
"narHash": "sha256-Ou7vLETSKwmE/HRQz4cImXXJBr/k9gp4J4z/PF8LzTE=",
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"rev": "0be641045af6d8666c11c2c40e45ffc9667839b5",
+
"type": "github"
+
},
+
"original": {
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"type": "github"
+
}
+
},
+
"systems": {
+
"locked": {
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"owner": "nix-systems",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-systems",
+
"repo": "default",
+
"type": "github"
+
}
+
}
+
},
+
"root": "root",
+
"version": 7
+
}
+43
flake.nix
···
+
{
+
description = "Aly's NixOS flake with flake-parts";
+
+
inputs = {
+
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+
+
agenix = {
+
url = "github:ryantm/agenix";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
flake-parts.url = "github:hercules-ci/flake-parts";
+
+
home-manager = {
+
url = "github:nix-community/home-manager/master";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
lanzaboote = {
+
url = "github:nix-community/lanzaboote/v0.4.2";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
nur.url = "github:nix-community/NUR";
+
};
+
+
nixConfig = {
+
accept-flake-config = true;
+
};
+
+
outputs = inputs @ {flake-parts, ...}:
+
flake-parts.lib.mkFlake {inherit inputs;} {
+
systems = [
+
"x86_64-linux"
+
];
+
+
imports = [
+
./modules/flake
+
inputs.home-manager.flakeModules.home-manager
+
];
+
};
+
}
+89
homes/ayla/default.nix
···
+
{
+
pkgs,
+
lib,
+
self,
+
config,
+
...
+
}: {
+
imports = [
+
self.homeModules.default
+
];
+
+
config = lib.mkMerge [
+
{
+
home = {
+
packages = with pkgs; [
+
rclone
+
];
+
+
username = "ayla";
+
};
+
+
programs.home-manager.enable = true;
+
xdg.enable = true;
+
+
myHome = {
+
desktop = {
+
gnome.enable = true;
+
};
+
+
programs = {
+
chromium.enable = true;
+
fastfetch.enable = true;
+
firefox.enable = true;
+
git.enable = true;
+
micro.enable = true;
+
mpv.enable = true;
+
obs-studio.enable = true;
+
zed-editor.enable = true;
+
};
+
+
profiles = {
+
shell.enable = true;
+
defaultApps = {
+
enable = true;
+
forceMimeAssociations = true;
+
audioPlayer.package = config.programs.mpv.finalPackage;
+
videoPlayer.package = config.programs.mpv.finalPackage;
+
editor.package = pkgs.gnome-text-editor;
+
fileManager.package = pkgs.nautilus;
+
imageViewer.package = pkgs.loupe;
+
pdfViewer.package = pkgs.papers;
+
terminal.package = pkgs.gnome-console;
+
terminalEditor.package = config.programs.micro.package;
+
webBrowser.package = config.programs.firefox.finalPackage;
+
};
+
};
+
+
services = {
+
aria2.enable = true;
+
syncthing.enable = true;
+
};
+
+
style = {
+
fonts.enable = true;
+
};
+
};
+
}
+
+
(lib.mkIf pkgs.stdenv.isLinux {
+
gtk.gtk3.bookmarks = lib.mkAfter [
+
"file://home/Data/DCMI"
+
"file://home/Data"
+
];
+
+
home = {
+
homeDirectory = "/home/ayla";
+
+
packages = with pkgs; [
+
nicotine-plus
+
];
+
+
stateVersion = "25.05";
+
username = "ayla";
+
};
+
+
systemd.user.startServices = true; # Needed for auto-mounting agenix secrets.
+
})
+
];
+
}
+1
hosts/morgana/README.md
···
+
That's the poor acer laptop that I daily drive.
+75
hosts/morgana/default.nix
···
+
{self, ...}: {
+
imports = [
+
./home.nix
+
self.nixosModules.locale-en-gb
+
];
+
+
networking.hostName = "morgana";
+
system.stateVersion = "25.05";
+
time.timeZone = "America/Sao_Paulo";
+
myHardware.acer.aspire.A515-52G.enable = true;
+
+
myNixOS = {
+
programs = {
+
lanzaboote.enable = true;
+
nix.enable = true;
+
nix-ld.enable = true;
+
steam.enable = true;
+
firefox.enable = true;
+
};
+
profiles = {
+
base.enable = true;
+
workstation.enable = true;
+
};
+
desktop.gnome.enable = true;
+
services = {
+
tailscale.enable = true;
+
aria2.enable = true;
+
};
+
style.fonts.enable = true;
+
};
+
+
myUsers = {
+
ayla = {
+
password = "REDACTED";
+
};
+
};
+
+
boot.initrd = {
+
availableKernelModules = [
+
"xhci_pci"
+
"ahci"
+
"usb_storage"
+
"sd_mod"
+
"rtsx_pci_sdmmc"
+
];
+
+
luks.devices."luks-cc030211-13e5-4411-a906-94c6ef45a0c6".device = "/dev/disk/by-uuid/cc030211-13e5-4411-a906-94c6ef45a0c6";
+
};
+
+
fileSystems = {
+
"/" = {
+
device = "/dev/disk/by-uuid/8ed468ba-610b-49c8-8b93-5a20d4bf14da";
+
fsType = "btrfs";
+
options = [
+
"subvol=@"
+
"compress=zstd"
+
"noatime"
+
];
+
};
+
+
"/boot" = {
+
device = "/dev/disk/by-uuid/4831-1B0D";
+
fsType = "vfat";
+
options = [
+
"fmask=0077"
+
"dmask=0077"
+
];
+
};
+
+
"/home/Data" = {
+
device = "/dev/disk/by-uuid/6cfb1f47-51d6-4ece-ab1c-6ad3c2d41542";
+
fsType = "ext4";
+
};
+
};
+
}
+5
hosts/morgana/home.nix
···
+
{self, ...}: {
+
home-manager.users = {
+
inherit (self.homeConfigurations) ayla;
+
};
+
}
+6
modules/flake/default.nix
···
+
{
+
imports = [
+
./home-manager.nix
+
./nixos.nix
+
];
+
}
+11
modules/flake/home-manager.nix
···
+
_: {
+
flake = {
+
homeConfigurations = {
+
ayla = ../../homes/ayla;
+
};
+
+
homeModules = {
+
default = ../home;
+
};
+
};
+
}
+48
modules/flake/nixos.nix
···
+
{
+
self,
+
inputs,
+
...
+
}: {
+
flake = {
+
nixosModules = {
+
hardware = ../hardware;
+
locale-en-gb = ../locale/en-gb;
+
nixos = ../nixos;
+
users = ../users;
+
};
+
+
nixosConfigurations = let
+
modules = self.nixosModules;
+
in
+
inputs.nixpkgs.lib.genAttrs ["morgana"] (
+
host:
+
inputs.nixpkgs.lib.nixosSystem {
+
modules = [
+
../../hosts/${host}
+
inputs.home-manager.nixosModules.home-manager
+
inputs.lanzaboote.nixosModules.lanzaboote
+
modules.hardware
+
modules.nixos
+
modules.users
+
+
{
+
home-manager = {
+
useGlobalPkgs = true;
+
useUserPackages = true;
+
extraSpecialArgs = {inherit inputs self;};
+
backupFileExtension = "backup";
+
};
+
+
nixpkgs = {
+
overlays = [
+
self.inputs.nur.overlays.default
+
];
+
config.allowUnfree = true;
+
};
+
}
+
];
+
specialArgs = {inherit self;};
+
}
+
);
+
};
+
}
+28
modules/hardware/acer/aspire/A515-52G/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myHardware.acer.aspire.A515-52G.enable =
+
lib.mkEnableOption "Acer Aspire A515-52G hardware configuration.";
+
+
config = lib.mkIf config.myHardware.acer.aspire.A515-52G.enable {
+
hardware.nvidia.prime = {
+
intelBusId = "PCI:0:2:0";
+
nvidiaBusId = "PCI:1:0:0";
+
};
+
+
myHardware = {
+
nvidia.gpu.enable = true;
+
intel = {
+
cpu.enable = true;
+
gpu.enable = true;
+
};
+
+
profiles = {
+
base.enable = true;
+
laptop.enable = true;
+
};
+
};
+
};
+
}
+5
modules/hardware/acer/aspire/default.nix
···
+
{...}: {
+
imports = [
+
./A515-52G
+
];
+
}
+5
modules/hardware/acer/default.nix
···
+
{...}: {
+
imports = [
+
./aspire
+
];
+
}
+8
modules/hardware/default.nix
···
+
{...}: {
+
imports = [
+
./nvidia
+
./intel
+
./acer
+
./profiles
+
];
+
}
+13
modules/hardware/intel/cpu/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myHardware.intel.cpu.enable = lib.mkEnableOption "Intel CPU configuration.";
+
+
config = lib.mkIf config.myHardware.intel.cpu.enable {
+
boot.kernelModules = ["kvm-intel"];
+
hardware.cpu.intel.updateMicrocode = true;
+
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+
};
+
}
+6
modules/hardware/intel/default.nix
···
+
{...}: {
+
imports = [
+
./cpu
+
./gpu
+
];
+
}
+39
modules/hardware/intel/gpu/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myHardware.intel.gpu.enable = lib.mkEnableOption "Intel GPU configuration.";
+
+
config = lib.mkIf config.myHardware.intel.gpu.enable {
+
boot.initrd.kernelModules = ["i915"];
+
+
environment.sessionVariables = {
+
LIBVA_DRIVER_NAME = "iHD";
+
VDPAU_DRIVER = "va_gl";
+
};
+
+
hardware = {
+
intel-gpu-tools.enable = true;
+
+
graphics = {
+
enable = true;
+
+
extraPackages = [
+
pkgs.intel-media-driver # LIBVA_DRIVER_NAME=iHD
+
(pkgs.intel-vaapi-driver.override {enableHybridCodec = true;})
+
pkgs.libvdpau-va-gl
+
];
+
+
extraPackages32 = [
+
pkgs.driversi686Linux.intel-media-driver # LIBVA_DRIVER_NAME=iHD
+
(pkgs.driversi686Linux.intel-vaapi-driver.override {enableHybridCodec = true;})
+
pkgs.driversi686Linux.libvdpau-va-gl
+
];
+
};
+
};
+
+
services.xserver.videoDrivers = ["modesetting"];
+
};
+
}
+5
modules/hardware/nvidia/default.nix
···
+
{...}: {
+
imports = [
+
./gpu
+
];
+
}
+54
modules/hardware/nvidia/gpu/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myHardware.nvidia.gpu.enable = lib.mkEnableOption "Use the NVIDIA proprietary GPU drivers.";
+
+
config = lib.mkIf config.myHardware.nvidia.gpu.enable {
+
# Load nvidia driver for Xorg and Wayland
+
services.xserver.videoDrivers = [
+
"modesetting"
+
"nvidia"
+
];
+
+
# Enable OpenGL
+
hardware = {
+
graphics = {
+
enable = true;
+
enable32Bit = true;
+
};
+
+
nvidia = {
+
# Modesetting is required.
+
modesetting.enable = true;
+
+
# Nvidia power management. Experimental, and can cause sleep/suspend to fail.
+
# Enable this if you have graphical corruption issues or application crashes after waking
+
# up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
+
# of just the bare essentials.
+
powerManagement.enable = false;
+
+
# Use the NVidia open source kernel module (not to be confused with the
+
# independent third-party "nouveau" open source driver).
+
# Support is limited to the Turing and later architectures. Full list of
+
# supported GPUs is at:
+
# https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus
+
# Only available from driver 515.43.04+
+
open = false;
+
+
# Enable the Nvidia settings menu,
+
# accessible via `nvidia-settings`.
+
nvidiaSettings = true;
+
+
# Optionally, you may need to select the appropriate driver version for your specific GPU.
+
package = config.boot.kernelPackages.nvidiaPackages.stable;
+
+
prime.offload = {
+
enable = true;
+
enableOffloadCmd = true;
+
};
+
};
+
};
+
};
+
}
+38
modules/hardware/profiles/base/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myHardware.profiles.base.enable = lib.mkEnableOption "Base common hardware configuration";
+
+
config = lib.mkIf config.myHardware.profiles.base.enable {
+
console.useXkbConfig = true;
+
+
hardware = {
+
enableAllFirmware = true;
+
+
bluetooth = {
+
enable = false;
+
powerOnBoot = true;
+
};
+
+
keyboard.qmk.enable = true;
+
};
+
+
services = {
+
fstrim.enable = true;
+
+
logind = {
+
powerKey = "suspend";
+
powerKeyLongPress = "poweroff";
+
};
+
+
xserver.xkb = {
+
layout = "us";
+
variant = "colemak";
+
};
+
};
+
+
zramSwap.enable = lib.mkDefault true;
+
};
+
}
+6
modules/hardware/profiles/default.nix
···
+
{...}: {
+
imports = [
+
./base
+
./laptop
+
];
+
}
+33
modules/hardware/profiles/laptop/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myHardware.profiles.laptop.enable = lib.mkEnableOption "Laptop hardware configuration.";
+
+
config = lib.mkMerge [
+
(lib.mkIf config.myHardware.profiles.laptop.enable {
+
boot.kernel.sysctl."kernel.nmi_watchdog" = lib.mkDefault 0;
+
+
services = {
+
tuned = {
+
enable = lib.mkDefault true;
+
settings.dynamic_tuning = true;
+
};
+
+
# udev.extraRules = lib.mkIf config.services.power-profiles-daemon.enable ''
+
# ## Automatically switch power profiles based on AC power status.
+
# ACTION=="change", SUBSYSTEM=="power_supply", ATTRS{type}=="Mains", ATTRS{online}=="0", RUN+="${lib.getExe pkgs.power-profiles-daemon} set power-saver"
+
# ACTION=="change", SUBSYSTEM=="power_supply", ATTRS{type}=="Mains", ATTRS{online}=="1", RUN+="${lib.getExe pkgs.power-profiles-daemon} set balanced"
+
# '';
+
+
upower.enable = true;
+
};
+
})
+
+
(lib.mkIf (config.myHardware.intel.cpu.enable && config.myHardware.profiles.laptop.enable) {
+
# powerManagement.powertop.enable = true;
+
services.thermald.enable = true;
+
})
+
];
+
}
+20
modules/home/default.nix
···
+
{inputs, ...}: {
+
imports = [
+
./desktop
+
./programs
+
./services
+
./profiles
+
./style
+
./packages.nix
+
./hidden.nix
+
inputs.agenix.homeManagerModules.default
+
];
+
+
home.username = "ayla";
+
home.homeDirectory = "/home/ayla";
+
+
home.stateVersion = "25.05";
+
home.shell.enableFishIntegration = true;
+
+
programs.home-manager.enable = true;
+
}
+53
modules/home/desktop/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
imports = [
+
./gnome
+
];
+
+
options.myHome.desktop.enable = lib.mkOption {
+
default = config.myHome.desktop.gnome.enable;
+
description = "Desktop environment configuration.";
+
type = lib.types.bool;
+
};
+
+
config = lib.mkIf config.myHome.desktop.enable {
+
home.packages = [
+
pkgs.adwaita-icon-theme
+
];
+
+
dconf = {
+
enable = true;
+
+
settings = {
+
"org/gnome/nm-applet".disable-connected-notifications = true;
+
"org/gtk/gtk4/settings/file-chooser".sort-directories-first = true;
+
"org/gtk/settings/file-chooser".sort-directories-first = true;
+
};
+
};
+
+
gtk.gtk3.bookmarks = [
+
"file://${config.xdg.userDirs.documents}"
+
"file://${config.xdg.userDirs.download}"
+
"file://${config.xdg.userDirs.music}"
+
"file://${config.xdg.userDirs.videos}"
+
"file://${config.xdg.userDirs.pictures}"
+
];
+
+
xdg.userDirs = {
+
enable = true;
+
createDirectories = true;
+
desktop = lib.mkDefault "${config.home.homeDirectory}/Desktop";
+
documents = lib.mkDefault "${config.home.homeDirectory}/Documents";
+
download = lib.mkDefault "${config.home.homeDirectory}/Downloads";
+
music = lib.mkDefault "${config.home.homeDirectory}/Music";
+
pictures = lib.mkDefault "${config.home.homeDirectory}/Pictures";
+
publicShare = lib.mkDefault "${config.home.homeDirectory}/Public";
+
templates = lib.mkDefault "${config.home.homeDirectory}/Templates";
+
videos = lib.mkDefault "${config.home.homeDirectory}/Videos";
+
};
+
};
+
}
+151
modules/home/desktop/gnome/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myHome.desktop.gnome = {
+
enable = lib.mkEnableOption "GNOME desktop environment";
+
};
+
+
config = lib.mkIf config.myHome.desktop.gnome.enable {
+
dconf = {
+
enable = true;
+
+
settings = let
+
defaultApps = {
+
terminal = config.myHome.profiles.defaultApps.terminal.exec or (lib.getExe pkgs.gnome-console);
+
webBrowser =
+
config.myHome.profiles.defaultApps.webBrowser.exec
+
or (lib.getExe config.programs.firefox.finalPackage);
+
fileManager = config.myHome.profiles.defaultApps.fileManager.exec or (lib.getExe pkgs.nautilus);
+
editor = config.myHome.profiles.defaultApps.editor.exec or (lib.getExe pkgs.gnome-text-editor);
+
};
+
in {
+
"org/gnome/desktop/datetime".automatic-timezone = true;
+
+
"org/gnome/desktop/interface" = {
+
clock-format = "24h";
+
enable-hot-corners = false;
+
};
+
+
"org/gnome/desktop/peripherals/touchpad".tap-to-click = true;
+
+
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
+
binding = "<Super>Return";
+
command = "${defaultApps.terminal}";
+
name = "Terminal";
+
};
+
+
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = {
+
binding = "<Super>e";
+
command = "${defaultApps.fileManager}";
+
name = "File Manager";
+
};
+
+
"org/gnome/shell" = {
+
welcome-dialog-last-shown-version = "9999999999"; # No welcome dialog.
+
};
+
+
"org/gnome/shell/keybindings" = {
+
switch-to-application-1 = [];
+
switch-to-application-2 = [];
+
switch-to-application-3 = [];
+
switch-to-application-4 = [];
+
switch-to-application-5 = [];
+
switch-to-application-6 = [];
+
switch-to-application-7 = [];
+
switch-to-application-8 = [];
+
switch-to-application-9 = [];
+
switch-to-application-10 = [];
+
};
+
+
"org/gnome/system/location".enabled = true;
+
+
"org/gnome/desktop/wm/keybindings" = {
+
move-to-monitor-down = [
+
"<Ctrl><Shift><Super>e"
+
"<Ctrl><Shift><Super>Down"
+
];
+
move-to-monitor-left = [
+
"<Ctrl><Shift><Super>n"
+
"<Ctrl><Shift><Super>Left"
+
];
+
move-to-monitor-right = [
+
"<Ctrl><Shift><Super>o"
+
"<Ctrl><Shift><Super>Right"
+
];
+
move-to-monitor-up = [
+
"<Ctrl><Shift><Super>i"
+
"<Ctrl><Shift><Super>Up"
+
];
+
move-to-workspace-1 = ["<Shift><Super>1"];
+
move-to-workspace-10 = ["<Shift><Super>0"];
+
move-to-workspace-2 = ["<Shift><Super>2"];
+
move-to-workspace-3 = ["<Shift><Super>3"];
+
move-to-workspace-4 = ["<Shift><Super>4"];
+
move-to-workspace-5 = ["<Shift><Super>5"];
+
move-to-workspace-6 = ["<Shift><Super>6"];
+
move-to-workspace-7 = ["<Shift><Super>7"];
+
move-to-workspace-8 = ["<Shift><Super>8"];
+
move-to-workspace-9 = ["<Shift><Super>9"];
+
move-to-workspace-down = ["<Shift><Super>j"];
+
move-to-workspace-left = [
+
"<Shift><Super>n"
+
"<Shift><Super>Comma"
+
];
+
move-to-workspace-right = [
+
"<Shift><Super>o"
+
"<Shift><Super>Period"
+
];
+
move-to-workspace-up = ["<Shift><Super>k"];
+
switch-to-workspace-1 = ["<Super>1"];
+
switch-to-workspace-10 = ["<Super>0"];
+
switch-to-workspace-2 = ["<Super>2"];
+
switch-to-workspace-3 = ["<Super>3"];
+
switch-to-workspace-4 = ["<Super>4"];
+
switch-to-workspace-5 = ["<Super>5"];
+
switch-to-workspace-6 = ["<Super>6"];
+
switch-to-workspace-7 = ["<Super>7"];
+
switch-to-workspace-8 = ["<Super>8"];
+
switch-to-workspace-9 = ["<Super>9"];
+
switch-to-workspace-down = [];
+
switch-to-workspace-left = ["<Super>Comma"];
+
switch-to-workspace-right = ["<Super>Period"];
+
switch-to-workspace-up = [];
+
toggle-fullscreen = ["<Super>w"];
+
};
+
};
+
};
+
+
programs = {
+
firefox.nativeMessagingHosts = [pkgs.gnome-browser-connector];
+
+
gnome-shell = {
+
enable = true;
+
+
extensions = [
+
{package = pkgs.gnomeExtensions.appindicator;}
+
{package = pkgs.gnomeExtensions.night-theme-switcher;}
+
{package = pkgs.gnomeExtensions.gsconnect;}
+
];
+
};
+
};
+
+
home.packages = with pkgs; [
+
gnome-tweaks
+
adw-gtk3
+
gnome-extension-manager
+
];
+
+
myHome.profiles.defaultApps = {
+
audioPlayer.package = lib.mkDefault pkgs.mpv;
+
editor.package = lib.mkDefault pkgs.gnome-text-editor;
+
fileManager.package = lib.mkDefault pkgs.nautilus;
+
imageViewer.package = lib.mkDefault pkgs.loupe;
+
pdfViewer.package = lib.mkDefault pkgs.papers;
+
terminal.package = lib.mkDefault pkgs.gnome-console;
+
videoPlayer.package = lib.mkDefault pkgs.mpv;
+
};
+
};
+
}
+5
modules/home/hidden.nix
···
+
{...}: {
+
home.file.".hidden" = {
+
text = "result";
+
};
+
}
+51
modules/home/packages.nix
···
+
{pkgs, ...}: {
+
home.packages = with pkgs; [
+
# --- System Utilities ---
+
zip
+
xz
+
unzip
+
p7zip
+
wl-clipboard
+
libnotify
+
+
# --- Development ---
+
alejandra
+
nixd
+
gcc
+
nodejs
+
pnpm
+
typescript
+
ffmpeg
+
luajit
+
love
+
+
# --- Applications ---
+
keepassxc
+
libsecret
+
qbittorrent
+
flare-signal
+
kdePackages.kdenlive
+
krita
+
gimp3
+
yt-dlp
+
aseprite
+
inkscape
+
jellyfin-media-player
+
calibre
+
picard
+
freac
+
audacious
+
audacious-plugins
+
lmms
+
+
# --- Gaming ---
+
wine
+
steam-run
+
lutris
+
mgba
+
melonDS
+
openttd
+
prismlauncher
+
mindustry
+
];
+
}
+6
modules/home/profiles/default.nix
···
+
{...}: {
+
imports = [
+
./shell
+
./defaultApps
+
];
+
}
+231
modules/home/profiles/defaultApps/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: let
+
cfg = config.myHome.profiles.defaultApps;
+
mimeTypes = import ./mimeTypes.nix;
+
in {
+
options.myHome.profiles.defaultApps = {
+
enable = lib.mkEnableOption "enforce default applications";
+
forceMimeAssociations = lib.mkEnableOption "force mime associations for defaultApps";
+
+
audioPlayer = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.celluloid;
+
description = "The default audio player package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.audioPlayer.package;
+
description = "The executable path for the default audio player.";
+
};
+
};
+
+
editor = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.gnome-text-editor;
+
description = "The default text editor package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.editor.package;
+
description = "The executable path for the default text editor.";
+
};
+
};
+
+
fileManager = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.nemo;
+
description = "The default file manager package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.fileManager.package;
+
description = "The executable path for the default file manager.";
+
};
+
};
+
+
imageViewer = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.eog;
+
description = "The default image viewer package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.imageViewer.package;
+
description = "The executable path for the default image viewer.";
+
};
+
};
+
+
pdfViewer = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.papers;
+
description = "The default PDF viewer package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.pdfViewer.package;
+
description = "The executable path for the default PDF viewer.";
+
};
+
};
+
+
terminal = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.ghostty;
+
description = "The default terminal emulator package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.terminal.package;
+
description = "The executable path for the default terminal emulator.";
+
};
+
};
+
+
terminalEditor = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.neovim;
+
description = "The default terminal text editor package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.terminalEditor.package;
+
description = "The executable path for the default terminal text editor.";
+
};
+
};
+
+
videoPlayer = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = pkgs.celluloid;
+
description = "The default video player package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.videoPlayer.package;
+
description = "The executable path for the default video player.";
+
};
+
};
+
+
webBrowser = {
+
package = lib.mkOption {
+
type = lib.types.package;
+
default = config.programs.firefox.finalPackage;
+
description = "The default web browser package.";
+
};
+
+
exec = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getExe cfg.webBrowser.package;
+
description = "The executable path for the default web browser.";
+
};
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
dconf = {
+
enable = true;
+
+
settings = {
+
"org/cinnamon/desktop/applications/terminal".exec = "${cfg.terminal.exec}";
+
"org/cinnamon/desktop/default-applications/terminal".exec = "${cfg.terminal.exec}";
+
};
+
};
+
+
home = {
+
packages = with cfg; [
+
audioPlayer.package
+
editor.package
+
fileManager.package
+
imageViewer.package
+
pdfViewer.package
+
terminal.package
+
terminalEditor.package
+
videoPlayer.package
+
webBrowser.package
+
];
+
+
sessionVariables = {
+
BROWSER = "${builtins.baseNameOf cfg.webBrowser.exec}";
+
EDITOR = "${builtins.baseNameOf cfg.terminalEditor.exec}";
+
TERMINAL = "${builtins.baseNameOf cfg.terminal.exec}";
+
};
+
};
+
+
xdg = {
+
configFile."xfce4/helpers.rc".text = ''
+
FileManager=${builtins.baseNameOf cfg.fileManager.exec}
+
TerminalEmulator=${builtins.baseNameOf cfg.terminal.exec}
+
WebBrowser=${builtins.baseNameOf cfg.webBrowser.exec}
+
'';
+
+
mimeApps = lib.mkIf cfg.forceMimeAssociations {
+
enable = true;
+
+
defaultApplications = let
+
mkDefaults = files: desktopFile: lib.genAttrs files (_: [desktopFile]);
+
audioTypes = mkDefaults mimeTypes.audioFiles "defaultAudioPlayer.desktop";
+
+
browserTypes = mkDefaults mimeTypes.browserFiles "defaultWebBrowser.desktop";
+
+
documentTypes = mkDefaults mimeTypes.documentFiles "defaultPdfViewer.desktop";
+
+
editorTypes = mkDefaults mimeTypes.editorFiles "defaultEditor.desktop";
+
+
folderTypes = {
+
"inode/directory" = "defaultFileManager.desktop";
+
};
+
+
imageTypes = mkDefaults mimeTypes.imageFiles "defaultImageViewer.desktop";
+
+
videoTypes = mkDefaults mimeTypes.videoFiles "defaultVideoPlayer.desktop";
+
in
+
audioTypes
+
// browserTypes
+
// documentTypes
+
// editorTypes
+
// folderTypes
+
// imageTypes
+
// videoTypes;
+
};
+
+
desktopEntries = let
+
mkDefaultEntry = name: exec: {
+
exec = "${exec} %U";
+
icon = "${builtins.baseNameOf exec}";
+
name = "Default ${name}";
+
terminal = false;
+
+
settings = {
+
NoDisplay = "true";
+
};
+
};
+
in
+
lib.mkIf cfg.forceMimeAssociations {
+
defaultAudioPlayer = mkDefaultEntry "Audio Player" cfg.audioPlayer.exec;
+
defaultEditor = mkDefaultEntry "Editor" cfg.editor.exec;
+
defaultFileManager = mkDefaultEntry "File Manager" cfg.fileManager.exec;
+
defaultImageViewer = mkDefaultEntry "Image Viewer" cfg.imageViewer.exec;
+
defaultPdfViewer = mkDefaultEntry "PDF Viewer" cfg.pdfViewer.exec;
+
defaultVideoPlayer = mkDefaultEntry "Video Player" cfg.videoPlayer.exec;
+
defaultWebBrowser = mkDefaultEntry "Web Browser" cfg.webBrowser.exec;
+
};
+
};
+
};
+
}
+220
modules/home/profiles/defaultApps/mimeTypes.nix
···
+
{
+
audioFiles = [
+
"application/mpeg4-iod"
+
"application/mpeg4-muxcodetable"
+
"application/mxf"
+
"application/ogg"
+
"application/vnd.apple.mpegurl"
+
"application/vnd.ms-asf"
+
"application/vnd.rn-realmedia-vbr"
+
"application/vnd.rn-realmedia"
+
"application/x-extension-m4a"
+
"application/x-flac"
+
"application/x-ogg"
+
"application/x-streamingmedia"
+
"audio/3gpp"
+
"audio/3gpp2"
+
"audio/aac"
+
"audio/ac3"
+
"audio/amr-wb"
+
"audio/amr"
+
"audio/basic"
+
"audio/dv"
+
"audio/eac3"
+
"audio/flac"
+
"audio/m4a"
+
"audio/midi"
+
"audio/mp1"
+
"audio/mp2"
+
"audio/mp3"
+
"audio/mp4"
+
"audio/mpeg"
+
"audio/mpegurl"
+
"audio/mpg"
+
"audio/ogg"
+
"audio/opus"
+
"audio/scpls"
+
"audio/vnd.dolby.heaac.1"
+
"audio/vnd.dolby.heaac.2"
+
"audio/vnd.dolby.mlp"
+
"audio/vnd.dts.hd"
+
"audio/vnd.dts"
+
"audio/vnd.rn-realaudio"
+
"audio/wav"
+
"audio/webm"
+
"audio/x-aac"
+
"audio/x-aiff"
+
"audio/x-ape"
+
"audio/x-flac"
+
"audio/x-gsm"
+
"audio/x-it"
+
"audio/x-m4a"
+
"audio/x-matroska"
+
"audio/x-mod"
+
"audio/x-mp1"
+
"audio/x-mp2"
+
"audio/x-mp3"
+
"audio/x-mpeg"
+
"audio/x-mpegurl"
+
"audio/x-mpg"
+
"audio/x-ms-asf"
+
"audio/x-ms-wma"
+
"audio/x-musepack"
+
"audio/x-opus+ogg"
+
"audio/x-pn-aiff"
+
"audio/x-pn-au"
+
"audio/x-pn-realaudio"
+
"audio/x-pn-wav"
+
"audio/x-real-audio"
+
"audio/x-realaudio"
+
"audio/x-s3m"
+
"audio/x-scpls"
+
"audio/x-shorten"
+
"audio/x-speex"
+
"audio/x-tta"
+
"audio/x-vorbis"
+
"audio/x-vorbis+ogg"
+
"audio/x-wav"
+
"audio/x-wavpack"
+
"audio/x-xm"
+
"x-content/audio-cdda"
+
"x-content/audio-player"
+
];
+
+
browserFiles = [
+
"application/vnd.mozilla.xul+xml"
+
"application/x-extension-htm"
+
"application/x-extension-html"
+
"application/x-extension-shtml"
+
"application/x-extension-xht"
+
"application/x-extension-xhtml"
+
"application/xhtml+xml"
+
"text/html"
+
"text/xml"
+
"x-scheme-handler/chrome"
+
"x-scheme-handler/ftp"
+
"x-scheme-handler/http"
+
"x-scheme-handler/http"
+
"x-scheme-handler/https"
+
];
+
+
documentFiles = [
+
"application/illustrator"
+
"application/oxps"
+
"application/pdf"
+
"application/postscript"
+
"application/vnd.comicbook-rar"
+
"application/vnd.comicbook+zip"
+
"application/vnd.ms-xpsdocument"
+
"application/x-bzdvi"
+
"application/x-bzpdf"
+
"application/x-bzpostscript"
+
"application/x-cb7"
+
"application/x-cbr"
+
"application/x-cbt"
+
"application/x-cbz"
+
"application/x-dvi"
+
"application/x-ext-cb7"
+
"application/x-ext-cbr"
+
"application/x-ext-cbt"
+
"application/x-ext-cbz"
+
"application/x-ext-djv"
+
"application/x-ext-djvu"
+
"application/x-ext-dvi"
+
"application/x-ext-eps"
+
"application/x-ext-pdf"
+
"application/x-ext-ps"
+
"application/x-gzdvi"
+
"application/x-gzpdf"
+
"application/x-gzpostscript"
+
"application/x-xzpdf"
+
"image/tiff"
+
"image/vnd.djvu"
+
"image/x-bzeps"
+
"image/x-eps"
+
"image/x-gzeps"
+
];
+
+
editorFiles = [
+
"application/json"
+
"application/x-shellscript"
+
"application/x-shellscript"
+
"text/markdown"
+
"text/plain"
+
"text/x-python"
+
];
+
+
imageFiles = [
+
"image/bmp"
+
"image/gif"
+
"image/jpeg"
+
"image/jpg"
+
"image/pjpeg"
+
"image/png"
+
"image/svg+xml-compressed"
+
"image/svg+xml"
+
"image/tiff"
+
"image/vnd.wap.wbmp"
+
"image/webp"
+
"image/x-bmp"
+
"image/x-gray"
+
"image/x-icb"
+
"image/x-icns"
+
"image/x-ico"
+
"image/x-pcx"
+
"image/x-png"
+
"image/x-portable-anymap"
+
"image/x-portable-bitmap"
+
"image/x-portable-graymap"
+
"image/x-portable-pixmap"
+
"image/x-xbitmap"
+
"image/x-xpixmap"
+
];
+
+
videoFiles = [
+
"application/mpeg4-iod"
+
"application/mpeg4-muxcodetable"
+
"application/vnd.apple.mpegurl"
+
"application/x-extension-m4a"
+
"application/x-extension-mp4"
+
"application/x-flash-video"
+
"application/x-matroska"
+
"video/3gp"
+
"video/3gpp"
+
"video/3gpp2"
+
"video/divx"
+
"video/dv"
+
"video/fli"
+
"video/flv"
+
"video/mp2t"
+
"video/mp4"
+
"video/mp4v-es"
+
"video/mpeg-system"
+
"video/mpeg"
+
"video/msvideo"
+
"video/ogg"
+
"video/quicktime"
+
"video/vnd.mpegurl"
+
"video/vnd.rn-realvideo"
+
"video/webm"
+
"video/x-avi"
+
"video/x-flc"
+
"video/x-fli"
+
"video/x-flv"
+
"video/x-m4v"
+
"video/x-matroska"
+
"video/x-mpeg-system"
+
"video/x-mpeg"
+
"video/x-mpeg2"
+
"video/x-ms-asf"
+
"video/x-ms-wm"
+
"video/x-ms-wmv"
+
"video/x-ms-wmx"
+
"video/x-msvideo"
+
"video/x-nsv"
+
"video/x-ogm+ogg"
+
"video/x-theora"
+
"video/x-theora+ogg"
+
"x-content/video-dvd"
+
];
+
}
+64
modules/home/profiles/shell/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myHome.profiles.shell.enable = lib.mkEnableOption "basic shell environment";
+
+
config = lib.mkIf config.myHome.profiles.shell.enable {
+
home = {
+
packages = with pkgs; [
+
(lib.hiPrio uutils-coreutils-noprefix)
+
curl
+
btop
+
nixos-rebuild
+
wget
+
];
+
+
shellAliases = {
+
l = "eza -lah";
+
tree = "eza --tree";
+
top = "btop";
+
npm = "pnpm";
+
ytmusic = "yt-dlp -f 251 --remux-video opus --embed-metadata --embed-thumbnail -o \"%(album)s/%(disc_number>0)s%(disc_number)02d-%(track_number)02d %(title)s.%(ext)s\"";
+
};
+
};
+
+
programs = {
+
bat.enable = true;
+
+
eza = {
+
enable = true;
+
enableFishIntegration = true;
+
extraOptions = [
+
"--group-directories-first"
+
"--header"
+
];
+
git = true;
+
icons = "auto";
+
};
+
+
fish = {
+
enable = true;
+
interactiveShellInit = ''
+
set -gx PATH $PATH /home/$USER/.local/bin
+
'';
+
};
+
+
fzf.enable = true;
+
btop.enable = true;
+
+
zellij = {
+
enable = true;
+
enableFishIntegration = false;
+
};
+
+
zoxide = {
+
enable = true;
+
enableFishIntegration = true;
+
options = ["--cmd cd"];
+
};
+
};
+
};
+
}
+13
modules/home/programs/aria2/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.services.aria2.enable = lib.mkEnableOption "aria2 downloader";
+
+
config = lib.mkIf config.myHome.services.aria2.enable {
+
programs.aria2 = {
+
enable = true;
+
};
+
};
+
}
+37
modules/home/programs/chromium/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myHome.programs.chromium.enable = lib.mkEnableOption "chromium web browser";
+
+
config = lib.mkIf config.myHome.programs.chromium.enable {
+
programs.chromium = {
+
enable = true;
+
+
extensions = [
+
{id = "ddkjiahejlhfcafbddmgiahcphecmpfh";} # ublock origin lite
+
{id = "mdjildafknihdffpkfmmpnpoiajfjnjd";} # consent-o-matic
+
{id = "clngdbkpkpeebahjckkjfobafhncgmne";} # stylus
+
{id = "oboonakemofpalcgghocfoadofidjkkk";} # keepassxc
+
{id = "jinjaccalgkegednnccohejagnlnfdag";} # violentmonkey
+
+
rec {
+
id = "libredirectlibredirectlibredirec"; # libredirect
+
version = "3.2.0";
+
+
crxPath = pkgs.fetchurl {
+
url = "https://github.com/libredirect/browser_extension/releases/download/v${version}/libredirect-${version}.crx";
+
sha256 = "sha256-Neja0pJ7rMV+riINeMcWxU2SzZ+ZETp6bV1MaYLHz1Y=";
+
};
+
}
+
];
+
+
package =
+
if pkgs.stdenv.isDarwin
+
then (pkgs.runCommand "chromium-0.0.0" {} "mkdir $out")
+
else pkgs.ungoogled-chromium;
+
};
+
};
+
}
+13
modules/home/programs/default.nix
···
+
{...}: {
+
imports = [
+
./zed-editor
+
./firefox
+
./chromium
+
./git
+
./obs-studio
+
./fastfetch
+
./mpv
+
./aria2
+
./micro
+
];
+
}
+13
modules/home/programs/fastfetch/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.fastfetch.enable = lib.mkEnableOption "fastfetch system information";
+
+
config = lib.mkIf config.myHome.programs.fastfetch.enable {
+
programs.fastfetch = {
+
enable = true;
+
};
+
};
+
}
+176
modules/home/programs/firefox/betterfox/fastfox.nix
···
+
{
+
# ****************************************************************************
+
# Fastfox
+
# "Non ducor duco"
+
# priority: speedy browsing
+
# version: 137
+
# url: https://github.com/yokoffing/Betterfox
+
# ****************************************************************************
+
+
#############################################################
+
# SECTION: GENERAL
+
#############################################################
+
+
# "nglayout.initialpaint.delay" = 5; # DEFAULT; formerly 250
+
# "nglayout.initialpaint.delay_in_oopif" = 5; # DEFAULT
+
# "content.notify.ontimer" = true; # DEFAULT
+
"content.notify.interval" = 100000; # (.10s); default=120000 (.12s)
+
+
# "browser.newtab.preload" = true; # DEFAULT
+
# "dom.ipc.processPriorityManager.backgroundUsesEcoQoS" = false;
+
# "browser.sessionstore.restore_on_demand" = true; # DEFAULT
+
# "browser.sessionstore.restore_pinned_tabs_on_demand" = true;
+
# "browser.sessionstore.restore_tabs_lazily" = true; # DEFAULT
+
# "browser.startup.preXulSkeletonUI" = false;
+
# "dom.iframe_lazy_loading.enabled" = true; # DEFAULT [FF121+]
+
+
#############################################################
+
# SECTION: GFX RENDERING TWEAKS
+
#############################################################
+
+
# "gfx.webrender.all" = true;
+
# "gfx.webrender.precache-shaders" = true;
+
# "gfx.webrender.compositor" = true;
+
# "gfx.webrender.compositor.force-enabled" = true;
+
# "gfx.webrender.software" = true;
+
# "gfx.webrender.software.opengl" = true;
+
# "gfx.canvas.accelerated" = true;
+
# "gfx.canvas.accelerated.cache-items" = 8192;
+
"gfx.canvas.accelerated.cache-size" = 512; # default=256; Chrome=512
+
"gfx.content.skia-font-cache-size" = 20; # default=5; Chrome=20
+
+
# "layers.gpu-process.enabled" = true; # DEFAULT WINDOWS
+
# "layers.gpu-process.force-enabled" = true;
+
# "layers.mlgpu.enabled" = true; # LINUX
+
# "media.hardware-video-decoding.enabled" = true; # DEFAULT WINDOWS macOS
+
# "media.hardware-video-decoding.force-enabled" = true;
+
# "media.gpu-process-decoder" = true; # DEFAULT WINDOWS
+
# "media.ffmpeg.vaapi.enabled" = true; # LINUX
+
+
#############################################################
+
# SECTION: DISK CACHE
+
#############################################################
+
+
"browser.cache.disk.enable" = false;
+
# "browser.cache.disk.smart_size.enabled" = false;
+
# "browser.cache.disk.capacity" = 512000;
+
# "browser.cache.disk.max_entry_size" = 51200;
+
+
# "network.http.rcwn.enabled" = false;
+
# "network.http.rcwn.small_resource_size_kb" = 256;
+
+
# "browser.cache.disk.metadata_memory_limit" = 500;
+
# "browser.cache.disk.preload_chunk_count" = 4;
+
# "browser.cache.frecency_half_life_hours" = 6;
+
# "browser.cache.disk.max_chunks_memory_usage" = 40960;
+
# "browser.cache.disk.max_priority_chunks_memory_usage" = 40960;
+
# "browser.cache.check_doc_frequency" = 3;
+
# "browser.cache.disk.free_space_soft_limit" = 10240;
+
# "browser.cache.disk.free_space_hard_limit" = 2048;
+
# "browser.cache.jsbc_compression_level" = 3;
+
# "dom.script_loader.bytecode_cache.enabled" = true;
+
# "dom.script_loader.bytecode_cache.strategy" = 0;
+
+
#############################################################
+
# SECTION: MEMORY CACHE
+
#############################################################
+
+
# "browser.cache.memory.capacity" = -1;
+
# "browser.cache.memory.max_entry_size" = 10240;
+
# "browser.sessionhistory.max_total_viewers" = 4;
+
+
#############################################################
+
# SECTION: MEDIA CACHE
+
#############################################################
+
+
"media.memory_cache_max_size" = 65536; # default=8192; AF=65536; alt=131072
+
# "media.memory_caches_combined_limit_kb" = 524288;
+
# "media.memory_caches_combined_limit_pc_sysmem" = 5;
+
# "media.mediasource.enabled" = true;
+
"media.cache_readahead_limit" = 7200; # 120 min; default=60
+
"media.cache_resume_threshold" = 3600; # 60 min; default=30
+
+
#############################################################
+
# SECTION: IMAGE CACHE
+
#############################################################
+
+
# "image.cache.size" = 5242880;
+
"image.mem.decode_bytes_at_a_time" = 32768; # default=16384; alt=65536
+
# "image.mem.shared.unmap.min_expiration_ms" = 120000;
+
+
#############################################################
+
# SECTION: NETWORK
+
#############################################################
+
+
# "network.buffer.cache.size" = 65535;
+
# "network.buffer.cache.count" = 48;
+
"network.http.max-connections" = 1800; # default=900
+
"network.http.max-persistent-connections-per-server" = 10; # default=6
+
"network.http.max-urgent-start-excessive-connections-per-host" = 5; # default=3
+
# "network.http.max-persistent-connections-per-proxy" = 48;
+
# "network.websocket.max-connections" = 200;
+
+
"network.http.pacing.requests.enabled" = false;
+
# "network.http.pacing.requests.min-parallelism" = 10;
+
# "network.http.pacing.requests.burst" = 14;
+
+
# "network.dnsCacheEntries" = 1000;
+
"network.dnsCacheExpiration" = 3600;
+
# "network.dnsCacheExpirationGracePeriod" = 240;
+
# "network.dns.max_high_priority_threads" = 40;
+
# "network.dns.max_any_priority_threads" = 24;
+
+
"network.ssl_tokens_cache_capacity" = 10240; # default=2048
+
+
#############################################################
+
# SECTION: SPECULATIVE LOADING
+
#############################################################
+
+
"network.dns.disablePrefetch" = true;
+
"network.dns.disablePrefetchFromHTTPS" = true; # [FF127+ false]
+
# "network.preconnect" = true;
+
# "browser.urlbar.speculativeConnect.enabled" = false;
+
# "browser.places.speculativeConnect.enabled" = false;
+
# "network.modulepreload" = true;
+
"network.prefetch-next" = false;
+
# "network.fetchpriority.enabled" = true;
+
# "network.early-hints.enabled" = true;
+
# "network.early-hints.preconnect.enabled" = true;
+
# "network.early-hints.preconnect.max_connections" = 10;
+
"network.predictor.enabled" = false;
+
# "network.predictor.enable-prefetch" = false;
+
# "network.predictor.enable-hover-on-ssl" = false;
+
# "network.predictor.preresolve-min-confidence" = 60;
+
# "network.predictor.preconnect-min-confidence" = 90;
+
# "network.predictor.prefetch-min-confidence" = 100;
+
# "network.predictor.prefetch-force-valid-for" = 10;
+
# "network.predictor.prefetch-rolling-load-count" = 10;
+
# "network.predictor.max-resources-per-entry" = 250;
+
# "network.predictor.max-uri-length" = 1000;
+
+
#############################################################
+
# SECTION: EXPERIMENTAL
+
#############################################################
+
+
"layout.css.grid-template-masonry-value.enabled" = true;
+
# "dom.enable_web_task_scheduling" = true;
+
+
#############################################################
+
# SECTION: TAB UNLOAD
+
#############################################################
+
+
# "browser.tabs.unloadOnLowMemory" = true;
+
# "browser.low_commit_space_threshold_mb" = 3276;
+
# "browser.low_commit_space_threshold_percent" = 20;
+
# "browser.tabs.min_inactive_duration_before_unload" = 300000;
+
+
#############################################################
+
# SECTION: PROCESS COUNT
+
#############################################################
+
+
# "dom.ipc.processCount" = 8;
+
# "dom.ipc.processCount.webIsolated" = 1;
+
# "dom.ipc.processPrelaunch.fission.number" = 1;
+
# "fission.webContentIsolationStrategy" = 1;
+
# "browser.preferences.defaultPerformanceSettings.enabled" = true;
+
}
+164
modules/home/programs/firefox/betterfox/peskyfox.nix
···
+
{
+
# ****************************************************************************
+
# Peskyfox
+
# "Aquila non capit muscas"
+
# priority: remove annoyances
+
# version: 137
+
# url: https://github.com/yokoffing/Betterfox
+
# credit: Some prefs are reproduced and adapted from the arkenfox project
+
# credit URL: https://github.com/arkenfox/user.js
+
# ****************************************************************************
+
+
#############################################################
+
# SECTION: MOZILLA UI
+
#############################################################
+
+
"browser.privatebrowsing.vpnpromourl" = "";
+
# "browser.vpn_promo.enabled" = false;
+
+
"extensions.getAddons.showPane" = false;
+
"extensions.htmlaboutaddons.recommendations.enabled" = false;
+
+
"browser.discovery.enabled" = false;
+
+
"browser.shell.checkDefaultBrowser" = false;
+
+
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false;
+
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false;
+
+
"browser.preferences.moreFromMozilla" = false;
+
+
"browser.aboutConfig.showWarning" = false;
+
+
"browser.aboutwelcome.enabled" = false;
+
# "browser.startup.homepage_override.mstone" = "ignore";
+
# "startup.homepage_welcome_url" = "";
+
# "startup.homepage_welcome_url.additional" = "";
+
# "startup.homepage_override_url" = "";
+
+
"browser.profiles.enabled" = true;
+
+
# "widget.gtk.non-native-titlebar-buttons.enabled" = true;
+
+
#############################################################
+
# SECTION: THEME ADJUSTMENTS
+
#############################################################
+
+
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+
"browser.compactmode.show" = true;
+
# "browser.theme.dark-private-windows" = false;
+
# "browser.search.widget.inNavBar" = true;
+
+
"layout.css.prefers-color-scheme.content-override" = 2;
+
+
"browser.privateWindowSeparation.enabled" = false;
+
+
#############################################################
+
# SECTION: COOKIE BANNER HANDLING
+
#############################################################
+
+
# "cookiebanners.service.mode" = 1;
+
# "cookiebanners.service.mode.privateBrowsing" = 1;
+
# "cookiebanners.service.enableGlobalRules" = true;
+
# "cookiebanners.service.enableGlobalRules.subFrames" = true;
+
+
#############################################################
+
# SECTION: TRANSLATIONS
+
#############################################################
+
+
# "browser.translations.enable" = true;
+
# "browser.translations.autoTranslate" = true;
+
+
#############################################################
+
# SECTION: FULLSCREEN NOTICE
+
#############################################################
+
+
"full-screen-api.transition-duration.enter" = "0 0";
+
"full-screen-api.transition-duration.leave" = "0 0";
+
+
"full-screen-api.warning.delay" = -1;
+
"full-screen-api.warning.timeout" = 0;
+
+
#############################################################
+
# SECTION: FONT APPEARANCE
+
#############################################################
+
+
# "gfx.webrender.quality.force-subpixel-aa-where-possible" = true;
+
# "gfx.font_rendering.cleartype_params.rendering_mode" = 5;
+
# "gfx.font_rendering.cleartype_params.cleartype_level" = 100;
+
# "gfx.font_rendering.cleartype_params.force_gdi_classic_for_families" = "";
+
# "gfx.font_rendering.directwrite.use_gdi_table_loading" = false;
+
# "gfx.font_rendering.cleartype_params.gamma" = 1750;
+
# "gfx.font_rendering.cleartype_params.enhanced_contrast" = 100;
+
# "gfx.font_rendering.cleartype_params.pixel_structure" = 1;
+
# "gfx.use_text_smoothing_setting" = true;
+
+
#############################################################
+
# SECTION: URL BAR
+
#############################################################
+
+
# "browser.urlbar.suggest.history" = false;
+
# "browser.urlbar.suggest.bookmark" = true;
+
# "browser.urlbar.suggest.clipboard" = false;
+
# "browser.urlbar.suggest.openpage" = false;
+
+
"browser.urlbar.suggest.engines" = false;
+
# "browser.urlbar.suggest.searches" = false;
+
+
# "browser.urlbar.quickactions.enabled" = false;
+
# "browser.urlbar.shortcuts.quickactions" = false;
+
# "browser.urlbar.suggest.weather" = true;
+
+
"browser.urlbar.unitConversion.enabled" = true;
+
"browser.urlbar.trending.featureGate" = false;
+
+
#############################################################
+
# SECTION: NEW TAB PAGE
+
#############################################################
+
+
# "browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled" = true;
+
+
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
+
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
+
"browser.newtabpage.activity-stream.showSponsored" = false;
+
+
"browser.newtabpage.activity-stream.default.sites" = "";
+
+
#############################################################
+
# SECTION: POCKET
+
#############################################################
+
+
"extensions.pocket.enabled" = false;
+
+
#############################################################
+
# SECTION: DOWNLOADS
+
#############################################################
+
+
# "browser.download.folderList" = 1;
+
# "browser.download.always_ask_before_handling_new_types" = true;
+
# "browser.download.useDownloadDir" = false;
+
# "browser.download.autohideButton" = true;
+
+
"browser.download.manager.addToRecentDocs" = false;
+
+
#############################################################
+
# SECTION: PDF
+
#############################################################
+
+
# "pdfjs.disabled" = false;
+
# "browser.helperApps.showOpenOptionForPdfJS" = true;
+
+
"browser.download.open_pdf_attachments_inline" = true;
+
+
#############################################################
+
# SECTION: TAB BEHAVIOR
+
#############################################################
+
+
# "browser.search.openintab" = true;
+
# "browser.urlbar.openintab" = true;
+
+
"browser.bookmarks.openInTabClosesMenu" = false;
+
"browser.menu.showViewImageInfo" = true;
+
"findbar.highlightAll" = true;
+
"layout.word_select.eat_space_to_next_word" = false;
+
}
+483
modules/home/programs/firefox/betterfox/securefox.nix
···
+
{
+
# ****************************************************************************
+
# Securefox
+
# "Natura non contristatur"
+
# priority: provide sensible security and privacy
+
# version: 137
+
# url: https://github.com/yokoffing/Betterfox
+
# credit: Most prefs are reproduced and adapted from the arkenfox project
+
# credit urL: https://github.com/arkenfox/user.js
+
# ****************************************************************************
+
+
#############################################################
+
# SECTION: TRACKING PROTECTION
+
#############################################################
+
+
## Enhanced Tracking Protection (ETP)
+
"browser.contentblocking.category" = "strict"; # [HIDDEN]
+
# "privacy.trackingprotection.enabled" = true; # enabled with "Strict"
+
# "privacy.trackingprotection.pbmode.enabled" = true; # DEFAULT
+
# "browser.contentblocking.customBlockList.preferences.ui.enabled" = false; # DEFAULT
+
# "privacy.trackingprotection.socialtracking.enabled" = true; # enabled with "Strict"
+
# "privacy.socialtracking.block_cookies.enabled" = true; # DEFAULT
+
# "privacy.trackingprotection.cryptomining.enabled" = true; # DEFAULT
+
# "privacy.trackingprotection.fingerprinting.enabled" = true; # DEFAULT
+
# "privacy.trackingprotection.emailtracking.enabled" = true; # enabled with "Strict"
+
# "network.http.referer.disallowCrossSiteRelaxingDefault" = true; # DEFAULT
+
# "network.http.referer.disallowCrossSiteRelaxingDefault.pbmode" = true; # DEFAULT
+
# "network.http.referer.disallowCrossSiteRelaxingDefault.pbmode.top_navigation" = true; # DEFAULT
+
# "network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation" = true; # enabled with "Strict"
+
# "privacy.annotate_channels.strict_list.enabled" = true; # enabled with "Strict"
+
# "privacy.annotate_channels.strict_list.pbmode.enabled" = true; # DEFAULT
+
# "privacy.fingerprintingProtection" = true; # [FF114+] [ETP FF119+] enabled with "Strict"
+
# "privacy.fingerprintingProtection.pbmode" = true; # DEFAULT
+
# "privacy.bounceTrackingProtection.mode" = 1; # [FF131+] [ETP FF133+]
+
+
## Query Stripping
+
# "privacy.query_stripping.enabled" = true; # enabled with "Strict"
+
# "privacy.query_stripping.enabled.pbmode" = true; # enabled with "Strict"
+
# "privacy.query_stripping.strip_list" = ""; # DEFAULT
+
# "privacy.query_stripping.strip_on_share.enabled" = true;
+
+
## Smartblock
+
# "extensions.webcompat.enable_shims" = true; # [HIDDEN] enabled with "Strict"
+
# "extensions.webcompat.smartblockEmbeds.enabled" = true; # enabled with "Strict"
+
+
## Embedded Social Content
+
# "urlclassifier.trackingSkipURLs" = "embed.reddit.com, *.twitter.com, *.twimg.com"; # MANUAL [FF136+]
+
# "urlclassifier.features.socialtracking.skipURLs" = "*.twitter.com, *.twimg.com"; # MANUAL [FF136+]
+
# "urlclassifier.trackingSkipURLs" = "*.reddit.com, *.twitter.com, *.twimg.com, *.tiktok.com"; # MANUAL
+
# "urlclassifier.features.socialtracking.skipURLs" = "*.instagram.com, *.twitter.com, *.twimg.com"; # MANUAL
+
+
## Lower Network Priority for Trackers
+
# "privacy.trackingprotection.lower_network_priority" = true;
+
+
## Site Isolation (Fission)
+
# "fission.autostart" = true; # DEFAULT [DO NOT TOUCH]
+
# "fission.webContentIsolationStrategy" = 1; # DEFAULT
+
+
## GPU Sandboxing [WINDOWS]
+
# "security.sandbox.gpu.level" = 1; # DEFAULT WINDOWS
+
+
## State Partitioning & Cookie Behavior
+
# "network.cookie.cookieBehavior" = 5; # DEFAULT FF103+
+
# "network.cookie.cookieBehavior.optInPartitioning" = true; # [ETP FF132+]
+
# "browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled" = true; # DEFAULT
+
+
## Network Partitioning
+
# "privacy.partition.network_state" = true; # DEFAULT
+
# "privacy.partition.serviceWorkers" = true; # DEFAULT: true FF105+
+
# "privacy.partition.network_state.ocsp_cache" = true; # DEFAULT: true FF123+
+
# "privacy.partition.bloburl_per_partition_key" = true; # FF118+
+
# "privacy.partition.always_partition_third_party_non_cookie_storage" = true; # DEFAULT: true FF109+
+
# "privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage" = false; # DEFAULT: false FF109+
+
+
## Redirect Tracking Prevention
+
# "privacy.purge_trackers.enabled" = true; # DEFAULT
+
+
## SameSite Cookies
+
# "network.cookie.sameSite.laxByDefault" = true;
+
# "network.cookie.sameSite.noneRequiresSecure" = true; # DEFAULT FF131+
+
# "network.cookie.sameSite.schemeful" = true;
+
+
## Hyperlink Auditing
+
# "browser.send_pings" = false; # DEFAULT
+
+
## Beacon API
+
# "beacon.enabled" = false;
+
+
## Battery Status API
+
# "dom.battery.enabled" = false;
+
+
## Temporary-File Handling
+
"browser.download.start_downloads_in_tmp_dir" = true; # [FF102+]
+
"browser.helperApps.deleteTempFileOnExit" = true;
+
+
## UITour
+
"browser.uitour.enabled" = false;
+
# "browser.uitour.url" = "";
+
+
## Remote Debugging
+
# "devtools.debugger.remote-enabled" = false; # DEFAULT
+
+
## Global Privacy Control (GPC)
+
"privacy.globalprivacycontrol.enabled" = true;
+
# "privacy.globalprivacycontrol.functionality.enabled" = true; # [FF120+]
+
# "privacy.globalprivacycontrol.pbmode.enabled" = true; # [FF120+]
+
+
#############################################################
+
# SECTION: OSCP & CERTS / HPKP
+
#############################################################
+
+
## OCSP
+
"security.OCSP.enabled" = 0;
+
# "security.OCSP.require" = true;
+
+
## CRLite
+
# "security.remote_settings.crlite_filters.enabled" = true; # DEFAULT: true FF137+
+
"security.pki.crlite_mode" = 2;
+
+
## HPKP
+
# "security.cert_pinning.enforcement_level" = 2;
+
+
## Enterprise Roots
+
# "security.enterprise_roots.enabled" = false;
+
# "security.certerrors.mitm.auto_enable_enterprise_roots" = false;
+
+
## DLP Content Analysis
+
# "browser.contentanalysis.enabled" = false; # [FF121+] [DEFAULT]
+
# "browser.contentanalysis.default_result" = 0; # [FF127+] [DEFAULT]
+
+
#############################################################
+
# SECTION: SSL / TLS
+
#############################################################
+
+
"security.ssl.treat_unsafe_negotiation_as_broken" = true;
+
# "security.ssl.require_safe_negotiation" = true;
+
+
"browser.xul.error_pages.expert_bad_cert" = true;
+
"security.tls.enable_0rtt_data" = false;
+
# "security.tls.enable_kyber" = true;
+
# "network.http.http3.enable_kyber" = true;
+
+
#############################################################
+
# SECTION: FINGERPRINT PROTECTION (FPP)
+
#############################################################
+
+
# "privacy.resistFingerprinting.randomization.daily_reset.enabled" = true;
+
# "privacy.resistFingerprinting.randomization.daily_reset.private.enabled" = true;
+
+
#############################################################
+
# SECTION: RESIST FINGERPRINTING (RFP)
+
#############################################################
+
+
# "privacy.resistFingerprinting" = true;
+
# "privacy.window.maxInnerWidth" = 1600;
+
# "privacy.window.maxInnerHeight" = 900;
+
# "browser.startup.blankWindow" = false;
+
# "browser.display.use_system_colors" = false;
+
+
#############################################################
+
# SECTION: DISK AVOIDANCE
+
#############################################################
+
+
"browser.privatebrowsing.forceMediaMemoryCache" = true;
+
"browser.sessionstore.interval" = 60000; # 1 min; default=15000
+
+
# "browser.sessionstore.privacy_level" = 2;
+
# "toolkit.winRegisterApplicationRestart" = false;
+
# "browser.shell.shortcutFavicons" = false;
+
# "browser.helperApps.deleteTempFileOnExit" = true;
+
# "browser.pagethumbnails.capturing_disabled" = true;
+
+
#############################################################
+
# SECTION: SANITIZE HISTORY
+
#############################################################
+
+
# "privacy.sanitize.timeSpan" = 0;
+
# "privacy.clearSiteData.cache" = true;
+
# "privacy.clearSiteData.cookiesAndStorage" = false;
+
# "privacy.clearSiteData.historyFormDataAndDownloads" = true;
+
"browser.privatebrowsing.resetPBM.enabled" = true;
+
+
#############################################################
+
# SECTION: SHUTDOWN & SANITIZING
+
#############################################################
+
+
"privacy.history.custom" = true;
+
# "privacy.sanitize.sanitizeOnShutdown" = true;
+
# "privacy.clearOnShutdown.cache" = true;
+
# "privacy.clearOnShutdown_v2.cache" = true;
+
# "privacy.clearOnShutdown.downloads" = true;
+
# "privacy.clearOnShutdown.formdata" = true;
+
# "privacy.clearOnShutdown.history" = true;
+
# "privacy.clearOnShutdown_v2.historyFormDataAndDownloads" = true;
+
# "privacy.clearOnShutdown.siteSettings" = false;
+
# "privacy.clearOnShutdown_v2.siteSettings" = false;
+
# "privacy.clearOnShutdown.cookies" = true;
+
# "privacy.clearOnShutdown.offlineApps" = true;
+
# "privacy.clearOnShutdown.sessions" = true;
+
# "privacy.clearOnShutdown_v2.cookiesAndStorage" = true;
+
# "privacy.clearOnShutdown.openWindows" = true;
+
+
#############################################################
+
# SECTION: SEARCH / URL BAR
+
#############################################################
+
+
# "browser.urlbar.trimURLs" = true;
+
"browser.urlbar.trimHttps" = true;
+
"browser.urlbar.untrimOnUserInteraction.featureGate" = true;
+
# "security.insecure_connection_text.enabled" = true;
+
# "security.insecure_connection_text.pbmode.enabled" = true;
+
+
# "browser.search.separatePrivateDefault.ui.enabled" = true;
+
# "browser.search.separatePrivateDefault" = true;
+
+
"browser.urlbar.update2.engineAliasRefresh" = true;
+
"browser.search.suggest.enabled" = false;
+
# "browser.search.suggest.enabled.private" = false;
+
+
"browser.urlbar.quicksuggest.enabled" = false;
+
# "browser.urlbar.suggest.quicksuggest.sponsored" = false;
+
# "browser.urlbar.suggest.quicksuggest.nonsponsored" = false;
+
+
"browser.urlbar.groupLabels.enabled" = false;
+
"browser.formfill.enable" = false;
+
+
# "browser.fixup.alternate.enabled" = false;
+
# "browser.urlbar.autoFill" = false;
+
"network.IDN_show_punycode" = true;
+
+
#############################################################
+
# SECTION: HTTPS-FIRST POLICY
+
#############################################################
+
+
# "dom.security.https_first" = true;
+
# "dom.security.https_first_pbm" = true;
+
# "dom.security.https_first_schemeless" = true;
+
+
#############################################################
+
# SECTION: HTTPS-ONLY MODE
+
#############################################################
+
+
# "dom.security.https_only_mode_pbm" = true;
+
# "dom.security.https_only_mode" = true;
+
# "dom.security.https_only_mode_error_page_user_suggestions" = true;
+
# "dom.security.https_only_mode_send_http_background_request" = true;
+
# "dom.security.https_only_fire_http_request_background_timer_ms" = 3000;
+
# "dom.security.https_only_mode.upgrade_local" = false;
+
+
#############################################################
+
# SECTION: DNS-over-HTTPS
+
#############################################################
+
+
# "network.trr.mode" = 0;
+
# "network.trr.max-fails" = 5;
+
# "network.trr_ui.show_fallback_warning_option" = false;
+
# "network.trr.display_fallback_warning" = false;
+
# "network.trr.uri" = "https://xxxx/dns-query";
+
# "network.trr.custom_uri" = "https://xxxx/dns-query";
+
# "network.trr.bootstrapAddr" = "10.0.0.1";
+
# "network.trr.resolvers" = '[{"name":"Cloudflare","url":"https://mozilla.cloudflare-dns.com/dns-query"}, …]';
+
# "network.trr.disable-ECS" = true;
+
# "network.trr.allow-rfc1918" = false;
+
# "network.trr.confirmationNS" = "skip";
+
# "network.trr.skip-AAAA-when-not-supported" = true;
+
# "network.trr.clear-cache-on-pref-change" = true;
+
# "network.trr.wait-for-portal" = false;
+
# "network.trr.excluded-domains" = "";
+
# "network.trr.builtin-excluded-domains" = "localhost,local";
+
# "network.trr.ohttp.config_uri" = "https://dooh.cloudflare-dns.com/.well-known/doohconfig";
+
# "network.trr.ohttp.uri" = "https://dooh.cloudflare-dns.com/dns-query";
+
# "network.trr.ohttp.relay_uri" = "";
+
# "network.trr.use_ohttp" = true;
+
# "network.dns.echconfig.enabled" = true;
+
# "network.dns.http3_echconfig.enabled" = true;
+
# "network.dns.echconfig.fallback_to_origin_when_all_failed" = false;
+
+
#############################################################
+
# SECTION: PROXY / SOCKS / IPv6
+
#############################################################
+
+
# "network.dns.disableIPv6" = true;
+
# "network.proxy.socks_remote_dns" = true;
+
# "network.file.disable_unc_paths" = true;
+
# "network.gio.supported-protocols" = "";
+
# "network.notify.checkForProxies" = false;
+
+
#############################################################
+
# SECTION: PASSWORDS
+
#############################################################
+
+
# "signon.rememberSignons" = false;
+
# "signon.schemeUpgrades" = true;
+
# "signon.showAutoCompleteFooter" = true;
+
# "signon.autologin.proxy" = false;
+
+
# "signon.autofillForms" = false;
+
# "signon.autofillForms.autocompleteOff" = true;
+
"signon.formlessCapture.enabled" = false;
+
"signon.privateBrowsingCapture.enabled" = false;
+
# "signon.autofillForms.http" = false;
+
# "signon.generation.enabled" = false;
+
# "signon.management.page.breach-alerts.enabled" = false;
+
# "signon.management.page.breachAlertUrl" = "";
+
# "browser.contentblocking.report.lockwise.enabled" = false;
+
# "signon.firefoxRelay.feature" = "";
+
# "signon.storeWhenAutocompleteOff" = false;
+
"network.auth.subresource-http-auth-allow" = 1;
+
"editor.truncate_user_pastes" = false;
+
# "layout.forms.reveal-password-context-menu.enabled" = true;
+
# "layout.forms.reveal-password-button.enabled" = true;
+
+
#############################################################
+
# SECTION: ADDRESS + CREDIT CARD MANAGER
+
#############################################################
+
+
# "extensions.formautofill.addresses.enabled" = false;
+
# "extensions.formautofill.creditCards.enabled" = false;
+
+
#############################################################
+
# SECTION: MIXED CONTENT + CROSS-SITE
+
#############################################################
+
+
"security.mixed_content.block_display_content" = true;
+
"pdfjs.enableScripting" = false;
+
# "browser.tabs.searchclipboardfor.middleclick" = false;
+
# "network.http.windows-sso.enabled" = false;
+
+
#############################################################
+
# SECTION: EXTENSIONS
+
#############################################################
+
+
"extensions.enabledScopes" = 5;
+
# "extensions.autoDisableScopes" = 15;
+
# "extensions.postDownloadThirdPartyPrompt" = false;
+
# "privacy.resistFingerprinting.block_mozAddonManager" = true;
+
# "extensions.webextensions.restrictedDomains" = "";
+
# "xpinstall.signatures.required" = false;
+
# "extensions.quarantinedDomains.enabled" = false;
+
+
#############################################################
+
# SECTION: HEADERS / REFERERS
+
#############################################################
+
+
# "network.http.referer.defaultPolicy" = 2;
+
# "network.http.referer.defaultPolicy.pbmode" = 2;
+
# "network.http.referer.defaultPolicy.trackers" = 1;
+
# "network.http.referer.defaultPolicy.trackers.pbmode" = 1;
+
# "network.http.sendRefererHeader" = 2;
+
# "network.http.referer.XOriginPolicy" = 0;
+
"network.http.referer.XOriginTrimmingPolicy" = 2;
+
+
#############################################################
+
# SECTION: CONTAINERS
+
#############################################################
+
+
"privacy.userContext.ui.enabled" = true;
+
# "privacy.userContext.enabled" = true;
+
# "privacy.userContext.newTabContainerOnLeftClick.enabled" = true;
+
# "browser.link.force_default_user_context_id_for_external_opens" = true;
+
+
#############################################################
+
# SECTION: WEBRTC
+
#############################################################
+
+
# "media.peerconnection.enabled" = false;
+
# "privacy.webrtc.globalMuteToggles" = true;
+
# "media.peerconnection.ice.proxy_only_if_behind_proxy" = true;
+
# "media.peerconnection.ice.default_address_only" = true;
+
# "media.peerconnection.ice.no_host" = true;
+
+
#############################################################
+
# SECTION: PLUGINS
+
#############################################################
+
+
# "media.gmp-provider.enabled" = false;
+
# "media.gmp-widevinecdm.enabled" = false;
+
# "media.eme.enabled" = false;
+
# "browser.eme.ui.enabled" = false;
+
+
#############################################################
+
# SECTION: VARIOUS
+
#############################################################
+
+
# "browser.urlbar.decodeURLsOnCopy" = false;
+
# "devtools.selfxss.count" = 5;
+
# "javascript.options.asmjs" = false;
+
# "javascript.options.ion" = false;
+
# "javascript.options.baselinejit" = false;
+
# "javascript.options.jit_trustedprincipals" = true;
+
# "javascript.options.wasm" = false;
+
+
#############################################################
+
# SECTION: SAFE BROWSING (SB)
+
#############################################################
+
+
# "browser.safebrowsing.malware.enabled" = false;
+
# "browser.safebrowsing.phishing.enabled" = false;
+
# "browser.safebrowsing.blockedURIs.enabled" = false;
+
# "browser.safebrowsing.provider.google4.gethashURL" = "";
+
# "browser.safebrowsing.provider.google4.updateURL" = "";
+
# "browser.safebrowsing.provider.google.gethashURL" = "";
+
# "browser.safebrowsing.provider.google.updateURL" = "";
+
# "browser.safebrowsing.downloads.enabled" = false;
+
"browser.safebrowsing.downloads.remote.enabled" = false;
+
# "browser.safebrowsing.downloads.remote.url" = "";
+
# "browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
+
# "browser.safebrowsing.downloads.remote.block_uncommon" = false;
+
# "browser.safebrowsing.allowOverride" = true;
+
+
#############################################################
+
# SECTION: MOZILLA
+
#############################################################
+
+
# "accessibility.force_disabled" = 1;
+
# "devtools.accessibility.enabled" = false;
+
# "identity.fxaccounts.enabled" = false;
+
# "identity.fxaccounts.autoconfig.uri" = "";
+
+
#############################################################
+
# SECTION: TELEMETRY
+
#############################################################
+
+
"datareporting.policy.dataSubmissionEnabled" = false;
+
"datareporting.healthreport.uploadEnabled" = false;
+
"toolkit.telemetry.unified" = false;
+
"toolkit.telemetry.enabled" = false;
+
"toolkit.telemetry.server" = "data:,";
+
"toolkit.telemetry.archive.enabled" = false;
+
"toolkit.telemetry.newProfilePing.enabled" = false;
+
"toolkit.telemetry.shutdownPingSender.enabled" = false;
+
"toolkit.telemetry.updatePing.enabled" = false;
+
"toolkit.telemetry.bhrPing.enabled" = false;
+
"toolkit.telemetry.firstShutdownPing.enabled" = false;
+
# "toolkit.telemetry.dap_enabled" = false;
+
"toolkit.telemetry.coverage.opt-out" = true;
+
"toolkit.coverage.opt-out" = true;
+
"toolkit.coverage.endpoint.base" = "";
+
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
+
"browser.newtabpage.activity-stream.telemetry" = false;
+
# "datareporting.usage.uploadEnabled" = false;
+
+
#############################################################
+
# SECTION: EXPERIMENTS
+
#############################################################
+
+
"app.shield.optoutstudies.enabled" = false;
+
"app.normandy.enabled" = false;
+
"app.normandy.api_url" = "";
+
+
#############################################################
+
# SECTION: CRASH REPORTS
+
#############################################################
+
+
"breakpad.reportURL" = "";
+
"browser.tabs.crashReporting.sendReport" = false;
+
# "browser.crashReports.unsubmittedCheck.enabled" = false;
+
+
#############################################################
+
# SECTION: DETECTION
+
#############################################################
+
+
"captivedetect.canonicalURL" = "";
+
"network.captive-portal-service.enabled" = false;
+
"network.connectivity-service.enabled" = false;
+
# "dom.private-attribution.submission.enabled" = false;
+
# "toolkit.telemetry.dap_helper" = "";
+
# "toolkit.telemetry.dap_leader" = "";
+
# "default-browser-agent.enabled" = false;
+
# "extensions.abuseReport.enabled" = false;
+
# "browser.search.serpEventTelemetryCategorization.enabled" = false;
+
# "doh-rollout.disable-heuristics" = true;
+
# "dom.security.unexpected_system_load_telemetry_enabled" = false;
+
# "messaging-system.rsexperimentloader.enabled" = false;
+
# "network.trr.confirmation_telemetry_enabled" = false;
+
# "security.app_menu.recordEventTelemetry" = false;
+
# "security.certerrors.mitm.priming.enabled" = false;
+
# "security.certerrors.recordEventTelemetry" = false;
+
# "security.protectionspopup.recordEventTelemetry" = false;
+
# "signon.recipes.remoteRecipes.enabled" = false;
+
# "privacy.trackingprotection.emailtracking.data_collection.enabled" = false;
+
# "messaging-system.askForFeedback" = true; # DEFAULT [FF120+]
+
}
+97
modules/home/programs/firefox/betterfox/smoothfox.nix
···
+
{
+
# ********************************************************************************
+
# Smoothfox
+
# "Faber est suae quisque fortunae"
+
# priority: better scrolling
+
# version: 137
+
# url: https://github.com/yokoffing/Betterfox
+
# ********************************************************************************
+
+
#############################################################
+
# OPTION: SHARPEN SCROLLING
+
#############################################################
+
+
# # DEFAULT NON-LINUX: apz.overscroll.enabled = true;
+
# "apz.overscroll.enabled" = true;
+
+
# # DEFAULT: general.smoothScroll = true;
+
# "general.smoothScroll" = true;
+
+
# # default=5
+
# "mousewheel.min_line_scroll_amount" = 10;
+
+
# # default=50
+
# "general.smoothScroll.mouseWheel.durationMinMS" = 80;
+
+
# # default=.25
+
# "general.smoothScroll.currentVelocityWeighting" = "0.15";
+
+
# # default=.4
+
# "general.smoothScroll.stopDecelerationWeighting" = "0.6";
+
+
# # [FF122+ Nightly default]=true
+
# "general.smoothScroll.msdPhysics.enabled" = false;
+
+
#############################################################
+
# OPTION: INSTANT SCROLLING (SIMPLE ADJUSTMENT)
+
#############################################################
+
+
# # DEFAULT NON-LINUX: apz.overscroll.enabled = true;
+
# "apz.overscroll.enabled" = true;
+
+
# # DEFAULT: general.smoothScroll = true;
+
# "general.smoothScroll" = true;
+
+
# # 250–400; adjust to your liking
+
# "mousewheel.default.delta_multiplier_y" = 275;
+
+
# # [FF122+ Nightly default]=true
+
# "general.smoothScroll.msdPhysics.enabled" = false;
+
+
#############################################################
+
# OPTION: SMOOTH SCROLLING
+
#############################################################
+
+
# # DEFAULT NON-LINUX: apz.overscroll.enabled = true;
+
# "apz.overscroll.enabled" = true;
+
+
# # DEFAULT: general.smoothScroll = true;
+
# "general.smoothScroll" = true;
+
+
# # [FF122+ Nightly default]=true
+
# "general.smoothScroll.msdPhysics.enabled" = true;
+
+
# # 250–400; adjust to your liking
+
# "mousewheel.default.delta_multiplier_y" = 300;
+
+
#############################################################
+
# OPTION: NATURAL SMOOTH SCROLLING V3 [MODIFIED]
+
#############################################################
+
+
# DEFAULT NON-LINUX: apz.overscroll.enabled = true;
+
"apz.overscroll.enabled" = true;
+
+
# DEFAULT: general.smoothScroll = true;
+
"general.smoothScroll" = true;
+
+
# control rate of continuous-motion updates
+
#"general.smoothScroll.msdPhysics.continuousMotionMaxDeltaMS" = 12;
+
+
# [FF122+ Nightly default]=true
+
#"general.smoothScroll.msdPhysics.enabled" = true;
+
#
+
#"general.smoothScroll.msdPhysics.motionBeginSpringConstant" = 600;
+
#"general.smoothScroll.msdPhysics.regularSpringConstant" = 650;
+
#"general.smoothScroll.msdPhysics.slowdownMinDeltaMS" = 25;
+
## ratio; default undefined
+
#"general.smoothScroll.msdPhysics.slowdownMinDeltaRatio" = "2";
+
#"general.smoothScroll.msdPhysics.slowdownSpringConstant" = 250;
+
#
+
## default=.25
+
#"general.smoothScroll.currentVelocityWeighting" = "1";
+
## default=.4
+
#"general.smoothScroll.stopDecelerationWeighting" = "1";
+
#
+
## 250–400; adjust to your liking
+
#"mousewheel.default.delta_multiplier_y" = 300;
+
}
+110
modules/home/programs/firefox/default.nix
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: let
+
engines = import ./engines.nix;
+
in {
+
options.myHome.programs.firefox.enable = lib.mkEnableOption "firefox web browser";
+
+
config = lib.mkIf config.myHome.programs.firefox.enable {
+
programs.firefox = {
+
enable = true;
+
languagePacks = [
+
"en-GB"
+
"en"
+
"en-US"
+
];
+
+
profiles = {
+
default = {
+
id = 0;
+
isDefault = true;
+
+
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
+
consent-o-matic
+
ublock-origin
+
aria2-integration
+
adaptive-tab-bar-colour
+
keepassxc-browser
+
libredirect
+
stylus
+
violentmonkey
+
ublacklist
+
steam-database
+
snowflake
+
sponsorblock
+
search-by-image
+
ff2mpv
+
];
+
+
search = {
+
inherit engines;
+
default = "Unduck";
+
force = true;
+
+
order = [
+
"Unduck"
+
"Home Manager Options"
+
"NixOS Wiki"
+
"nixpkgs"
+
"Wikipedia"
+
"Wiktionary"
+
];
+
};
+
+
settings =
+
(import ./betterfox/fastfox.nix)
+
// (import ./betterfox/peskyfox.nix)
+
// (import ./betterfox/securefox.nix)
+
// (import ./betterfox/smoothfox.nix)
+
// {
+
"browser.tabs.groups.enabled" = true;
+
"browser.tabs.groups.smart.enabled" = true;
+
"browser.toolbars.bookmarks.visibility" = "newtab";
+
"svg.context-properties.content.enabled" = true;
+
"browser.uidensity" = 1;
+
"general.autoScroll" = true;
+
"ui.key.menuAccessKeyFocuses" = false;
+
"browser.search.separatePrivateDefault" = false;
+
+
"media.videocontrols.picture-in-picture.video-toggle.enabled" = false;
+
"browser.safebrowsing.malware.enabled" = false;
+
"browser.safebrowsing.phishing.enabled" = false;
+
"browser.safebrowsing.blockedURIs.enabled" = false;
+
"browser.safebrowsing.provider.google4.gethashURL" = "";
+
"browser.safebrowsing.provider.google4.updateURL" = "";
+
"browser.safebrowsing.provider.google.gethashURL" = "";
+
"browser.safebrowsing.provider.google.updateURL" = "";
+
"browser.safebrowsing.downloads.enabled" = false;
+
"browser.safebrowsing.downloads.remote.enabled" = false;
+
"browser.safebrowsing.downloads.remote.url" = "";
+
"browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
+
"browser.safebrowsing.downloads.remote.block_uncommon" = false;
+
"browser.safebrowsing.allowOverride" = true;
+
};
+
+
userContent = ''
+
@font-face {
+
font-family: "Segoe UI";
+
src: url("${pkgs.roboto-flex}/share/fonts/truetype/RobotoFlex[GRAD,XOPQ,XTRA,YOPQ,YTAS,YTDE,YTFI,YTLC,YTUC,opsz,slnt,wdth,wght].ttf");
+
}
+
@font-face {
+
font-family: "system-ui";
+
src: url("${pkgs.roboto-flex}/share/fonts/truetype/RobotoFlex[GRAD,XOPQ,XTRA,YOPQ,YTAS,YTDE,YTFI,YTLC,YTUC,opsz,slnt,wdth,wght].ttf");
+
}
+
@font-face {
+
font-family: "-apple-system";
+
src: url("${pkgs.roboto-flex}/share/fonts/truetype/RobotoFlex[GRAD,XOPQ,XTRA,YOPQ,YTAS,YTDE,YTFI,YTLC,YTUC,opsz,slnt,wdth,wght].ttf");
+
}
+
@font-face {
+
font-family: "BlinkMacSystemFont";
+
src: url("${pkgs.roboto-flex}/share/fonts/truetype/RobotoFlex[GRAD,XOPQ,XTRA,YOPQ,YTAS,YTDE,YTFI,YTLC,YTUC,opsz,slnt,wdth,wght].ttf");
+
}
+
'';
+
};
+
};
+
};
+
};
+
}
+91
modules/home/programs/firefox/engines.nix
···
+
{
+
"Unduck" = {
+
icon = "https://unducking.pages.dev/search.svg";
+
+
urls = [
+
{
+
template = "https://unducking.pages.dev/?q={searchTerms}&d=ddg";
+
}
+
];
+
};
+
+
"Home Manager Options" = {
+
icon = "https://home-manager-options.extranix.com/images/favicon.png";
+
definedAliases = ["!hm"];
+
+
urls = [
+
{
+
template = "https://home-manager-options.extranix.com/?release=master&query={searchTerms}";
+
}
+
];
+
};
+
+
"NixOS Wiki" = {
+
definedAliases = [
+
"!nw"
+
"!nixwiki"
+
];
+
icon = "https://wiki.nixos.org/favicon.ico";
+
updateInterval = 24 * 60 * 60 * 1000; # every day
+
metaData.hidden = true;
+
+
urls = [
+
{
+
template = "https://wiki.nixos.org/w/index.php?search={searchTerms}";
+
}
+
];
+
};
+
+
"nixpkgs" = {
+
definedAliases = ["!nix"];
+
icon = "https://search.nixos.org/favicon.png";
+
+
urls = [
+
{
+
template = "https://search.nixos.org/packages";
+
params = [
+
{
+
name = "type";
+
value = "packages";
+
}
+
{
+
name = "query";
+
value = "{searchTerms}";
+
}
+
];
+
}
+
];
+
};
+
+
"Wiktionary" = {
+
definedAliases = ["!wikt"];
+
icon = "https://en.wiktionary.org/favicon.ico";
+
updateInterval = 24 * 60 * 60 * 1000; # every day
+
+
urls = [
+
{
+
template = "https://en.wiktionary.org/wiki/{searchTerms}";
+
}
+
];
+
};
+
+
"bing" = {
+
metaData = {
+
hidden = true;
+
};
+
};
+
+
"ddg" = {
+
metaData = {
+
hidden = true;
+
alias = "!ddg";
+
};
+
};
+
+
"google" = {
+
metaData = {
+
hidden = true;
+
alias = "!google";
+
};
+
};
+
}
+26
modules/home/programs/git/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.git.enable = lib.mkEnableOption "git version control";
+
+
config = lib.mkIf config.myHome.programs.git.enable {
+
programs.git = {
+
enable = true;
+
userName = "ayla";
+
userEmail = "ayla-git.barcode041@silomails.com";
+
extraConfig = {
+
color.ui = true;
+
github.user = "ayla6";
+
init = {
+
defaultBranch = "main";
+
};
+
push = {
+
autoSetupRemote = true;
+
default = "current";
+
};
+
};
+
};
+
};
+
}
+20
modules/home/programs/micro/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.micro.enable = lib.mkEnableOption "micro editor";
+
+
config = lib.mkIf config.myHome.programs.micro.enable {
+
programs.micro = {
+
enable = true;
+
settings = {
+
colorscheme = "simple";
+
mkparents = true;
+
scrollspeed = 1;
+
tabsize = 2;
+
tabstospaces = true;
+
};
+
};
+
};
+
}
+213
modules/home/programs/mpv/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.mpv.enable = lib.mkEnableOption "mpv";
+
+
config = lib.mkIf config.myHome.programs.mpv.enable {
+
programs.mpv = {
+
enable = true;
+
scripts = with pkgs.mpvScripts; [
+
uosc
+
sponsorblock-minimal
+
thumbfast
+
eisa01.simplehistory
+
eisa01.smart-copy-paste-2
+
autoload
+
];
+
config = {
+
# Video output and rendering
+
vo = "gpu-next";
+
hwdec = "vaapi";
+
dither-depth = "auto";
+
+
# Window and display
+
osd-bar = false;
+
border = false;
+
geometry = "50%:50%";
+
autofit-larger = "1280x720";
+
keep-open = true;
+
reset-on-next-file = "video-rotate,video-zoom,panscan";
+
+
# Debanding
+
deband = false;
+
deband-iterations = 2;
+
deband-threshold = 64;
+
deband-range = 17;
+
deband-grain = 12;
+
+
# OSD and fonts
+
osd-font = "Roboto Flex";
+
+
# Audio and subtitle languages
+
alang = "ja,jp,jpn,en,eng";
+
slang = "en,eng,pt-br,br,pt";
+
+
# Subtitle settings
+
demuxer-mkv-subtitle-preroll = true;
+
sub-fix-timing = false;
+
sub-auto = "fuzzy";
+
sub-scale = 0.5;
+
sub-font = "Roboto";
+
+
# Screenshot settings
+
screenshot-format = "png";
+
screenshot-high-bit-depth = false;
+
screenshot-png-compression = 3;
+
screenshot-directory = "~/Pictures/mpv-screenshots";
+
screenshot-template = "%wH.%wM.%wS.%wT-#%#00n";
+
+
# YouTube-dl format
+
ytdl-format = "bv*[vcodec^=vp9][height<=?1080][vcodec!=av01]+ba/best";
+
};
+
profiles = {
+
video = {
+
profile-cond = "not get('current-tracks/video/image') and not get('current-tracks/video/albumart')";
+
correct-downscaling = true;
+
linear-downscaling = false;
+
sigmoid-upscaling = true;
+
};
+
"protocol.http" = {
+
hls-bitrate = "max";
+
cache = true;
+
no-cache-pause = true;
+
};
+
"protocol.https" = {
+
hls-bitrate = "max";
+
cache = true;
+
no-cache-pause = true;
+
};
+
"image-hq" = {
+
profile-cond = "get('current-tracks/video/image') and width < 10000";
+
profile-restore = "copy";
+
scale = "spline36";
+
cscale = "spline36";
+
dscale = "mitchell";
+
dither-depth = "auto";
+
correct-downscaling = true;
+
sigmoid-upscaling = true;
+
};
+
};
+
+
bindings = {
+
# VIDEO
+
d = "cycle deband";
+
D = "cycle deinterlace";
+
n = "cycle video-unscaled";
+
C = "cycle-values video-aspect-override \"16:9\" \"4:3\" \"2.35:1\" \"-1\""; # cycle the video aspect ratio ("-1" is the container aspect)
+
+
# increase subtitle font size
+
"ALT+e" = "add sub-scale +0.1";
+
+
# decrease subtitle font size
+
"ALT+n" = "add sub-scale -0.1";
+
+
m = "cycle ao-mute";
+
+
"Ctrl+q" = "script-binding pickshader";
+
+
# IMAGES
+
"SPACE" = "{image} repeatable playlist-next force";
+
"]" = "{image} no-osd add playlist-pos 10";
+
"[" = "{image} no-osd add playlist-pos -10";
+
+
# pan-image is a wrapper around altering video-align that pans
+
# relatively to the window's dimensions instead of the image's.
+
# +1 scrolls one screen width/height.
+
h = "{image} repeatable script-message pan-image x -.33";
+
j = "{image} repeatable script-message pan-image y +.33";
+
k = "{image} repeatable script-message pan-image y -.33";
+
l = "{image} repeatable script-message pan-image x +.33";
+
LEFT = "{image} repeatable script-message pan-image x -.33";
+
DOWN = "{image} repeatable script-message pan-image y +.33";
+
UP = "{image} repeatable script-message pan-image y -.33";
+
RIGHT = "{image} repeatable script-message pan-image x +.33";
+
H = "{image} repeatable script-message pan-image x -.033";
+
J = "{image} repeatable script-message pan-image y +.033";
+
K = "{image} repeatable script-message pan-image y -.033";
+
L = "{image} repeatable script-message pan-image x +.033";
+
"Shift+LEFT" = "{image} repeatable script-message pan-image x -.033";
+
"Shift+DOWN" = "{image} repeatable script-message pan-image y +.033";
+
"Shift+UP" = "{image} repeatable script-message pan-image y -.033";
+
"Shift+RIGHT" = "{image} repeatable script-message pan-image x +.033";
+
"Ctrl+h" = "{image} no-osd set video-align-x -1";
+
"Ctrl+j" = "{image} no-osd set video-align-y 1";
+
"Ctrl+k" = "{image} no-osd set video-align-y -1";
+
"Ctrl+l" = "{image} no-osd set video-align-x 1";
+
"Ctrl+LEFT" = "{image} no-osd set video-align-x -1";
+
"Ctrl+DOWN" = "{image} no-osd set video-align-y 1";
+
"Ctrl+UP" = "{image} no-osd set video-align-y -1";
+
"Ctrl+RIGHT" = "{image} no-osd set video-align-x 1";
+
+
"9" = "{image} add video-zoom +.25"; # easier to reach than =
+
"-" = "{image} add video-zoom -.25";
+
"(" = "{image} add video-zoom +.05";
+
"_" = "{image} add video-zoom -.05";
+
"0" = "{image} no-osd set video-zoom 0; no-osd set panscan 0";
+
+
# Toggle scaling the image to the window.
+
u = "{image} no-osd cycle-values video-unscaled yes no; no-osd set video-zoom 0; no-osd set panscan 0";
+
# cycle video-unscaled will also cycle through downscale-big.
+
# autofit=100%x100% makes the window bigger than necessary with downscale-big
+
# though so you may want to replace it with autofit-larger=100%x100%
+
+
# panscan crops scaled videos with different aspect ratio than the window.
+
# At 1 it fills black bars completely.
+
o = "{image} no-osd set panscan 1; no-osd set video-unscaled no; no-osd set video-zoom 0";
+
+
# Toggle slideshow mode.
+
s = "{image} cycle-values image-display-duration 5 inf; no-osd set video-zoom 0; no-osd set panscan 0; no-osd set video-unscaled no";
+
+
# Compare the image quality with and without profile=gpu-hq.
+
"Ctrl+a" = "{image} apply-profile image-hq restore";
+
a = "{image} apply-profile image-hq";
+
+
# This mouse gesture executes one of 5 commands configured in
+
# script-opts/image_bindings.conf depending on the direction you drag the
+
# mouse. To use it without an input section you need window-dragging=no in
+
# mpv.conf.
+
MBTN_LEFT = "{image} script-binding gesture";
+
MBTN_LEFT_DBL = "{image} ignore";
+
MBTN_MID = "{image} script-binding align-to-cursor";
+
MBTN_RIGHT = "{image} script-binding drag-to-pan";
+
WHEEL_UP = "{image} script-message cursor-centric-zoom .1";
+
WHEEL_DOWN = "{image} script-message cursor-centric-zoom -.1";
+
+
GAMEPAD_DPAD_RIGHT = "seek +5";
+
GAMEPAD_DPAD_LEFT = "seek -5";
+
+
GAMEPAD_RIGHT_TRIGGER = "add chapter 1";
+
GAMEPAD_LEFT_TRIGGER = "add chapter -1";
+
+
GAMEPAD_ACTION_DOWN = "cycle pause";
+
+
GAMEPAD_LEFT_SHOULDER = "cycle sub";
+
GAMEPAD_RIGHT_SHOULDER = "cycle audio";
+
};
+
scriptOpts = {
+
"SimpleHistory" = {
+
open_list_keybind = "[[h,all],[H,all],[r,recents],[R,recents],[GAMEPAD_BACK,all]]";
+
same_entry_limit = 0;
+
list_move_up_keybind = "[UP,WHEEL_UP,GAMEPAD_DPAD_UP]";
+
list_move_down_keybind = "[DOWN,WHEEL_DOWN,GAMEPAD_DPAD_DOWN]";
+
list_page_up_keybind = "[PGUP,GAMEPAD_LEFT_TRIGGER]";
+
list_page_down_keybind = "[PGDWN,GAMEPAD_RIGHT_TRIGGER]";
+
list_select_keybind = "[ENTER,MBTN_MID,GAMEPAD_ACTION_DOWN]";
+
list_add_playlist_keybind = "[CTRL+ENTER,GAMEPAD_ACTION_RIGHT]";
+
list_close_keybind = "[ESC,MBTN_RIGHT,GAMEPAD_BACK]";
+
};
+
"thumbfast" = {
+
max_height = 250;
+
max_width = 250;
+
spawn_first = "yes";
+
network = "yes";
+
hwdec = "yes";
+
};
+
"uosc" = {
+
};
+
};
+
};
+
};
+
}
+13
modules/home/programs/obs-studio/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.obs-studio.enable = lib.mkEnableOption "obs studio";
+
+
config = lib.mkIf config.myHome.programs.obs-studio.enable {
+
programs.obs-studio = {
+
enable = true;
+
};
+
};
+
}
+87
modules/home/programs/zed-editor/default.nix
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
options.myHome.programs.zed-editor.enable = lib.mkEnableOption "zed editor";
+
+
config = lib.mkIf config.myHome.programs.zed-editor.enable {
+
programs.zed-editor = {
+
enable = true;
+
extensions = [
+
"env"
+
"fish"
+
"git-firefly"
+
"github-theme"
+
"html"
+
"lua"
+
"nix"
+
"scss"
+
"toml"
+
];
+
userSettings = {
+
auto_indent_on_paste = true;
+
auto_update = false;
+
buffer_font_size = 14;
+
buffer_font_family = "JetBrains Mono NL";
+
use_on_type_format = true;
+
wrap_guides = [80];
+
minimap.show = "auto";
+
preferred_line_length = 80;
+
soft_wrap = "preferred_line_length";
+
+
agent = {
+
default_model = {
+
provider = "google";
+
model = "gemini-2.5-pro";
+
};
+
inline_assistant_model = {
+
provider = "google";
+
model = "gemini-2.5-pro";
+
};
+
default_profile = "ask";
+
};
+
+
languages = {
+
JavaScript = {
+
formatter = {
+
code_actions = {
+
"source.fixAll.eslint" = true;
+
};
+
};
+
};
+
TypeScript = {
+
formatter = {
+
code_actions = {
+
"source.fixAll.eslint" = true;
+
};
+
};
+
};
+
TSX = {
+
formatter = {
+
code_actions = {
+
"source.fixAll.eslint" = true;
+
};
+
};
+
};
+
Nix = {
+
format_on_save = "on";
+
formatter = "language_server";
+
language_servers = [
+
"nixd"
+
];
+
};
+
};
+
lsp.nixd = {
+
binary.path = lib.getExe pkgs.nixd;
+
settings.formatting.command = [(lib.getExe pkgs.alejandra) "--quiet" "--"];
+
};
+
telemetry = {
+
diagnostics = false;
+
metrics = false;
+
};
+
};
+
};
+
};
+
}
+5
modules/home/services/default.nix
···
+
{...}: {
+
imports = [
+
./syncthing
+
];
+
}
+13
modules/home/services/syncthing/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.services.syncthing.enable = lib.mkEnableOption "syncthing";
+
+
config = lib.mkIf config.myHome.services.syncthing.enable {
+
services.syncthing = {
+
enable = true;
+
};
+
};
+
}
+5
modules/home/style/default.nix
···
+
{...}: {
+
imports = [
+
./fonts
+
];
+
}
+40
modules/home/style/fonts/default.nix
···
+
{
+
lib,
+
config,
+
self,
+
...
+
}: let
+
fontSourceDir = self + "/secrets/fonts";
+
+
# Calculate the destination directory relative to home (e.g., ".local/share/fonts").
+
fontTargetDir = lib.removePrefix (config.home.homeDirectory + "/") (config.xdg.dataHome + "/fonts");
+
+
# A helper function to recursively find all file paths in a directory.
+
# This approach avoids Nix's string "tainting" issue.
+
findFilesRecursive = dir: let
+
entries = builtins.readDir dir;
+
processEntry = name: type: let
+
path = dir + "/${name}";
+
in
+
if type == "regular"
+
then [name]
+
else if type == "directory"
+
then map (sub: "${name}/${sub}") (findFilesRecursive path)
+
else [];
+
in
+
lib.flatten (lib.mapAttrsToList processEntry entries);
+
+
# Build the final attribute set for `home.file`.
+
fontFileEntries = lib.listToAttrs (
+
map (relativePath: {
+
name = "${fontTargetDir}/${relativePath}";
+
value.source = fontSourceDir + "/${relativePath}";
+
}) (findFilesRecursive fontSourceDir)
+
);
+
in {
+
options.myHome.style.fonts.enable = lib.mkEnableOption "custom fonts";
+
+
config = lib.mkIf config.myHome.style.fonts.enable {
+
home.file = fontFileEntries;
+
};
+
}
+23
modules/locale/en-gb/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
config = {
+
i18n = {
+
defaultLocale = lib.mkDefault "en_GB.UTF-8";
+
+
extraLocaleSettings = {
+
LC_ADDRESS = config.i18n.defaultLocale;
+
LC_IDENTIFICATION = config.i18n.defaultLocale;
+
LC_MEASUREMENT = config.i18n.defaultLocale;
+
LC_MONETARY = config.i18n.defaultLocale;
+
LC_NAME = config.i18n.defaultLocale;
+
LC_NUMERIC = config.i18n.defaultLocale;
+
LC_PAPER = config.i18n.defaultLocale;
+
LC_TELEPHONE = config.i18n.defaultLocale;
+
LC_TIME = config.i18n.defaultLocale;
+
};
+
};
+
};
+
}
+85
modules/nixos/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
imports = [
+
./desktop
+
./profiles
+
./style
+
./programs
+
./services
+
];
+
+
options.myNixOS.desktop.enable = lib.mkOption {
+
default =
+
config.myNixOS.desktop.gnome.enable or config.myNixOS.desktop.hyprland.enable
+
or config.myNixOS.desktop.kde.enable;
+
description = "Desktop environment configuration.";
+
type = lib.types.bool;
+
};
+
+
config = lib.mkIf config.myNixOS.desktop.enable {
+
boot = {
+
consoleLogLevel = 0;
+
initrd.verbose = false;
+
plymouth.enable = true;
+
};
+
+
environment.sessionVariables.NIXOS_OZONE_WL = "1";
+
+
home-manager.sharedModules = [
+
{
+
config.myHome.desktop.enable = true;
+
}
+
];
+
+
programs.system-config-printer.enable = true;
+
+
services = {
+
avahi = {
+
enable = true;
+
nssmdns4 = true;
+
openFirewall = true;
+
+
publish = {
+
enable = true;
+
addresses = true;
+
userServices = true;
+
workstation = true;
+
};
+
};
+
+
gnome.gnome-keyring.enable = true;
+
gvfs.enable = true; # Mount, trash, etc.
+
libinput.enable = true;
+
+
pipewire = {
+
enable = true;
+
+
alsa = {
+
enable = true;
+
support32Bit = true;
+
};
+
+
pulse.enable = true;
+
};
+
+
printing.enable = false;
+
+
pulseaudio = {
+
support32Bit = true;
+
};
+
+
system-config-printer.enable = true;
+
+
xserver = {
+
enable = true;
+
excludePackages = with pkgs; [xterm];
+
};
+
};
+
+
system.nixos.tags = ["desktop"];
+
};
+
}
+3
modules/nixos/desktop/default.nix
···
+
{...}: {
+
imports = [./gnome];
+
}
+52
modules/nixos/desktop/gnome/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: {
+
options.myNixOS.desktop.gnome.enable = lib.mkEnableOption "use gnome desktop environment";
+
+
config = lib.mkIf config.myNixOS.desktop.gnome.enable {
+
home-manager.sharedModules = [
+
{
+
config.myHome.desktop.gnome.enable = true;
+
}
+
];
+
+
services.displayManager.gdm.enable = true;
+
services.desktopManager.gnome.enable = true;
+
+
environment.gnome.excludePackages = with pkgs; [
+
epiphany # web browser
+
geary # email reader
+
gedit # text editor
+
gnome-characters
+
gnome-music
+
gnome-user-docs
+
gnome-tour
+
decibels
+
];
+
+
security.pam.services.greetd.enableGnomeKeyring = true;
+
services.gnome.gcr-ssh-agent.enable = true;
+
+
programs.kdeconnect = {
+
enable = true;
+
package = pkgs.gnomeExtensions.gsconnect;
+
};
+
+
environment.variables.QT_QPA_PLATFORMTHEME = "qt6ct";
+
environment.systemPackages = with pkgs; [
+
libsForQt5.qt5ct
+
qt6ct
+
];
+
+
myNixOS.desktop.enable = true;
+
+
#qt = {
+
# enable = true;
+
# platformTheme = "gnome";
+
# style = "adwaita";
+
#};
+
};
+
}
+66
modules/nixos/profiles/base/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
self,
+
...
+
}: {
+
options.myNixOS.profiles.base.enable = lib.mkEnableOption "base system configuration";
+
+
config = lib.mkIf config.myNixOS.profiles.base.enable {
+
environment = {
+
etc."nixos".source = self;
+
+
systemPackages = with pkgs; [
+
(lib.hiPrio uutils-coreutils-noprefix)
+
wget
+
micro
+
git
+
wget
+
btop
+
];
+
};
+
+
programs = {
+
dconf.enable = true; # Needed for home-manager
+
+
nh.enable = true;
+
};
+
+
networking.networkmanager.enable = true;
+
+
security = {
+
polkit.enable = true;
+
rtkit.enable = true;
+
+
sudo-rs = {
+
enable = true;
+
wheelNeedsPassword = false;
+
};
+
};
+
+
services = {
+
cachefilesd = {
+
enable = true;
+
+
extraConfig = ''
+
brun 20%
+
bcull 10%
+
bstop 5%
+
'';
+
};
+
+
openssh = {
+
enable = true;
+
openFirewall = true;
+
settings.PasswordAuthentication = false;
+
};
+
};
+
+
system = {
+
configurationRevision = self.rev or self.dirtyRev or null;
+
nixos.tags = ["base"];
+
rebuild.enableNg = true;
+
};
+
};
+
}
+6
modules/nixos/profiles/default.nix
···
+
{...}: {
+
imports = [
+
./base
+
./workstation
+
];
+
}
+121
modules/nixos/profiles/workstation/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options = {
+
myNixOS.profiles.workstation.enable = lib.mkEnableOption "workstation optimizations for gaming, media, and desktop use.";
+
};
+
+
config = lib.mkIf config.myNixOS.profiles.workstation.enable {
+
assertions = [
+
{
+
assertion = !(config.programs.gamemode.enable && config.services.ananicy.enable);
+
message = "Ananicy and GameMode cannot be enabled at the same time.";
+
}
+
];
+
+
boot = {
+
kernel.sysctl = {
+
# Improved file monitoring
+
"fs.file-max" = lib.mkDefault 2097152; # Set size of file handles and inode cache
+
"fs.inotify.max_user_instances" = lib.mkOverride 100 8192; # Re-use the default from Bazzite even though the default NixOS value is higher.
+
"fs.inotify.max_user_watches" = lib.mkOverride 100 524288;
+
+
"kernel.nmi_watchdog" = lib.mkOverride 100 0; # Disable watchdogs for maximum performance at the cost of resiliency
+
"kernel.sched_cfs_bandwidth_slice_u" = lib.mkDefault 3000;
+
"kernel.sched_latency_ns" = lib.mkDefault 3000000;
+
"kernel.sched_migration_cost_ns" = lib.mkDefault 50000;
+
"kernel.sched_min_granularity_ns" = lib.mkDefault 300000;
+
"kernel.sched_nr_migrate" = lib.mkDefault 128;
+
"kernel.sched_wakeup_granularity_ns" = lib.mkDefault 500000;
+
"kernel.soft_watchdog" = lib.mkDefault 0;
+
"kernel.split_lock_mitigate" = lib.mkDefault 0;
+
# "kernel.unprivileged_userns_clone" = lib.mkDefault 1;
+
"kernel.watchdog" = lib.mkDefault 0;
+
+
# Network optimizations
+
"net.core.default_qdisc" = lib.mkDefault "fq";
+
"net.core.netdev_max_backlog" = lib.mkDefault 16384; # Increase netdev receive queue
+
"net.ipv4.tcp_congestion_control" = lib.mkDefault "bbr";
+
"net.ipv4.tcp_ecn" = lib.mkDefault 1;
+
"net.ipv4.tcp_fastopen" = lib.mkDefault 3;
+
"net.ipv4.tcp_fin_timeout" = lib.mkDefault 5;
+
"net.ipv4.tcp_mtu_probing" = lib.mkForce 1;
+
"net.ipv4.tcp_rfc1337" = lib.mkDefault 1; # Protect against tcp time-wait assassination hazards, drop RST packets for sockets in the time-wait state. Not widely supported outside of Linux, but conforms to RFC.
+
"net.ipv4.tcp_slow_start_after_idle" = 0; # Disable TCP slow start after idle
+
# "net.ipv4.tcp_timestamps" = lib.mkDefault 0; # https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/reduce_tcp_performance_spikes
+
+
# Memory management
+
"vm.dirty_background_bytes" = lib.mkDefault 134217728;
+
"vm.dirty_bytes" = lib.mkDefault 268435456;
+
"vm.dirty_writeback_centisecs" = lib.mkDefault 1500;
+
"vm.max_map_count" = lib.mkOverride 100 2147483642;
+
"vm.page-cluster" = lib.mkDefault 0;
+
"vm.swappiness" = lib.mkDefault 150;
+
"vm.vfs_cache_pressure" = lib.mkDefault 50;
+
"vm.watermark_boost_factor" = lib.mkDefault 0;
+
"vm.watermark_scale_factor" = lib.mkDefault 125;
+
};
+
+
# kernelModules = ["ntsync"];
+
kernelPackages = pkgs.linuxPackages_latest;
+
};
+
+
services = {
+
ananicy = {
+
enable = true; # Incompatible/not recommended with gamemode.
+
+
extraRules = [
+
{
+
name = ".easyeffects-wr";
+
type = "LowLatency_RT";
+
}
+
];
+
+
package = pkgs.ananicy-cpp;
+
rulesProvider = pkgs.ananicy-rules-cachyos;
+
};
+
+
bpftune.enable = true;
+
preload.enable = true;
+
+
udev.extraRules = ''
+
## SD cards use BFQ scheduler.
+
ACTION=="add|change", KERNEL=="mmcblk[0-9]p[0-9]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="bfq"
+
+
## NVMe SSDs use kyber scheduler.
+
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="kyber"
+
+
## SSDs use kyber scheduler.
+
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="kyber"
+
+
## HDDs use BFQ scheduler.
+
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
+
+
## Allow @audio to write to /dev/cpu_dma_latency.
+
DEVPATH=="/devices/virtual/misc/cpu_dma_latency", OWNER="root",GROUP="audio", MODE="0660"
+
+
## Allow users to write to /dev/ntsync.
+
# KERNEL=="ntsync", MODE="0644"
+
'';
+
};
+
+
system.nixos.tags = ["workstation"];
+
+
systemd.oomd = {
+
enable = true;
+
enableRootSlice = true;
+
enableSystemSlice = true;
+
enableUserSlices = true;
+
};
+
+
zramSwap = {
+
enable = lib.mkDefault true;
+
algorithm = lib.mkDefault "lz4";
+
priority = lib.mkDefault 100;
+
memoryPercent = lib.mkDefault 100;
+
};
+
};
+
}
+10
modules/nixos/programs/default.nix
···
+
{...}: {
+
imports = [
+
./lanzaboote
+
./nix-ld
+
./steam
+
./nix
+
./firefox
+
./systemd-boot
+
];
+
}
+117
modules/nixos/programs/firefox/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.programs.firefox.enable = lib.mkEnableOption "firefox browser";
+
+
config = lib.mkIf config.myNixOS.programs.firefox.enable {
+
programs.firefox = {
+
enable = true;
+
+
policies = {
+
Cookies.Behavior = "reject-foreign";
+
DisableAppUpdate = true;
+
DisableFirefoxStudies = true;
+
DisableMasterPasswordCreation = true;
+
DisablePocket = true;
+
DisableProfileImport = true;
+
DisableSetDesktopBackground = true;
+
DisableTelemetry = true;
+
DisplayBookmarksToolbar = "newtab";
+
DisableFirefoxAccounts = true;
+
DisableSafeMode = true;
+
+
AutofillAddressEnabled = false;
+
AutofillCreditCardEnabled = false;
+
+
HttpsOnlyMode = "enabled";
+
+
DNSOverHTTPS = {
+
Enabled = true;
+
Fallback = true;
+
};
+
+
DontCheckDefaultBrowser = true;
+
+
EnableTrackingProtection = {
+
Cryptomining = true;
+
Fingerprinting = true;
+
EmailTracking = true;
+
Locked = false;
+
Value = true;
+
};
+
+
EncryptedMediaExtensions = {
+
Enabled = true;
+
Locked = false;
+
};
+
+
FirefoxHome = {
+
Highlights = false;
+
Locked = false;
+
Pocket = false;
+
Search = true;
+
Snippets = false;
+
SponsoredPocket = false;
+
SponsoredTopSites = false;
+
TopSites = false;
+
};
+
+
FirefoxSuggest = {
+
ImproveSuggest = false;
+
Locked = false;
+
SponsoredSuggestions = false;
+
WebSuggestions = false;
+
};
+
+
HardwareAcceleration = true;
+
+
Homepage = {
+
Locked = false;
+
StartPage = "previous-session";
+
};
+
+
NewTabPage = false;
+
NoDefaultBookmarks = true; # Enabling this prevents declaratively setting bookmarks.
+
OfferToSaveLoginsDefault = false;
+
OverrideFirstRunPage = "";
+
OverridePostUpdatePage = "";
+
+
PDFjs = {
+
Enabled = true;
+
EnablePermissions = false;
+
};
+
+
Preferences = {
+
# Do not add the extra "Import Bookmarks" button in the bookmarks interface
+
"browser.bookmarks.addedImportButton" = false;
+
+
# Mark that the user has accepted the data reporting (telemetry) policy
+
"datareporting.policy.dataSubmissionPolicyAccepted" = false;
+
+
# Allow extensions from all scopes (profile, system, etc.) without auto-disabling them
+
"extensions.autoDisableScopes" = 0;
+
+
# Enable VA-API hardware video decoding via FFmpeg (useful on Linux systems)
+
"media.ffmpeg.vaapi.enabled" = true;
+
+
# Enable the VP8/VP9 media data decoder, used in WebRTC and video playback
+
"media.navigator.mediadatadecoder_vpx_enabled" = true;
+
+
# Enable the Remote Data Decoder (RDD) process for FFmpeg to isolate media decoding tasks
+
"media.rdd-ffmpeg.enabled" = true;
+
};
+
+
UserMessaging = {
+
ExtensionRecommendations = false;
+
FeatureRecommendations = false;
+
MoreFromMozilla = false;
+
SkipOnboarding = true;
+
};
+
+
UseSystemPrintDialog = true;
+
};
+
};
+
};
+
}
+54
modules/nixos/programs/lanzaboote/README.md
···
+
# Secure Boot + Automatic LUKS decryption
+
+
1. Generate secure boot keys:
+
+
```bash
+
sudo nix run nixpkgs#sbctl create-keys
+
```
+
+
1. Include `nixos-programs-lanzaboote` or manually enable lanzaboote in NixOS host configuration:
+
+
```nix
+
boot = {
+
initrd.systemd.enable = true; # For automatic decryption with TPM.
+
loader.systemd-boot.enable = lib.mkForce false; # Interferes with lanzaboote and must be force-disabled.
+
+
lanzaboote = {
+
enable = true;
+
pkiBundle = "/var/lib/sbctl";
+
};
+
};
+
```
+
+
1. In UEFI, set secure boot to "setup mode" or erase platform keys.
+
+
1. Enroll your secure boot keys:
+
+
```bash
+
sudo nix run nixpkgs#sbctl -- enroll-keys --microsoft
+
```
+
+
1. Reboot, make sure secure boot is enabled in UEFI.
+
+
1. Check secure boot status with `bootctl status`:
+
+
```bash
+
System:
+
Firmware: UEFI 2.70 (American Megatrends 5.17)
+
Firmware Arch: x64
+
Secure Boot: enabled (user)
+
TPM2 Support: yes
+
Measured UKI: yes
+
Boot into FW: supported
+
```
+
+
1. If your root drive is encrypted with LUKS, you can have the TPM automatically decrypt it on boot:
+
+
```bash
+
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+2+7+12 --wipe-slot=tpm2 /dev/nvme0n1p2
+
```
+
+
Replace `/dev/nvme0n1p2` with your root partition.
+
Check the [Linux TPM PCR Registry](https://uapi-group.org/specifications/specs/linux_tpm_pcr_registry/) for more details.
+
+
**NOTE:** This requires a TPM2 module, devices with prior versions will not work.
+25
modules/nixos/programs/lanzaboote/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myNixOS.programs.lanzaboote.enable = lib.mkEnableOption "secure boot with lanzaboote";
+
+
config = lib.mkIf config.myNixOS.programs.lanzaboote.enable {
+
boot = {
+
initrd.systemd.enable = true;
+
+
lanzaboote = {
+
enable = true;
+
configurationLimit = 10;
+
pkiBundle = lib.mkDefault "/var/lib/sbctl";
+
sortKey = "lanza";
+
};
+
+
loader.systemd-boot.enable = lib.mkForce false;
+
};
+
+
environment.systemPackages = [pkgs.sbctl];
+
};
+
}
+24
modules/nixos/programs/nix-ld/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: {
+
options.myNixOS.programs.nix-ld.enable = lib.mkEnableOption "so you can run non nix apps!";
+
+
config = lib.mkIf config.myNixOS.programs.nix.enable {
+
# Enable nix-ld for running non-NixOS binaries like language servers
+
programs.nix-ld = {
+
enable = true;
+
libraries = with pkgs; [
+
# Common libraries that might be needed by language servers
+
stdenv.cc.cc
+
openssl
+
zlib
+
curl
+
glibc
+
(pkgs.runCommand "steamrun-lib" {} "mkdir $out; ln -s ${pkgs.steam-run.fhsenv}/usr/lib64 $out/lib")
+
];
+
};
+
};
+
}
+31
modules/nixos/programs/nix/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.programs.nix.enable = lib.mkEnableOption "sane nix configuration";
+
+
config = lib.mkIf config.myNixOS.programs.nix.enable {
+
nix = {
+
gc = {
+
automatic = true;
+
+
options = "--delete-older-than 3d";
+
+
persistent = true;
+
randomizedDelaySec = "60min";
+
};
+
+
optimise = {
+
automatic = true;
+
persistent = true;
+
randomizedDelaySec = "60min";
+
};
+
+
settings.experimental-features = [
+
"nix-command"
+
"flakes"
+
];
+
};
+
};
+
}
+16
modules/nixos/programs/steam/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.programs.steam.enable = lib.mkEnableOption "the game launcher that sucks";
+
+
config = lib.mkIf config.myNixOS.programs.steam.enable {
+
programs.steam = {
+
enable = true;
+
remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
+
dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
+
localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
+
};
+
};
+
}
+22
modules/nixos/programs/systemd-boot/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.programs.systemd-boot.enable = lib.mkEnableOption "boot with systemd-boot";
+
+
config = lib.mkIf config.myNixOS.programs.systemd-boot.enable {
+
boot = {
+
initrd.systemd.enable = lib.mkDefault true;
+
+
loader = {
+
efi.canTouchEfiVariables = lib.mkDefault true;
+
+
systemd-boot = {
+
enable = lib.mkDefault true;
+
configurationLimit = lib.mkDefault 10;
+
};
+
};
+
};
+
};
+
}
+26
modules/nixos/services/aria2/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: {
+
options.myNixOS.services.aria2 = {
+
enable = lib.mkEnableOption "Aria2 service";
+
};
+
+
config = lib.mkIf config.myNixOS.services.aria2.enable {
+
systemd.user.services.aria2 = {
+
description = "aria2 daemon";
+
after = ["network.target"];
+
wantedBy = ["default.target"];
+
serviceConfig = {
+
ExecStart = "${pkgs.aria2}/bin/aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all --dir=%h/Downloads";
+
Restart = "always";
+
RestartSec = "10";
+
Type = "forking";
+
WorkingDirectory = "%h";
+
Environment = "HOME=%h";
+
};
+
};
+
};
+
}
+6
modules/nixos/services/default.nix
···
+
{...}: {
+
imports = [
+
./tailscale
+
./aria2
+
];
+
}
+31
modules/nixos/services/tailscale/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myNixOS.services.tailscale = {
+
enable = lib.mkEnableOption "Tailscale VPN service";
+
};
+
+
config = lib.mkIf config.myNixOS.services.tailscale.enable (
+
lib.mkMerge [
+
(lib.mkIf config.myNixOS.desktop.gnome.enable {
+
environment.systemPackages = with pkgs; [
+
gnomeExtensions.tailscale-qs
+
];
+
})
+
+
{
+
services.tailscale = {
+
enable = true;
+
extraUpFlags = ["--ssh"];
+
extraSetFlags = ["--advertise-exit-node"];
+
extraDaemonFlags = ["--no-logs-no-support"];
+
openFirewall = true;
+
useRoutingFeatures = "both";
+
};
+
}
+
]
+
);
+
}
+5
modules/nixos/style/default.nix
···
+
{...}: {
+
imports = [
+
./fonts
+
];
+
}
+112
modules/nixos/style/fonts/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: let
+
emojiFont = "Noto Color Emoji";
+
in {
+
options.myNixOS.style.fonts = {
+
enable = lib.mkEnableOption "enable fonts";
+
};
+
+
config = lib.mkIf config.myNixOS.style.fonts.enable {
+
environment.variables = {
+
FREETYPE_PROPERTIES = "autofitter:no-stem-darkening=0 autofitter:darkening-parameters=500,0,1000,500,2500,500,4000,0 cff:no-stem-darkening=0 type1:no-stem-darkening=0 t1cid:no-stem-darkening=0";
+
QT_NO_SYNTHESIZED_BOLD = 1;
+
};
+
fonts.packages = with pkgs; [
+
noto-fonts
+
noto-fonts-cjk-sans
+
noto-fonts-emoji
+
noto-fonts-color-emoji
+
roboto-flex
+
roboto
+
nerd-fonts.jetbrains-mono
+
jetbrains-mono
+
source-code-pro
+
liberation_ttf
+
];
+
+
fonts.fontconfig = {
+
enable = true;
+
includeUserConf = false;
+
defaultFonts = {
+
serif = [
+
"Noto Serif"
+
"NotoSerifCJK"
+
"Noto Serif CJK JP"
+
];
+
sansSerif = [
+
"Roboto Flex"
+
"Roboto"
+
"Noto Sans"
+
"NotoSansCJK"
+
"Noto Sans CJK JP"
+
];
+
monospace = [
+
"JetBrains Mono NL"
+
"Source Code Pro"
+
"Noto Sans CJK JP"
+
];
+
};
+
useEmbeddedBitmaps = true;
+
subpixel = {
+
lcdfilter = "none";
+
rgba = "none";
+
};
+
antialias = true;
+
hinting = {
+
enable = true;
+
style = "slight";
+
autohint = false;
+
};
+
localConf = ''
+
<?xml version="1.0"?>
+
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+
<fontconfig>
+
<match target="pattern">
+
<test qual="any" name="family"><string>emoji</string></test>
+
<edit name="family" mode="assign" binding="same"><string>${emojiFont}</string></edit>
+
</match>
+
<match target="pattern">
+
<test name="family"><string>sans</string></test>
+
<edit name="family" mode="append"><string>${emojiFont}</string></edit>
+
</match>
+
<match target="pattern">
+
<test name="family"><string>serif</string></test>
+
<edit name="family" mode="append"><string>${emojiFont}</string></edit>
+
</match>
+
<match target="pattern">
+
<test name="family"><string>sans-serif</string></test>
+
<edit name="family" mode="append"><string>${emojiFont}</string></edit>
+
</match>
+
<match target="pattern">
+
<test name="family"><string>monospace</string></test>
+
<edit name="family" mode="append"><string>${emojiFont}</string></edit>
+
</match>
+
<match target="pattern">
+
<test name="family"><string>system-ui</string></test>
+
<edit name="family" mode="append"><string>${emojiFont}</string></edit>
+
</match>
+
+
<match target="font">
+
<test name="family"><string>Calibri</string></test>
+
<edit name="embeddedbitmap" mode="assign"><bool>false</bool></edit>
+
</match>
+
<match target="font">
+
<test name="family"><string>Cambria</string></test>
+
<edit name="embeddedbitmap" mode="assign"><bool>false</bool></edit>
+
</match>
+
+
<selectfont>
+
<rejectfont>
+
<pattern><patelt name="family"><string>Droid Sans Fallback</string></patelt></pattern>
+
<pattern><patelt name="family"><string>Droid Sans Japanese</string></patelt></pattern>
+
</rejectfont>
+
</selectfont>
+
</fontconfig>
+
'';
+
};
+
};
+
}
+14
modules/users/ayla/default.nix
···
+
{
+
pkgs,
+
config,
+
...
+
}: {
+
users.users.ayla = {
+
description = "Ayla";
+
isNormalUser = true;
+
extraGroups = config.myUsers.defaultGroups;
+
hashedPassword = config.myUsers.ayla.password;
+
uid = 1000;
+
shell = pkgs.fish;
+
};
+
}
+20
modules/users/default.nix
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
imports = [
+
./ayla
+
./options.nix
+
];
+
+
config = lib.mkIf (config.myUsers.root.enable or config.myUsers.ayla) {
+
programs.fish.enable = true;
+
+
users = {
+
defaultUserShell = pkgs.fish;
+
mutableUsers = false;
+
};
+
};
+
}
+37
modules/users/options.nix
···
+
{lib, ...}: {
+
options.myUsers = let
+
mkUser = user: {
+
enable = lib.mkEnableOption "${user}.";
+
+
password = lib.mkOption {
+
default = null;
+
description = "Hashed password for ${user}.";
+
type = lib.types.nullOr lib.types.str;
+
};
+
};
+
in {
+
defaultGroups = lib.mkOption {
+
description = "Default groups for desktop users.";
+
default = [
+
"cdrom"
+
"dialout"
+
"docker"
+
"libvirtd"
+
"lp"
+
"networkmanager"
+
"plugdev"
+
"scanner"
+
"transmission"
+
"video"
+
"wheel"
+
];
+
};
+
+
root.enable =
+
lib.mkEnableOption "root user configuration."
+
// {
+
default = true;
+
};
+
ayla = mkUser "ayla";
+
};
+
}