commit 05ea082c5fed25655e59ed7851c0cd53b0624b35 Author: freya <Freya Murphy> Date: Tue Jan 21 02:43:35 2025 +0000 initial diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://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 <https://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 +<https://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 +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff60a2c --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# NixOS dotfiles + +My configuration for all my NixOS systems. diff --git a/files/certs/freyanet.crt b/files/certs/freyanet.crt new file mode 100644 index 0000000..bc0d55a --- /dev/null +++ b/files/certs/freyanet.crt @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBnDCCAUKgAwIBAgIRAPVH+EAJd7BV1oocsZ1LQLEwCgYIKoZIzj0EAwIwLDEQ +MA4GA1UEChMHZnJleWFDQTEYMBYGA1UEAxMPZnJleWFDQSBSb290IENBMB4XDTIz +MTAyODEzNDAzNVoXDTMzMTAyNTEzNDAzNVowLDEQMA4GA1UEChMHZnJleWFDQTEY +MBYGA1UEAxMPZnJleWFDQSBSb290IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAEvVC5H2UQZQxMJxKnWkNF7kKNXVDpY2N81yFXRb+K/MKw3aQTI1ukJ6A3AmZP +P9urbt/wOHI2zBuodGi4gaLBSaNFMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB +/wQIMAYBAf8CAQEwHQYDVR0OBBYEFGYaattGlZxu5noFWxAnLtpMqJvJMAoGCCqG +SM49BAMCA0gAMEUCIQCCyubbf8AUq+PPrnBRQ/WFYKH3mwUXcDT7VZoLm+/q+gIg +YdSLl4AnWfDLlaTTZspft2fq5rEFCB5N+4p/67vSsmY= +-----END CERTIFICATE----- diff --git a/files/config/iris/iris.lock b/files/config/iris/iris.lock new file mode 100644 index 0000000..b6a3b40 --- /dev/null +++ b/files/config/iris/iris.lock @@ -0,0 +1,158 @@ +### IRIS - A locking plugin manager for vim +### Copyright © 2025 Freya Murphy <contact@freyacat.org> +### +### This file is part of IRIS +### +### IRIS 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. +### +### IRIS 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 IRIS. If not, see <http://www.gnu.org/licenses/>. + +[[plugins]] +id = "vim-devicons" +url = "https://github.com/ryanoasis/vim-devicons" +commit = "71f239af28b7214eebb60d4ea5bd040291fb7e33" + +[[plugins]] +id = "nvim-web-devicons" +url = "https://github.com/nvim-tree/nvim-web-devicons" +commit = "aafa5c187a15701a7299a392b907ec15d9a7075f" + +[[plugins]] +id = "plenary" +url = "https://github.com/nvim-lua/plenary.nvim" +commit = "3707cdb1e43f5cea73afb6037e6494e7ce847a66" + +[[plugins]] +id = "lualine" +url = "https://github.com/nvim-lualine/lualine.nvim" +commit = "2a5bae925481f999263d6f5ed8361baef8df4f83" + +[[plugins]] +id = "bufferline" +url = "https://github.com/akinsho/bufferline.nvim" +commit = "17083c826a004bcb87d3a830c7710d0796a73bbf" + +[[plugins]] +id = "nvim-tree" +url = "https://github.com/nvim-tree/nvim-tree.lua" +commit = "d529a99f88e0dff02e0aa275db2f595cd252a2c8" + +[[plugins]] +id = "undotree" +url = "https://github.com/mbbill/undotree" +commit = "2556c6800b210b2096b55b66e74b4cc1d9ebbe4f" + +[[plugins]] +id = "trouble" +url = "https://github.com/folke/trouble.nvim" +commit = "4d36b8979287f5facc03fd6d955ace67db667e1d" + +[[plugins]] +id = "telescope" +url = "https://github.com/nvim-telescope/telescope.nvim" +commit = "415af52339215926d705cccc08145f3782c4d132" + +[[plugins]] +id = "fugitive" +url = "https://github.com/tpope/vim-fugitive" +commit = "174230d6a7f2df94705a7ffd8d5413e27ec10a80" + +[[plugins]] +id = "vsnip" +url = "https://github.com/hrsh7th/vim-vsnip" +commit = "02a8e79295c9733434aab4e0e2b8c4b7cea9f3a9" + +[[plugins]] +id = "vsnip_integ" +url = "https://github.com/hrsh7th/vim-vsnip-integ" +commit = "90ae474e8b05ed41e36d6f58382a9fbfb4b672c4" + +[[plugins]] +id = "friendly-snippets" +url = "https://github.com/rafamadriz/friendly-snippets" +commit = "efff286dd74c22f731cdec26a70b46e5b203c619" + +[[plugins]] +id = "cmp" +url = "https://github.com/hrsh7th/nvim-cmp" +commit = "8c82d0bd31299dbff7f8e780f5e06d2283de9678" + +[[plugins]] +id = "cmp_buffer" +url = "https://github.com/hrsh7th/cmp-buffer" +commit = "3022dbc9166796b644a841a02de8dd1cc1d311fa" + +[[plugins]] +id = "cmp_nvim_lsp" +url = "https://github.com/hrsh7th/cmp-nvim-lsp" +commit = "99290b3ec1322070bcfb9e846450a46f6efa50f0" + +[[plugins]] +id = "cmp_vsnip" +url = "https://github.com/hrsh7th/cmp-vsnip" +commit = "989a8a73c44e926199bfd05fa7a516d51f2d2752" + +[[plugins]] +id = "nvim-surround" +url = "https://github.com/kylechui/nvim-surround" +commit = "9f0cb495f25bff32c936062d85046fbda0c43517" + +[[plugins]] +id = "nerdcommenter" +url = "https://github.com/preservim/nerdcommenter" +commit = "66c07e4083ab02ed2540ac289cc602c70b858c13" + +[[plugins]] +id = "nvim-treesitter" +url = "https://github.com/nvim-treesitter/nvim-treesitter" +commit = "c7dc251cddf2cdef1fa279fa797799728a5bfd78" +run = "TSUpdate" + +[[plugins]] +id = "illuminate" +url = "https://github.com/RRethy/vim-illuminate" +commit = "5eeb7951fc630682c322e88a9bbdae5c224ff0aa" + +[[plugins]] +id = "todo" +url = "https://github.com/folke/todo-comments.nvim" +commit = "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" + +[[plugins]] +id = "catppuccin" +url = "https://github.com/catppuccin/nvim" +commit = "f67b886d65a029f12ffa298701fb8f1efd89295d" + +[[plugins]] +id = "lspconfig" +url = "https://github.com/neovim/nvim-lspconfig" +commit = "0913481440219390969ab56a3c33089679365ef7" + +[[plugins]] +id = "fidget" +url = "https://github.com/j-hui/fidget.nvim" +commit = "a0abbf18084b77d28bc70e24752e4f4fd54aea17" + +[[plugins]] +id = "ident-o-matic" +url = "https://github.com/Darazaki/indent-o-matic" +commit = "4d11e98f523d3c4500b1dc33f0d1a248a4f69719" + +[[plugins]] +id = "hologram" +url = "https://github.com/edluffy/hologram.nvim" +commit = "f5194f71ec1578d91b2e3119ff08e574e2eab542" + +[[plugins]] +id = "virt-column" +url = "https://github.com/lukas-reineke/virt-column.nvim" +commit = "b87e3e0864211a32724a2ebf3be37e24e9e2fa99" diff --git a/files/config/iris/iris.toml b/files/config/iris/iris.toml new file mode 100644 index 0000000..9949818 --- /dev/null +++ b/files/config/iris/iris.toml @@ -0,0 +1,84 @@ + +[plugins] + +# == Dependencies == # + +# provides nerd font glyphs +vim-devicons = "ryanoasis/vim-devicons" +nvim-web-devicons = "nvim-tree/nvim-web-devicons" + +# lua functions +plenary = "nvim-lua/plenary.nvim" + +# == Lines == # + +# mode line +lualine = "nvim-lualine/lualine.nvim" + +# buffer line +bufferline = "akinsho/bufferline.nvim" + +# == Menus == # + +# file menu +nvim-tree = "nvim-tree/nvim-tree.lua" + +# undo menu +undotree = "mbbill/undotree" + +# error menu +trouble = "folke/trouble.nvim" + +# grep and find menu +telescope = "nvim-telescope/telescope.nvim" + +# == Integrations == # + +# git +fugitive = "tpope/vim-fugitive" + +# == Auto complete == # + +# snippets +vsnip = "hrsh7th/vim-vsnip" +vsnip_integ = "hrsh7th/vim-vsnip-integ" +friendly-snippets = "rafamadriz/friendly-snippets" + +# auto completion engine +cmp = "hrsh7th/nvim-cmp" +cmp_buffer = "hrsh7th/cmp-buffer" +cmp_nvim_lsp = "hrsh7th/cmp-nvim-lsp" +cmp_vsnip = "hrsh7th/cmp-vsnip" + +# delimiter auto complete +nvim-surround = "kylechui/nvim-surround" + +# == LSP == # + +# comment functions +nerdcommenter = "preservim/nerdcommenter" + +# hilighter +nvim-treesitter = { url = "nvim-treesitter/nvim-treesitter", run = "TSUpdate" } +illuminate = "RRethy/vim-illuminate" + +# comment hilighter +todo = "folke/todo-comments.nvim" + +# theme +catppuccin = "catppuccin/nvim" + +# lsp auto configs +lspconfig = "neovim/nvim-lspconfig" + +# LSP notifications +fidget = "j-hui/fidget.nvim" + +# auto indent +ident-o-matic = "Darazaki/indent-o-matic" + +# image viewer +hologram = "edluffy/hologram.nvim" + +# 80 column bar +virt-column = "lukas-reineke/virt-column.nvim" diff --git a/files/config/nvim/init.lua b/files/config/nvim/init.lua new file mode 100644 index 0000000..f920e1a --- /dev/null +++ b/files/config/nvim/init.lua @@ -0,0 +1,298 @@ +--[[ CONFIG ]]-- + +-- global config for iris configuration +config = { + -- colorscheme for nvim + colorscheme = "catppuccin", + flavour = "mocha", + -- indentation + tab_width = 4, + expand_tab = false, + -- keybinds to be set to actions + keybinds = { + -- leader key + leader = ' ', + -- toggle menus + menus = { + -- file browser + browser = '<leader>e', + -- active buffers + buffers = '<leader>fb', + -- error list + error = '<leader>t', + -- find files + find = '<leader>ff', + -- grep files + grep = '<leader>fg', + -- help browser + help = '<leader>fh', + -- undo tree + undo = '<leader>u', + }, + -- lsp actions + lsp = { + hover = 'K', + action = '<leader>la', + references = '<leader>lr', + rename = '<leader>ln', + }, + -- completion + cmp = { + -- prev item + prev = '<C-p>', + -- next item + next = '<C-n>', + -- confirm + confirm = '<CR>', + -- complete + complete = '<C-Space>', + }, + -- disable active selection + noh = '<leader>h', + }, + -- treesitter languages + treesitter = { + "c", + "lua", + "rust", + "typescript", + "javascript", + "python", + "vim", + "vimdoc", + "query", + }, + -- lsp servers + lsps = { + -- rust + rust_analyzer = {}, + -- c / c++ + clangd = {}, + -- java + jdtls = {}, + }, +}; + +vim.call('iris#load') + +--[[ IMPORTS ]]-- + +local catppuccin = require('catppuccin') + +--[[ VIM ]]-- + +vim.opt.tabstop = config.tab_width +vim.opt.softtabstop = config.tab_width +vim.opt.shiftwidth = config.tab_width +vim.opt.expandtab = config.expand_tab +vim.opt.mouse = "a" +vim.opt.clipboard = "unnamedplus" +vim.opt.hlsearch = true +vim.opt.autoindent = true +vim.opt.ttyfast = true +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.rnu = true +vim.opt.swapfile = false +vim.opt.termguicolors = true + +-- remove trailing whitespace on save +vim.api.nvim_create_autocmd({ "BufWritePre" }, { + pattern = { "*" }, + command = [[%s/\s\+$//e]], +}) + +--[[ THEME ]]-- + +catppuccin.setup({ + flavour = config.flavour, + transparent_background = true, + integrations = { + cmp = true, + illuminate = { + enabled = true, + lsp = false + }, + nvimtree = true, + nvim_surround = true, + lsp_trouble = true, + telescope = { + enabled = true, + }, + treesitter = true, + }, +}) + +vim.cmd('colorscheme ' .. config.colorscheme) +vim.o.background = "dark" +vim.api.nvim_set_hl(0, "Normal", { bg = "none" }) +vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" }) +vim.api.nvim_set_hl(0, "NvimTreeNormal", { bg = "none" }) + +--[[ LINES ]]-- + +-- mode line +require('lualine').setup { + options = { + theme = config.colorscheme, + icons_enabled = true, + globalstatus = true, + }, +} + +-- buffer line +require("bufferline").setup {} + +--[[ MENUS ]]-- + +-- file browser +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +vim.opt.termguicolors = true + +require("nvim-tree").setup { + sort = { + sorter = "case_sensitive", + }, + view = { + width = 30, + }, + renderer = { + group_empty = true, + }, + actions = { + open_file = { + quit_on_open = true, + }, + }, + filters = { + dotfiles = false, + }, +} + +--[[ COMPLETION ]]-- + +-- completion engine +--local cmp = require('cmp') +-- +--local cmp_select = {behavior = cmp.SelectBehavior.Select} +--local cmp_mappings = cmp.mapping.preset.insert({ +-- [config.keybinds.cmp.prev] = cmp.mapping.select_prev_item(cmp_select), +-- [config.keybinds.cmp.next] = cmp.mapping.select_next_item(cmp_select), +-- [config.keybinds.cmp.confirm] = cmp.mapping.confirm({ select = true }), +-- [config.keybinds.cmp.complete] = cmp.mapping.complete(), +--}) +-- +--cmp_mappings['<Tab>'] = nil +--cmp_mappings['<S-Tab>'] = nil +-- +--cmp.setup { +-- snippet = { +-- expand = function(args) +-- vim.fn["vsnip#anonymous"](args.body) +-- end, +-- }, +-- sources = cmp.config.sources({ +-- { name = 'nvim_lsp' }, +-- { name = 'vsnip' }, +-- { name = 'buffer' }, +-- }), +-- mapping = cmp_mappings, +--} +-- +-- delimiter completion +require'nvim-surround'.setup {} + +--[[ LSP ]]-- + +local capabilities = require'cmp_nvim_lsp'.default_capabilities() +for lsp,config in pairs(config.lsps) do + config.capabilities = capabilities + require'lspconfig'[lsp].setup(config) +end + +-- treesitter +require'nvim-treesitter.configs'.setup { + ensure_installed = config.treesitter, + sync_install = false, + auto_install = true, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, + indent = { + enable = true + }, +} + +-- illuminate +require'illuminate'.configure { + providers = { + 'lsp', + 'treesitter', + 'regex', + }, +} + +-- todo comments +require('todo-comments').setup() + +-- auto indentation +require('indent-o-matic').setup { + max_lines = 2048, + standard_widths = { 2, 4, 8 }, + skip_multiline = true, +} + +-- image viewer +--require'hologram'.setup { +-- auto_display = true +--} + +-- 80 col bar +require'virt-column'.setup { + enabled = true, + virtcolumn = "80" +} + +-- notifications +require("fidget").setup { + notification = { + window = { + winblend = 0, + }, + }, +} + +--[[ KEYBINDS ]]-- + +vim.g.mapleader = config.keybinds.leader +vim.g.maplocalleader = config.keybinds.leader +vim.keymap.set('', '<leader>', '<Nop>', { noremap = true, silent = true }) + +local function bind(key, action, opts) + opts = opts or {} + vim.keymap.set('n', key, action, opts) +end + +bind(config.keybinds.noh, vim.cmd.noh) +bind(config.keybinds.menus.browser, vim.cmd.NvimTreeToggle) +bind(config.keybinds.menus.undo, vim.cmd.UndotreeToggle) +bind(config.keybinds.menus.error, function() require'trouble'.toggle() end) + +local telescope = require'telescope.builtin' +bind(config.keybinds.menus.buffers, telescope.buffers) +bind(config.keybinds.menus.find, telescope.find_files) +bind(config.keybinds.menus.grep, telescope.live_grep) +bind(config.keybinds.menus.help, telescope.help_tags) + +vim.api.nvim_create_autocmd('LspAttach', { + desc = 'LSP actions', + callback = function(event) + local opts = {buffer = event.buf} + bind(config.keybinds.lsp.hover, function() vim.lsp.buf.hover() end, opts) + bind(config.keybinds.lsp.action, function() vim.lsp.buf.code_action() end, opts) + bind(config.keybinds.lsp.references, function() vim.lsp.buf.references() end, opts) + bind(config.keybinds.lsp.rename, function() vim.lsp.buf.rename() end, opts) + end +}) diff --git a/files/config/ssh/config b/files/config/ssh/config new file mode 100644 index 0000000..4953469 --- /dev/null +++ b/files/config/ssh/config @@ -0,0 +1,12 @@ +Match Host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye" + +Host *.in.freya.cat + User root + +Host *.cs.rit.edu + User tam2214 + +Host * + HostkeyAlgorithms +ssh-rsa + PubkeyAcceptedKeyTypes +ssh-rsa + KexAlgorithms -sntrup761x25519-sha512@openssh.com diff --git a/files/config/xdg/mimeapps.list b/files/config/xdg/mimeapps.list new file mode 100644 index 0000000..fd803cf --- /dev/null +++ b/files/config/xdg/mimeapps.list @@ -0,0 +1,25 @@ +[Default Applications] +text/html=firefox.desktop +image/png=imv.desktop +image/jpeg=imv.desktop +image/webp=imv.desktop +image/tga=imv.desktop +image/bmp=imv.desktop +image/gif=imv.desktop +video/mp4=mpv.desktop +video/x-msvideo=mpv.desktop +video/mkv=mpv.desktop +video/webm=mpv.desktop +audio/mp3=mpv.desktop +audio/wav=mpv.desktop +application/pdf=org.pwmt.zathura.desktop +application/x-shellscript=nvim.desktop +x-scheme-handler/http=firefox.desktop +x-scheme-handler/https=firefox.desktop +x-scheme-handler/about=firefox.desktop +x-scheme-handler/unknown=firefox.desktop +x-scheme-handler/mspa=unofficial-homestuck-collection.desktop + +[Added Associations] +x-scheme-handler/discord=discord.desktop; +x-scheme-handler/slack=slack.desktop; diff --git a/files/config/xdg/user-dirs.dirs b/files/config/xdg/user-dirs.dirs new file mode 100644 index 0000000..c347090 --- /dev/null +++ b/files/config/xdg/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/" +XDG_DOCUMENTS_DIR="$HOME/documents/" +XDG_DOWNLOAD_DIR="$HOME/downloads/" +XDG_MUSIC_DIR="$HOME/" +XDG_PICTURES_DIR="$HOME/" +XDG_PUBLICSHARE_DIR="$HOME/" +XDG_TEMPLATES_DIR="$HOME/" +XDG_VIDEOS_DIR="$HOME/" diff --git a/files/config/zsh/zprofile b/files/config/zsh/zprofile new file mode 100644 index 0000000..4815b36 --- /dev/null +++ b/files/config/zsh/zprofile @@ -0,0 +1,11 @@ +# dont attempt to launch a graphical +# env in tmux +if [ -n "$TMUX" ]; then + return +fi + +# only launch hyprland on tty 1 +if [ -z "${WAYLAND_DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then + export XDG_CURRENT_DESKTOP=Hyprland + exec dbus-run-session Hyprland +fi diff --git a/files/config/zsh/zshrc b/files/config/zsh/zshrc new file mode 100644 index 0000000..b42d2bd --- /dev/null +++ b/files/config/zsh/zshrc @@ -0,0 +1,73 @@ +# zsh initalization file + +# export 'SHELL' and 'EDITOR' to child processes +export SHELL +export EDITOR="nvim" + +if [[ $- != *i* ]] +then + # We are being invoked from a non-interactive shell. If this + # is an SSH session (as in "ssh host command"), source + # /etc/profile so we get PATH and other essential variables. + [[ -n "$SSH_CLIENT" ]] && source /etc/profile + + # Don't do anything else. + return +fi + +# update PATH +PATH=$PATH:$HOME/.local/bin +PATH=$PATH:$HOME/.cargo/bin + +# vim mode >:) +# no ryan i am not copying you +set -o vi +set show-mode-in-prompt on + +# Set shell prompt using starship +if command -v "starship" > /dev/null; then + eval "$(starship init zsh)" +else + export PS1="$$USER: " +fi + +# aliases +alias rf="rm -fr" # remove le french hon hon hon +alias ls="ls --color=auto" +alias ip="ip --color=auto" +alias grep="grep --color=auto" +alias diff="diff --color=auto" +alias vim="nvim" +alias ssh='TERM=xterm-256color ssh' # xterm-kitty bad + +# nix rebuild +alias reconfigure="sudo nixos-rebuild switch --flake ~/.config/nix#$(hostname)" + +# manpages +export LESS_TERMCAP_md=$'\e[1;36m' +export LESS_TERMCAP_me=$'\e[0m' +export LESS_TERMCAP_se=$'\e[0m' +export LESS_TERMCAP_so=$'\e[1;92m' +export LESS_TERMCAP_ue=$'\e[0m' +export LESS_TERMCAP_us=$'\e[1;35m' +export GROFF_NO_SGR=1 + +# compinit +autoload compinit && compinit + +# keybinds +bindkey "\e[1;5D" backward-word +bindkey "\e[1;5C" forward-word +bindkey "\e[3;5~" kill-word +bindkey "\C-_" backward-kill-word +bindkey "\e[3~" delete-char +bindkey "\e[H" beginning-of-line +bindkey "\e[F" end-of-line +bindkey "\e\d" undo + +# gpg +export GPG_TTY=$(tty) +export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) + +# ricing +pfetch diff --git a/files/fonts/font-awesome-6-pro.ttf b/files/fonts/font-awesome-6-pro.ttf new file mode 100755 index 0000000..1bd5782 Binary files /dev/null and b/files/fonts/font-awesome-6-pro.ttf differ diff --git a/files/keys/freya-gpg.pub b/files/keys/freya-gpg.pub new file mode 100644 index 0000000..0799334 --- /dev/null +++ b/files/keys/freya-gpg.pub @@ -0,0 +1,28 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZbQvBxYJKwYBBAHaRw8BAQdA5eYxL7ktSaA/mGdbx6zaVhWkLERUaG0HQ5zQ +7bpTDZG0IUZyZXlhIE11cnBoeSA8ZnJleWFAZnJleWFjYXQub3JnPoiTBBMWCgA7 +FiEEtz9qPIOzjJAzl4DgXWf0mYN7HWAFAmW0LwcCGwEFCwkIBwICIgIGFQoJCAsC +BBYCAwECHgcCF4AACgkQXWf0mYN7HWDRmQEAjcQePcl5UQ1IcSg6tPCnezsIA23S +LH7e3UEVnpecagoA/jcsKimfz5td2PH86FNtCLtvMFq1ztzrw7UqCQBXiiUHmDME +ZxpY/BYJKwYBBAHaRw8BAQdAqxOoScBHGwsgHibO5NYxkl5f8QeIXsIFAM20KVM/ +Uo+0IUZyZXlhIE11cnBoeSA8ZnJleWFAZnJleWFjYXQub3JnPoiQBBMWCAA4FiEE +2a8KQgm3wt4RqIS/rLxVNmDZmT0FAmcaWPwCGwEFCwkIBwIGFQoJCAsCBBYCAwEC +HgECF4AACgkQrLxVNmDZmT17+gEA2QbrA+SQmgAtEwgdlQSRsdK8tfboTBnjeW9T +2j3ArW4BAJetX+1Q6pPXP4FLfZOz0Vu46JCy4DDGS37B89bmgrMOuDMEZxpZzRYJ +KwYBBAHaRw8BAQdAWf1SdS6rK+hXbEcjb0jy+bO9cDhna1khYRbsKcSDqfiI9QQY +FggAJhYhBNmvCkIJt8LeEaiEv6y8VTZg2Zk9BQJnGlnNAhsCBQkFo5qAAIEJEKy8 +VTZg2Zk9diAEGRYIAB0WIQQ802XwNzzrE4U69WifvG/9bS2/FwUCZxpZzQAKCRCf +vG/9bS2/F2DHAQD11yHJC5VlyNtgPyA9SYI0M8clQjldB7O29v8gRGzbIgD/U4Sm +GnuRk2js5ITMmBdG1RGzEmmD1dVNIGGM4FiWdg/fSgEAy6dq/LVYeFRkMJ+Vbb0E +gFD7SnB/PNfrgtR6VS2KWCYA/1v6bblMoT5rNjcSt0i88SPo9n8CXDui1TOoPwLg +21EEuDMEZxpZ5hYJKwYBBAHaRw8BAQdA9NmEhp63hLFv2ftb8sl7OpvleaABdbON +L3TutR166SqIfgQYFggAJhYhBNmvCkIJt8LeEaiEv6y8VTZg2Zk9BQJnGlnmAhsg +BQkFo5qAAAoJEKy8VTZg2Zk9iQkA/iUIRSGElTdKPALKQ9Laf3xgsreEYE25zdAJ +VtvDXd/MAP4/vjrNyFw6k7EPrIx+i9Stw6hPxChH9SwgjcgZdCjWB7g4BGcaWhcS +CisGAQQBl1UBBQEBB0B3JswDVPoc4B5BRt+XNZ4Y+2cT+mzJwBvEeqdkgrJHTgMB +CAeIfgQYFggAJhYhBNmvCkIJt8LeEaiEv6y8VTZg2Zk9BQJnGloXAhsMBQkFo5qA +AAoJEKy8VTZg2Zk9rCIBALM+gv1wcpOzK1AHj2Nx+40Yf3Y3en7Py93lDK/iyWOo +AQCP9rp0XHMqNjiPStbV+cX9dgJym0L6tpuw55sSpWyIDg== +=fQIe +-----END PGP PUBLIC KEY BLOCK----- diff --git a/files/pfps/75046.png b/files/pfps/75046.png new file mode 100644 index 0000000..1c7c2bd Binary files /dev/null and b/files/pfps/75046.png differ diff --git a/files/pfps/aoba pfp.png b/files/pfps/aoba pfp.png new file mode 100644 index 0000000..e943345 Binary files /dev/null and b/files/pfps/aoba pfp.png differ diff --git a/files/pfps/aoba.jpg b/files/pfps/aoba.jpg new file mode 100644 index 0000000..987c7aa Binary files /dev/null and b/files/pfps/aoba.jpg differ diff --git a/files/pfps/edward elric.jpg b/files/pfps/edward elric.jpg new file mode 100644 index 0000000..e5fe0b8 Binary files /dev/null and b/files/pfps/edward elric.jpg differ diff --git a/files/pfps/freya.png b/files/pfps/freya.png new file mode 100644 index 0000000..758ea9f Binary files /dev/null and b/files/pfps/freya.png differ diff --git a/files/pfps/karkat.png b/files/pfps/karkat.png new file mode 100644 index 0000000..4734b4e Binary files /dev/null and b/files/pfps/karkat.png differ diff --git a/files/pfps/kaworu.jpg b/files/pfps/kaworu.jpg new file mode 100644 index 0000000..75990b3 Binary files /dev/null and b/files/pfps/kaworu.jpg differ diff --git a/files/pfps/len banner.gif b/files/pfps/len banner.gif new file mode 100644 index 0000000..18879e9 Binary files /dev/null and b/files/pfps/len banner.gif differ diff --git a/files/pfps/len small.png b/files/pfps/len small.png new file mode 100644 index 0000000..1e21226 Binary files /dev/null and b/files/pfps/len small.png differ diff --git a/files/pfps/len.png b/files/pfps/len.png new file mode 100644 index 0000000..56c0268 Binary files /dev/null and b/files/pfps/len.png differ diff --git a/files/pfps/no6.png b/files/pfps/no6.png new file mode 100644 index 0000000..a24d7c5 Binary files /dev/null and b/files/pfps/no6.png differ diff --git a/files/pfps/one Piece.gif b/files/pfps/one Piece.gif new file mode 100644 index 0000000..6837154 Binary files /dev/null and b/files/pfps/one Piece.gif differ diff --git a/files/pfps/sasakimiyano.png b/files/pfps/sasakimiyano.png new file mode 100644 index 0000000..95496bb Binary files /dev/null and b/files/pfps/sasakimiyano.png differ diff --git a/files/pfps/trans.png b/files/pfps/trans.png new file mode 100644 index 0000000..f5700cc Binary files /dev/null and b/files/pfps/trans.png differ diff --git a/files/pfps/unnamed.jpg b/files/pfps/unnamed.jpg new file mode 100644 index 0000000..0a52d0e Binary files /dev/null and b/files/pfps/unnamed.jpg differ diff --git a/files/pfps/vriska.png b/files/pfps/vriska.png new file mode 100644 index 0000000..f0ba326 Binary files /dev/null and b/files/pfps/vriska.png differ diff --git a/files/pfps/vulkan.png b/files/pfps/vulkan.png new file mode 100644 index 0000000..6495b0a Binary files /dev/null and b/files/pfps/vulkan.png differ diff --git a/files/wallpapers/aoba.jpg b/files/wallpapers/aoba.jpg new file mode 100644 index 0000000..c406806 Binary files /dev/null and b/files/wallpapers/aoba.jpg differ diff --git a/files/wallpapers/aoba_2.jpg b/files/wallpapers/aoba_2.jpg new file mode 100644 index 0000000..21215b0 Binary files /dev/null and b/files/wallpapers/aoba_2.jpg differ diff --git a/files/wallpapers/araragi.png b/files/wallpapers/araragi.png new file mode 100644 index 0000000..3aaaebf Binary files /dev/null and b/files/wallpapers/araragi.png differ diff --git a/files/wallpapers/blue.jpg b/files/wallpapers/blue.jpg new file mode 100644 index 0000000..acd376b Binary files /dev/null and b/files/wallpapers/blue.jpg differ diff --git a/files/wallpapers/davekat.png b/files/wallpapers/davekat.png new file mode 100644 index 0000000..9ab0576 Binary files /dev/null and b/files/wallpapers/davekat.png differ diff --git a/files/wallpapers/dmmd mobile.jpg b/files/wallpapers/dmmd mobile.jpg new file mode 100644 index 0000000..3f4311b Binary files /dev/null and b/files/wallpapers/dmmd mobile.jpg differ diff --git a/files/wallpapers/dmmd.jpg b/files/wallpapers/dmmd.jpg new file mode 100644 index 0000000..9ad0e8e Binary files /dev/null and b/files/wallpapers/dmmd.jpg differ diff --git a/files/wallpapers/evangelion.jpg b/files/wallpapers/evangelion.jpg new file mode 100644 index 0000000..74d785a Binary files /dev/null and b/files/wallpapers/evangelion.jpg differ diff --git a/files/wallpapers/ff7.jpg b/files/wallpapers/ff7.jpg new file mode 100644 index 0000000..ba2ffee Binary files /dev/null and b/files/wallpapers/ff7.jpg differ diff --git a/files/wallpapers/gay.png b/files/wallpapers/gay.png new file mode 100644 index 0000000..cea5b4e Binary files /dev/null and b/files/wallpapers/gay.png differ diff --git a/files/wallpapers/gay2.png b/files/wallpapers/gay2.png new file mode 100644 index 0000000..e076890 Binary files /dev/null and b/files/wallpapers/gay2.png differ diff --git a/files/wallpapers/homestuck.png b/files/wallpapers/homestuck.png new file mode 100644 index 0000000..da37855 Binary files /dev/null and b/files/wallpapers/homestuck.png differ diff --git a/files/wallpapers/no6.jpg b/files/wallpapers/no6.jpg new file mode 100644 index 0000000..a21db12 Binary files /dev/null and b/files/wallpapers/no6.jpg differ diff --git a/files/wallpapers/no6.png b/files/wallpapers/no6.png new file mode 100644 index 0000000..ddfcac5 Binary files /dev/null and b/files/wallpapers/no6.png differ diff --git a/files/wallpapers/nya0.png b/files/wallpapers/nya0.png new file mode 100644 index 0000000..e9da5d5 Binary files /dev/null and b/files/wallpapers/nya0.png differ diff --git a/files/wallpapers/purple.jpg b/files/wallpapers/purple.jpg new file mode 100644 index 0000000..1898954 Binary files /dev/null and b/files/wallpapers/purple.jpg differ diff --git a/files/wallpapers/remote controller new.jpg b/files/wallpapers/remote controller new.jpg new file mode 100644 index 0000000..05f7340 Binary files /dev/null and b/files/wallpapers/remote controller new.jpg differ diff --git a/files/wallpapers/remote controller.jpg b/files/wallpapers/remote controller.jpg new file mode 100644 index 0000000..06590d0 Binary files /dev/null and b/files/wallpapers/remote controller.jpg differ diff --git a/files/wallpapers/sasaki.png b/files/wallpapers/sasaki.png new file mode 100644 index 0000000..68f5a11 Binary files /dev/null and b/files/wallpapers/sasaki.png differ diff --git a/files/wallpapers/windows.jpg b/files/wallpapers/windows.jpg new file mode 100644 index 0000000..7a8822f Binary files /dev/null and b/files/wallpapers/windows.jpg differ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..57b35f3 --- /dev/null +++ b/flake.lock @@ -0,0 +1,921 @@ +{ + "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1736102453, + "narHash": "sha256-5qb4kb7Xbt8jJFL/oDqOor9Z2+E+A+ql3PiyDvsfWZ0=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "4846091641f3be0ad7542086d52769bb7932bde6", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "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" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "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": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1737221749, + "narHash": "sha256-igllW0yG+UbetvhT11jnt9RppSHXYgMykYhZJeqfHs0=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "97d7946b5e107dd03cc82f21165251d4e0159655", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "home-manager", + "type": "github" + } + }, + "hy3": { + "inputs": { + "hyprland": [ + "hyprland" + ] + }, + "locked": { + "lastModified": 1737196945, + "narHash": "sha256-6Tmky4lHFzEAZ1Uh5l3aLNlHzTQQmvvpzm+/3BO97nk=", + "owner": "outfoxxed", + "repo": "hy3", + "rev": "6870b14a25670a09307761facae99d5213ffca19", + "type": "github" + }, + "original": { + "owner": "outfoxxed", + "repo": "hy3", + "type": "github" + } + }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1734906540, + "narHash": "sha256-vQ/L9hZFezC0LquLo4TWXkyniWtYBlFHAKIsDc7PYJE=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "69270ba8f057d55b0e6c2dca0e165d652856e613", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1736115290, + "narHash": "sha256-Jcn6yAzfUMcxy3tN/iZRbi/QgrYm7XLyVRl9g/nbUl4=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "52202272d89da32a9f866c0d10305a5e3d954c50", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprgraphics_2": { + "inputs": { + "hyprutils": [ + "hyprlock", + "hyprutils" + ], + "nixpkgs": [ + "hyprlock", + "nixpkgs" + ], + "systems": [ + "hyprlock", + "systems" + ] + }, + "locked": { + "lastModified": 1736115290, + "narHash": "sha256-Jcn6yAzfUMcxy3tN/iZRbi/QgrYm7XLyVRl9g/nbUl4=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "52202272d89da32a9f866c0d10305a5e3d954c50", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprgraphics_3": { + "inputs": { + "hyprutils": [ + "hyprpaper", + "hyprutils" + ], + "nixpkgs": [ + "hyprpaper", + "nixpkgs" + ], + "systems": [ + "hyprpaper", + "systems" + ] + }, + "locked": { + "lastModified": 1734906236, + "narHash": "sha256-vH/ysV2ONGQgYZPtcJKwc8jJivzyVxru2aaOxC20ZOE=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "6dea3fba08fd704dd624b6d4b261638fb4003c9c", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hypridle": { + "inputs": { + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1734384160, + "narHash": "sha256-zy2uzmlIORQV6VjIqSPhaoUKPLqfzpUQ5UTjmRfrkdg=", + "owner": "hyprwm", + "repo": "hypridle", + "rev": "413564cb986cfc67aeb7c4e750b42dc93ff9810f", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hypridle", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprgraphics": "hyprgraphics", + "hyprland-protocols": "hyprland-protocols", + "hyprland-qtutils": "hyprland-qtutils", + "hyprlang": "hyprlang_2", + "hyprutils": "hyprutils_2", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs_2", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems_2", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1737197318, + "narHash": "sha256-dzG7PTu2TvBhrVbx5ouFGclQBgfrLobiMH1LWGKSR+I=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "f56153a9c1b0a00fac0932a95e0cfa5a4f6c681f", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-plugins": { + "inputs": { + "hyprland": [ + "hyprland" + ], + "nixpkgs": [ + "hyprland-plugins", + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland-plugins", + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1737138010, + "narHash": "sha256-BcuNt1KC2WsxdUg4Km5vnLNccu91fteiOwvKEHFJa/Y=", + "owner": "hyprwm", + "repo": "hyprland-plugins", + "rev": "d2dad5b434b338d18458bafa506f2993c13f24fc", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-plugins", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1735774328, + "narHash": "sha256-vIRwLS9w+N99EU1aJ+XNOU6mJTxrUBa31i1r82l0V7s=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "e3b6af97ddcfaafbda8e2828c719a5af84f662cb", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprland-qtutils": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1736114838, + "narHash": "sha256-FxbuGQExtN37ToWYnGmO6weOYN6WPHN/RAqbr7gNPek=", + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "rev": "6997fe382dcf396704227d2b98ffdd5066da6959", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hypridle", + "hyprutils" + ], + "nixpkgs": [ + "hypridle", + "nixpkgs" + ], + "systems": [ + "hypridle", + "systems" + ] + }, + "locked": { + "lastModified": 1734364628, + "narHash": "sha256-ii8fzJfI953n/EmIxVvq64ZAwhvwuuPHWfGd61/mJG8=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "16e59c1eb13d9fb6de066f54e7555eb5e8a4aba5", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlang_2": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1735393019, + "narHash": "sha256-NPpqA8rtmDLsEmZOmz+qR67zsB6Y503Jnv+nSFLKJZ8=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "55608efdaa387af7bfdc0eddb404c409958efa43", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlang_3": { + "inputs": { + "hyprutils": [ + "hyprlock", + "hyprutils" + ], + "nixpkgs": [ + "hyprlock", + "nixpkgs" + ], + "systems": [ + "hyprlock", + "systems" + ] + }, + "locked": { + "lastModified": 1735393019, + "narHash": "sha256-NPpqA8rtmDLsEmZOmz+qR67zsB6Y503Jnv+nSFLKJZ8=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "55608efdaa387af7bfdc0eddb404c409958efa43", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlang_4": { + "inputs": { + "hyprutils": [ + "hyprpaper", + "hyprutils" + ], + "nixpkgs": [ + "hyprpaper", + "nixpkgs" + ], + "systems": [ + "hyprpaper", + "systems" + ] + }, + "locked": { + "lastModified": 1734906259, + "narHash": "sha256-P79t/7HbACO4/PuJBroGpTptvCWJtXTv+gWsF+sM6MI=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "0404833ea18d543df44df935ebf1b497310eb046", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlock": { + "inputs": { + "hyprgraphics": "hyprgraphics_2", + "hyprlang": "hyprlang_3", + "hyprutils": "hyprutils_3", + "hyprwayland-scanner": "hyprwayland-scanner_2", + "nixpkgs": "nixpkgs_3", + "systems": "systems_3" + }, + "locked": { + "lastModified": 1736953751, + "narHash": "sha256-hoc21ZMxcabYWGz4nB/jd6TdFqDY4KZoPLs/qNn0g0Q=", + "owner": "hyprwm", + "repo": "hyprlock", + "rev": "02639c27599b03c81dc1d0e031628224f5ad8d50", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlock", + "type": "github" + } + }, + "hyprpaper": { + "inputs": { + "hyprgraphics": "hyprgraphics_3", + "hyprlang": "hyprlang_4", + "hyprutils": "hyprutils_4", + "hyprwayland-scanner": "hyprwayland-scanner_3", + "nixpkgs": "nixpkgs_4", + "systems": "systems_4" + }, + "locked": { + "lastModified": 1736181224, + "narHash": "sha256-mOV9EZia1EKjGtoqwASZNo9gWVJt0GNwBdC5/iqkXws=", + "owner": "hyprwm", + "repo": "hyprpaper", + "rev": "251e8e2593cdd2ef0a015f4f6e211a7bab3a63ed", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprpaper", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hypridle", + "nixpkgs" + ], + "systems": [ + "hypridle", + "systems" + ] + }, + "locked": { + "lastModified": 1733502241, + "narHash": "sha256-KAUNC4Dgq8WQjYov5auBw/usaHixhacvb7cRDd0AG/k=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "104117aed6dd68561be38b50f218190aa47f2cd8", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprutils_2": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1736164519, + "narHash": "sha256-1LimBKvDpBbeX+qW7T240WEyw+DBVpDotZB4JYm8Aps=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "3c895da64b0eb19870142196fa48c07090b441c4", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprutils_3": { + "inputs": { + "nixpkgs": [ + "hyprlock", + "nixpkgs" + ], + "systems": [ + "hyprlock", + "systems" + ] + }, + "locked": { + "lastModified": 1736164519, + "narHash": "sha256-1LimBKvDpBbeX+qW7T240WEyw+DBVpDotZB4JYm8Aps=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "3c895da64b0eb19870142196fa48c07090b441c4", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprutils_4": { + "inputs": { + "nixpkgs": [ + "hyprpaper", + "nixpkgs" + ], + "systems": [ + "hyprpaper", + "systems" + ] + }, + "locked": { + "lastModified": 1734796073, + "narHash": "sha256-TnuKsa8OHrSJEmHm3TLGOWbPNA1gRjmZLsRzKrCqOsg=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "c3331116ebd0b71df5ae8c6efe9a7f94148b03bf", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1735493474, + "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "hyprwayland-scanner_2": { + "inputs": { + "nixpkgs": [ + "hyprlock", + "nixpkgs" + ], + "systems": [ + "hyprlock", + "systems" + ] + }, + "locked": { + "lastModified": 1735493474, + "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "hyprwayland-scanner_3": { + "inputs": { + "nixpkgs": [ + "hyprpaper", + "nixpkgs" + ], + "systems": [ + "hyprpaper", + "systems" + ] + }, + "locked": { + "lastModified": 1734793513, + "narHash": "sha256-rrrHcXapXJvGFqX+L/Bb0182L25jofAZ0fm1FInvrTQ=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "4d7367b6eee87397e2dbca2e78078dd0a4ef4c61", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1734119587, + "narHash": "sha256-AKU6qqskl0yf2+JdRdD0cfxX4b9x3KKV5RqA6wijmPM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3566ab7246670a43abd2ffa913cc62dad9cdf7d5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1736012469, + "narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1736012469, + "narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1734649271, + "narHash": "sha256-4EVBRhOjMDuGtMaofAIqzJbg4Ql7Ai0PSeuVZTHjyKQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d70bd19e0a38ad4790d3913bf08fcbfc9eeca507", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1737062831, + "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735882644, + "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "hy3": "hy3", + "hypridle": "hypridle", + "hyprland": "hyprland", + "hyprland-plugins": "hyprland-plugins", + "hyprlock": "hyprlock", + "hyprpaper": "hyprpaper", + "nixpkgs": "nixpkgs_5" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1734907020, + "narHash": "sha256-p6HxwpRKVl1KIiY5xrJdjcEeK3pbmc///UOyV6QER+w=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "d7f18dda5e511749fa1511185db3536208fb1a63", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..e196d70 --- /dev/null +++ b/flake.nix @@ -0,0 +1,38 @@ +{ + description = "NixOS configuration"; + + inputs = { + # nixpkgs + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + # home manager + home-manager.url = "github:nix-community/home-manager/master"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + # hyprland + hyprland.url = "github:hyprwm/Hyprland"; + # hyprlock + hyprlock.url = "github:hyprwm/hyprlock"; + # hyprpaper + hyprpaper.url = "github:hyprwm/hyprpaper"; + # hypridle + hypridle.url = "github:hyprwm/hypridle"; + # hyprland plugins + hyprland-plugins.url = "github:hyprwm/hyprland-plugins"; + hyprland-plugins.inputs.hyprland.follows = "hyprland"; + # hyprland hy3 + hy3.url = "github:outfoxxed/hy3"; + hy3.inputs.hyprland.follows = "hyprland"; + }; + + outputs = { nixpkgs, ... }@inputs: + let + options = import ./options.nix; + in rec { + nixosConfigurations = { + shinji = import ./hosts/shinji.nix { inherit inputs options; }; + }; + + homeConfigurations = { + shinji = nixosConfigurations.shinji.config.home-manager.users.${options.user}.home; + }; + }; +} diff --git a/hosts/shinji.nix b/hosts/shinji.nix new file mode 100644 index 0000000..4f6df81 --- /dev/null +++ b/hosts/shinji.nix @@ -0,0 +1,64 @@ +{ inputs, options, ... }: + +inputs.nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs; }; + system = "x86_64-linux"; + modules = [ + options + inputs.home-manager.nixosModules.home-manager + ../modules + { + # options + desktop.enable = true; + system.enable = true; + monitor = { + name = "eDP-1"; + scale = 1.25; + }; + + # bootloader + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + # hostname + networking.hostName = "shinji"; + + # kernel modules + boot.initrd.availableKernelModules = [ + "nvme" + "xhci_pci" + "thunderbolt" + "usb_storage" + "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + # firmware + hardware.enableRedistributableFirmware = true; + hardware.cpu.amd.updateMicrocode = true; + + # luks device + boot.initrd.luks.devices."root".device = "/dev/disk/by-uuid/ad489bfa-4280-44ea-8ad2-60347b516d60"; + + # root + fileSystems."/" = { + device = "/dev/disk/by-uuid/b43a7cf6-b9aa-44c2-ad29-da24ffa56901"; + fsType = "btrfs"; + }; + + # boot + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/6F93-6A0B"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + # swap + swapDevices = [ + { device = "/dev/disk/by-uuid/57caa02d-8569-43e3-8bf9-09dd6f02b191"; } + ]; + } + ]; +} diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..083e63c --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,175 @@ +{ config, lib, pkgs, ... }: + +{ + + imports = [ + ./programs + ./home.nix + ./system.nix + ]; + + options = { + + # Primary user of the system + user = lib.mkOption { + type = lib.types.str; + description = "Primary user of the system"; + }; + fullName = lib.mkOption { + type = lib.types.str; + description = "Human readable name of the user"; + }; + homePath = lib.mkOption { + type = lib.types.str; + description = "Home directory path of the user"; + default = "/home/${config.user}"; + }; + email = lib.mkOption { + type = lib.types.str; + description = "Primary email of the user"; + }; + + # Toggable components + desktop = { + enable = lib.mkEnableOption { + description = "Enable the gui."; + default = false; + }; + }; + system = { + enable = lib.mkEnableOption { + description = "Enable system services."; + default = false; + }; + }; + + # Monitor + monitor = { + name = lib.mkOption { + type = lib.types.str; + description = "Name of the primary monitor."; + default = ""; + }; + scale = lib.mkOption { + type = lib.types.float; + description = "Scale of the primary monitor."; + default = 1.0; + }; + }; + + # Theme of the system + theme = { + colors = lib.mkOption { + type = lib.types.attrs; + description = "base16 color scheme"; + default = (import ./themes).catppuccin.mocha; + }; + + accentColor = lib.mkOption { + type = lib.types.str; + description = "Theme accent color."; + default = config.theme.colors.base0D; + }; + + opacity = lib.mkOption { + type = lib.types.float; + description = "Window opacity."; + default = 1.0; + }; + + font = lib.mkOption { + type = lib.types.str; + description = "Theme primary font."; + default = "JetBrains Mono"; + }; + + fontSize = lib.mkOption { + type = lib.types.int; + description = "Theme primary font size."; + default = 14; + }; + + headerFont = lib.mkOption { + type = lib.types.str; + description = "Theme header font."; + default = "JetBrains Mono ExtraBold"; + }; + + monospaceFont = lib.mkOption { + type = lib.types.str; + description = "Theme monospace font."; + default = "monospace"; + }; + + iconFont = lib.mkOption { + type = lib.types.str; + description = "Theme icon font."; + default = "Font Awesome 6 Pro"; + }; + + borderWidth = lib.mkOption { + type = lib.types.int; + description = "Theme border width"; + default = 3; + }; + + outerRadius = lib.mkOption { + type = lib.types.int; + description = "Theme outer border radius."; + default = 5; + }; + + innerRadius = lib.mkOption { + type = lib.types.int; + description = "Theme inner border radius."; + default = 2; + }; + + outerGap = lib.mkOption { + type = lib.types.int; + description = "Theme outer gap/spacing."; + default = 10; + }; + + innerGap = lib.mkOption { + type = lib.types.int; + description = "Theme inner gap/spacing."; + default = 3; + }; + }; + + wallpaper = lib.mkOption { + type = lib.types.str; + description = "Path to wallpaper image"; + default = ""; + }; + + avatar = lib.mkOption { + type = lib.types.str; + description = "Path to avatar image"; + default = ""; + }; + }; + + config = { + + # use system packages in home manager + home-manager.useGlobalPkgs = true; + + # install user packages to /etc/profiles and not home directory + home-manager.useUserPackages = true; + + # allow flakes + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + # allow unfree packages + nixpkgs.config.allowUnfree = true; + + # set state version + home-manager.users.${config.user}.home.stateVersion = "25.05"; + home-manager.users.root.home.stateVersion = "25.05"; + system.stateVersion = "25.05"; + + }; + +} diff --git a/modules/home.nix b/modules/home.nix new file mode 100644 index 0000000..dcee2ec --- /dev/null +++ b/modules/home.nix @@ -0,0 +1,83 @@ +{ config, pkgs, ... }: + +{ + home-manager.users.${config.user} = { + + home.username = config.user; + home.homeDirectory = config.homePath; + + news.display = "silent"; + fonts.fontconfig.enable = true; + nixpkgs.config.allowUnfree = true; + + home.packages = with pkgs; [ + # c / c++ + gcc + nasm + pkg-config + # rust + rustc + rustfmt + rust-analyzer + cargo + clippy + # programs + cage + easyeffects + discord + element-desktop + fd + gamescope + gajim + gimp + imagemagick + libnotify + mpv + pavucontrol + pfetch-rs + rsync + starship + steam + thunderbird + wine + wl-clip-persist + yt-dlp + zathura + # gtk + orchis-theme + ]; + + home.file = { + ".ssh/config".source = ../files/config/ssh/config; + ".zshrc".source = ../files/config/zsh/zshrc; + ".zprofile".source = ../files/config/zsh/zprofile; + }; + + xdg.configFile = { + iris = { + source = ../files/config/iris; + recursive = true; + }; + nvim = { + source = ../files/config/nvim; + recursive = true; + }; + }; + + xdg.dataFile = { + fonts = { + source = ../files/fonts; + recursive = true; + }; + }; + + gtk = { + enable = true; + gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; + }; + + programs.home-manager.enable = true; + + }; +} + diff --git a/modules/programs/default.nix b/modules/programs/default.nix new file mode 100644 index 0000000..20c3610 --- /dev/null +++ b/modules/programs/default.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + imports = [ + ./firefox + ./git + ./gnupg + ./hypr + ./kitty + ./mako + ./starship + ./waybar + ./wofi + ./zsh + ]; +} diff --git a/modules/programs/firefox/default.nix b/modules/programs/firefox/default.nix new file mode 100644 index 0000000..dce7d0b --- /dev/null +++ b/modules/programs/firefox/default.nix @@ -0,0 +1,88 @@ +{ config, lib, pkgs, ... }: + +let + + extraPrefs = ''// + +// Automatically click cookiebanners although uBlock Origin might block them +lockPref("cookiebanners.bannerClicking.enabled", true); +lockPref("cookiebanners.service.mode", 2); +lockPref("cookiebanners.service.mode.privateBrowsing", 2); + +// DNT although PrivacyBadger from policy handles this +lockPref("privacy.donottrackheader.enabled", true); +lockPref("privacy.donottrackheader.value", 1); + +// New sidebar +lockPref("sidebar.revamp", true); +lockPref("sidebar.verticalTabs", true); +lockPref("sidebar.visibility", "always-show"); +lockPref("sidebar.main.tools", "history,bookmarks"); + +//''; + + userChrome = '' +/* sidebar hack to flip contents the way i want them (arrows on the left) */ +#nav-bar-customization-target { + flex-direction: row-reverse; +} + +/* remove broken padding from sidebar hack */ +#unified-extensions-button { + padding-left: 0 !important; +} + +/* remove padding beside search bar */ +toolbarspring { + display: none !important; +} + +/* remove overflow menu and everything in it */ +#nav-bar-overflow-button, +#firefox-view-button, +#alltabs-button { + visibility: collapse; +} +''; + + my-firefox = (pkgs.firefox.override { + extraPrefs = extraPrefs; + }); + +in +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + programs.firefox = { + + enable = true; + package = my-firefox; + + # import configuration + policies = import ./policies.nix; + + # create profile for me :3 + profiles.${config.user} = { + search = { + force = true; + default = "DuckDuckGo"; + engines = { + "Google".metaData.hidden = true; + "Bing".metaData.hidden = true; + "Amazon.com".metaData.hidden = true; + "eBay".metaData.hidden = true; + "Twitter".metaData.hidden = true; + }; + }; + + # firefox doesnt make styling the toolbar easy using about:config + # since its just a massive json string. so i did it here in css. + userChrome = userChrome; + }; # end profile + + }; + }; + + }; +} diff --git a/modules/programs/firefox/extensions.nix b/modules/programs/firefox/extensions.nix new file mode 100644 index 0000000..ebc3003 --- /dev/null +++ b/modules/programs/firefox/extensions.nix @@ -0,0 +1,58 @@ +{ + + # extensions to be auto downloaded into + # firefox + + # dont allow extensions to be installed though + # firefox, they must be described here! + "*".installation_mode = "blocked"; + + # uBlock Origin + "uBlock0@raymondhill.net" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + installation_mode = "force_installed"; + }; + + # Bitwarden + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi"; + installation_mode = "force_installed"; + }; + + # User Agent Switcher + "user-agent-switcher@ninetailed.ninja" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/uaswitcher/latest.xpi"; + installation_mode = "force_installed"; + }; + + # SponsorBlock + "sponsorBlocker@ajay.app" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi"; + installation_mode = "force_installed"; + }; + + # Privacy Badger + "jid1-MnnxcxisBPnSXQ@jetpack" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi"; + installation_mode = "force_installed"; + }; + + # FoxyProxy + "foxyproxy@eric.h.jung" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/foxyproxy-standard/latest.xpi"; + installation_mode = "force_installed"; + }; + + # Redirector + "redirector@einaregilsson.com" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/redirector/latest.xpi"; + installation_mode = "force_installed"; + }; + + # linkding + "{61a05c39-ad45-4086-946f-32adb0a40a9d}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/linkding-extension/latest.xpi"; + installation_mode = "force_installed"; + }; + +} diff --git a/modules/programs/firefox/policies.nix b/modules/programs/firefox/policies.nix new file mode 100644 index 0000000..5b49f65 --- /dev/null +++ b/modules/programs/firefox/policies.nix @@ -0,0 +1,142 @@ +{ + + # policies to be set in firefox + # see: https://mozilla.github.io/policy-templates/ + + ExtensionSettings = import ./extensions.nix; + Preferences = import ./preferences.nix; + + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + EmailTracking = true; + }; + + # Certificates + Certificates = { + ImportEnterpriseRoots = true; + Install = [ + "freya_ca.crt" + "tinternet.crt" + ]; + }; + + # Cookies + Cookies = { + Behavior = "reject-foreign"; + BehaviorPrivateBrowsing = "reject-foreign"; + Locked = true; + }; + + # DNS + DNSOverHTTPS = { + Enabled = false; + Locked = true; + }; + + # Disable Bad + DisableAppUpdate = true; + DisableAccounts = true; + DisableFirefoxAccounts = true; + DisableFirefoxScreenshots = true; + DisableFirefoxStudies = true; + DisablePocket = true; + DisableTelemetry = true; + AutofillAddressEnabled = false; + AutofillCreditCardEnabled = false; + + # Disable Certain Messages + UserMessaging = { + WhatsNew = false; + ExtensionRecommendations = false; + FeatureRecommendations = false; + UrlbarInterventions = false; + SkipOnboarding = true; + MoreFromMozilla = false; + Labs = false; + Locked = true; + }; + + # Disable Password Manager + DisableMasterPasswordCreation = true; + PasswordManagerEnabled = false; + PrimaryPassword = false; + OfferToSaveLogins = false; + + # Remove Special Pages + OverrideFirstRunPage = ""; + OverridePostUpdatePage = ""; + + # Start Page + Homepage = { + StartPage = "previous-session"; + Locked = true; + }; + + # Home Page + FirefoxHome = { + Search = true; + TopSites = false; + SponsoredTopSites = false; + Highlights = false; + Pocket = false; + SponsoredPocket = false; + Snippets = false; + Locked = true; + }; + + # Search Suggestions + SearchSuggestEnabled = true; + FirefoxSuggest = { + WebSuggestions = false; + SponsoredSuggestions = false; + ImproveSuggest = false; + Locked = true; + }; + + # Save All on Shutdown + SanitizeOnShutdown = { + Cache = false; + Cookies = false; + Downloads = false; + Histroy = false; + Sessions = false; + SiteSettings = false; + OfflineApps = false; + Locked = true; + }; + + # Popups + PopupBlocking = { + Default = true; + Locked = true; + }; + + # Allow Bypasses + DisableSecurityBypass = { + InvalidCertificate = false; + SafeBrowsing = false; + }; + + # PictureInPicure + PictureInPicture = { + Enabled = true; + Locked = true; + }; + + # Topbar + SearchBar = "unified"; + DisplayMenuBar = "default-off"; + DisplayBookmarksToolbar = "newtab"; + NoDefaultBookmarks = true; + + # Miscellaneous + HttpsOnlyMode = "force_enabled"; + HardwareAcceleration = true; + DontCheckDefaultBrowser = true; + PromptForDownloadLocation = false; + PrivateBrowsingModeAvailability = 0; + +} diff --git a/modules/programs/firefox/preferences.nix b/modules/programs/firefox/preferences.nix new file mode 100644 index 0000000..a8ac797 --- /dev/null +++ b/modules/programs/firefox/preferences.nix @@ -0,0 +1,131 @@ +let + # quick variables to specify + # locked true/false + lock-false = { + Value = false; + Status = "locked"; + }; + lock-true = { + Value = true; + Status = "locked"; + }; +in +{ + + # about:config Preferences + # ... set policies that cannot be set using policies.json directly + + # allow userChrom.css + "toolkit.legacyUserProfileCustomizations.stylesheets" = lock-true; + + # dark theme + "extensions.activeThemeID" = { + Value = "firefox-compact-dark@mozilla.org"; + Status = "locked"; + }; + "layout.css.prefers-color-scheme.content-override" = { + Value = 0; + Status = "locked"; + }; + + # homepage + "browser.startup.homepage" = { + Value = "about:home"; + Status = "locked"; + }; + "browser.newtabpage.enabed" = lock-true; + "browser.newtabpage.url" = { + Value = "about:home"; + Status = "locked"; + }; + + # autofill + "browser.autofill.enabled" = lock-false; + "browser.formfill.enable" = lock-false; + + # search enable + "browser.urlbar.suggest.recentsearches" = lock-true; + "browser.urlbar.suggest.bookmark" = lock-true; + "browser.urlbar.suggest.clipboard" = lock-true; + "browser.urlbar.suggest.history" = lock-true; + + # search disable + "browser.urlbar.suggest.addons" = lock-false; + "browser.urlbar.suggest.calculator" = lock-false; + "browser.urlbar.suggest.engines" = lock-false; + "browser.urlbar.suggest.fakespot" = lock-false; + "browser.urlbar.suggest.mdn" = lock-false; + "browser.urlbar.suggest.openpage" = lock-false; + "browser.urlbar.suggest.pocket" = lock-false; + "browser.urlbar.suggest.remotetab" = lock-false; + "browser.urlbar.suggest.topsites" = lock-false; + "browser.urlbar.suggest.trending" = lock-false; + "browser.urlbar.suggest.weather" = lock-false; + "browser.urlbar.suggest.yelp" = lock-false; + + # privacy + "privacy.globalprivacycontrol.enabled" = lock-true; + + # security + "security.OCSP.enabled" = { + Value = 0; + Status = "locked"; + }; + "browser.contentblocking.category" = { + Value = "strict"; + Status = "locked"; + }; + "xpinstall.whitelist.required" = lock-true; + "signon.management.page.breach-alerts.enabled" = lock-false; + + # graphics + "dom.webgpu.enabled" = lock-true; + "media.eme.enabled" = lock-true; + + # user messaging + # ... disable shit that is annoying + "browser.newtabpage.activity-stream.feeds.section.topstories" = lock-false; + "browser.newtabpage.activity-stream.feeds.snippets" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includePocket" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeVisited" = lock-false; + "browser.newtabpage.activity-stream.showSponsored" = lock-false; + "browser.newtabpage.activity-stream.system.showSponsored" = lock-false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = lock-false; + "browser.newtabpage.activity-stream.showWeather" = lock-false; + "browser.newtabpage.activity-stream.newtabWallpapers.enabled" = lock-false; + "browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled" = lock-false; + "browser.newtabpage.activity-stream.default.sites" = { + Value = ""; + Status = "locked"; + }; + + # safebrowsing + "browser.safebrowsing.malware.enabled" = lock-true; + "browser.safebrowsing.phishing.enabled" = lock-true; + "browser.safebrowsing.downloads.enabled" = lock-true; + "browser.safebrowsing.downloads.remote.block_uncommon" = lock-false; + "browser.safebrowsing.downloads.remote.block_potentially_unwanted" = lock-false; + + # sidebar + "browser.tabs.inTitlebar" = { + Value = 0; + Status = "locked"; + }; + "browser.tabs.warnOnClose" = lock-true; + "browser.tabs.firefox-view" = lock-false; + "browser.tabs.closeTabByDblclick" = lock-true; + "ui.key.menuAccessKeyFocuses" = lock-false; + + # general settings + "general.autoScroll" = lock-false; + "general.smoothScroll" = lock-true; + "widget.gtk.overlay-scrollbars.enabled" = lock-false; + "accessibility.browsewithcaret" = lock-false; + "accessibility.typeaheadfind" = lock-false; + "media.hardwaremediakeys.enabled" = lock-true; + "browser.crashReports.unsubmittedCheck.autoSubmit2" = lock-false; + "browser.aboutConfig.showWarning" = lock-false; + +} diff --git a/modules/programs/git/default.nix b/modules/programs/git/default.nix new file mode 100644 index 0000000..a3fe80d --- /dev/null +++ b/modules/programs/git/default.nix @@ -0,0 +1,24 @@ +{ config, ... }: + +{ + config = { + + home-manager.users.${config.user} = { + programs.git = { + enable = true; + userName = config.user; + userEmail = config.fullName; + + signing = { + key = "D9AF0A4209B7C2DE11A884BFACBC553660D9993D"; + signByDefault = true; + }; + + extraConfig = { + init.defaultBranch = "main"; + }; + }; + }; + + }; +} diff --git a/modules/programs/gnupg/default.nix b/modules/programs/gnupg/default.nix new file mode 100644 index 0000000..67be4bc --- /dev/null +++ b/modules/programs/gnupg/default.nix @@ -0,0 +1,25 @@ +{ config, pkgs, ... }: + +{ + config = { + + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + pinentryPackage = pkgs.pinentry-gtk2; + }; + + home-manager.users.${config.user} = { + programs.gpg = { + enable = true; + publicKeys = [ + { + source = ../../../files/keys/freya-gpg.pub; + trust = 5; + } + ]; + }; + }; + + }; +} diff --git a/modules/programs/hypr/default.nix b/modules/programs/hypr/default.nix new file mode 100644 index 0000000..08b2d93 --- /dev/null +++ b/modules/programs/hypr/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./hypridle.nix + ./hyprland.nix + ./hyprlock.nix + ./hyprpaper.nix + ]; +} diff --git a/modules/programs/hypr/hypridle.nix b/modules/programs/hypr/hypridle.nix new file mode 100644 index 0000000..f69db63 --- /dev/null +++ b/modules/programs/hypr/hypridle.nix @@ -0,0 +1,56 @@ +{ config, pkgs, lib, inputs, ... }: + +let + # inputs + system = pkgs.stdenv.hostPlatform.system; + hypridle = inputs.hypridle.packages.${system}; +in +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + services.hypridle = { + + enable = true; + package = hypridle.hypridle; + + settings = { + general = { + lock_cmd = "pidof hyprlock || hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + ignore_dbus_inhibit = false; + }; + + listener = [ + # dim screen + { + timeout = 150; + on-timeout = "brightnessctl -s set 10"; + on-resume = "brightnessctl -r"; + } + # dim keyboard backlight + { + timeout = 150; + on-timeout = "brightnessctl -sd rgb:kbd_backlight set 0"; + on-resume = "brightnessctl -rd rgb:kbd_backlight"; + } + # lock + { + timeout = 300; + on-timeout = "loginctl lock-session"; + } + # turn off screen + { + timeout = 350; + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + ]; + }; + }; + }; + + }; +} + diff --git a/modules/programs/hypr/hyprland.nix b/modules/programs/hypr/hyprland.nix new file mode 100644 index 0000000..6ae9afd --- /dev/null +++ b/modules/programs/hypr/hyprland.nix @@ -0,0 +1,302 @@ +{ config, pkgs, lib, inputs, ... }: + +let + # inputs + system = pkgs.stdenv.hostPlatform.system; + hyprland = inputs.hyprland.packages.${system}; + hyprland-plugins = inputs.hyprland-plugins.packages.${system}; + hy3 = inputs.hy3.packages.${system}; + + browser = "firefox"; + launcher = "wofi --show drun --prompt \"Search Program\""; + lock_screen = "hyprlock"; + terminal = "kitty"; +in +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + wayland.windowManager.hyprland = { + + enable = true; + package = hyprland.hyprland; + + # Plugins + plugins = [ + hyprland-plugins.hyprexpo + hy3.hy3 + ]; + + # Config + settings = { + # Monitors + monitor = [ + "${config.monitor.name}, highres, auto, ${toString config.monitor.scale}" + ]; + + # Autostart + exec-once = [ + "waybar" + "thunderbird" + "discord --enable-features=UseOzonePlatform --ozone-platform=wayland" + "element-desktop --enable-features=UseOzonePlatform --ozone-platform=wayland" + ]; + + # General + general = { + gaps_in = config.theme.innerGap; + gaps_out = config.theme.outerGap; + layout = "hy3"; + resize_on_border = "yes"; + extend_border_grab_area = 20; + border_size = config.theme.borderWidth; + "col.active_border" = "rgb(${config.theme.accentColor})"; + "col.inactive_border" = "rgb(${config.theme.colors.base04})"; + }; + + # Gestures + gestures = { + workspace_swipe = true; + workspace_swipe_fingers = 3; + workspace_swipe_forever = true; + workspace_swipe_cancel_ratio = 0.15; + }; + + # Decoration + decoration = { + rounding = config.theme.outerRadius; + shadow.enabled = false; + blur = { + enabled = true; + size = 4; + passes = 2; + noise = 0.008; + contrast = 0.8916; + brightness = 0.8; + }; + }; + + # Animations + animations = { + enabled = true; + + bezier = [ + "windowIn, 0.06, 0.71, 0.25, 1" + "windowResize, 0.04, 0.67, 0.38, 1" + ]; + + animation = [ + "windowsIn, 1, 3, windowIn, slide #popin 20%" + "windowsOut, 1, 3, windowIn, slide #popin 70%" + "windowsMove, 1, 2.5, windowResize" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 3, default" + "workspaces, 1, 6, default" + "layers, 1, 5, windowIn, slide" + ]; + }; + + # Environment + env = [ + "XDG_CURRENT_DESKTOP,Hyprland" + "XDG_SESSION_DESKTOP,Hyprland" + + "XCURSOR_THEME,Adwaita" + "XCURSOR_SIZE,24" + + "GTK_THEME,Orchis-Teal-Dark" + "GDK_SCALE,${toString config.monitor.scale}" + + "MOZ_ENABLE_WAYLAND,1" + "MOZ_USE_XINPUT,1" + "_JAVA_AWT_WM_NONREPARENTING,1" + ]; + + # Input + input = { + kb_layout = "us"; + kb_variant = ""; + kb_model = ""; + kb_options = "gtp:alt_shit_toggle, compose:ralt"; + kb_rules = ""; + follow_mouse = 1; + touchpad = { + natural_scroll = "yes"; + }; + sensitivity = 0; + }; + + # Keybinds + "$mod" = "SUPER"; + bind = [ + # Launch programs + + "$mod, W, exec, ${browser}" + "$mod, D, exec, ${launcher}" + "$mod, L, exec, ${lock_screen}" + "$mod, Return, exec, ${terminal}" + + # Misc + + "$mod SHIFT, L, exit" + "$mod, tab, hyprexpo:expo, toggle" + + # Window operations + + "$mod SHIFT, Q, killactive" + "$mod SHIFT, SPACE, togglefloating" + "$mod, F, fullscreen" + "$mod, J, togglesplit" + + # Move focus with mod + arrow keys + + "$mod, left, movefocus, l" + "$mod, right, movefocus, r" + "$mod, up, movefocus, u" + "$mod, down, movefocus, d" + + # Move window across workspace with mod + arrow keys + + "$mod SHIFT, left, hy3:movewindow, l" + "$mod SHIFT, right, hy3:movewindow, r" + "$mod SHIFT, up, hy3:movewindow, u" + "$mod SHIFT, down, hy3:movewindow, d" + + # Switch workspaces with mod + [0-9] + + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + + # Move active window to a workspace with mod + SHIFT + [0-9] + + "$mod SHIFT, 1, movetoworkspacesilent, 1" + "$mod SHIFT, 2, movetoworkspacesilent, 2" + "$mod SHIFT, 3, movetoworkspacesilent, 3" + "$mod SHIFT, 4, movetoworkspacesilent, 4" + "$mod SHIFT, 5, movetoworkspacesilent, 5" + "$mod SHIFT, 6, movetoworkspacesilent, 6" + "$mod SHIFT, 7, movetoworkspacesilent, 7" + "$mod SHIFT, 8, movetoworkspacesilent, 8" + "$mod SHIFT, 9, movetoworkspacesilent, 9" + "$mod SHIFT, 0, movetoworkspacesilent, 10" + + # Move to tab + + "LALT, 1, hy3:focustab, index, 01" + "LALT, 2, hy3:focustab, index, 02" + "LALT, 3, hy3:focustab, index, 03" + "LALT, 4, hy3:focustab, index, 04" + "LALT, 5, hy3:focustab, index, 05" + "LALT, 6, hy3:focustab, index, 06" + "LALT, 7, hy3:focustab, index, 07" + "LALT, 8, hy3:focustab, index, 08" + "LALT, 9, hy3:focustab, index, 09" + "LALT, 0, hy3:focustab, index, 10" + + "$mod SHIFT, B, hy3:makegroup, h" + "$mod SHIFT, V, hy3:makegroup, v" + "$mod SHIFT, C, hy3:changegroup, toggletab" + + # Scroll through existing workspaces with mod + scroll + + "$mod, mouse_down, workspace, e+1" + "$mod, mouse_up, workspace, e-1" + ]; + + bindn = [ + # Focus windows with scroll wheel or middle click + + ", mouse:272, hy3:focustab, mouse" + ", mouse_down, hy3:focustab, l, require_hovered" + ", mouse_up, hy3:focustab, r, require_hovered" + ]; + + bindm = [ + # Move/resize windows with mod + LMB/RMB and dragging + + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + binde = [ + # Audio + + # raise volume + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" + # lower volume + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + # mute speaker + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + # mute mic + ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + + # Media + + # play + ", XF86AudioPlay, exec, playerctl play-pause" + # next + ", XF86AudioNext, exec, playerctl next" + # prev + ", XF86AudioPrev, exec, playerctl previous" + + # Backlight + + ", XF86MonBrightnessDown, exec, brightnessctl set 5%-" + ", XF86MonBrightnessUp, exec, brightnessctl set 5%+" + ]; + + # Plugin configuration + plugin = { + # hy3 + hy3 = { + tabs = { + height = 24; + text_height = 9; + text_padding = 10; + padding = 2; + render_text = true; + text_font = "monospace"; + radius = config.theme.outerRadius; + + "col.active" = "rgb(${config.theme.colors.base00})"; + "col.inactive" = "rgb(${config.theme.colors.base00})"; + "col.text.active" = "rgb(${config.theme.colors.base05})"; + "col.text.inactive" = "rgb(${config.theme.colors.base05})"; + "col.border.active" = "rgb(${config.theme.accentColor})"; + "col.border.inactive" = "rgb(${config.theme.colors.base04})"; + }; + + autotile = { + enable = true; + }; + }; + }; + + # XWayland + xwayland = { + force_zero_scaling = "true"; + use_nearest_neighbor = "false"; + }; + + # Misc + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + key_press_enables_dpms = true; + mouse_move_enables_dpms = true; + vrr = 1; + }; + }; + }; + }; + + }; +} diff --git a/modules/programs/hypr/hyprlock.nix b/modules/programs/hypr/hyprlock.nix new file mode 100644 index 0000000..e80b020 --- /dev/null +++ b/modules/programs/hypr/hyprlock.nix @@ -0,0 +1,96 @@ +{ config, pkgs, lib, inputs, ... }: + +let + # inputs + system = pkgs.stdenv.hostPlatform.system; + hyprlock = inputs.hyprlock.packages.${system}; +in +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + programs.hyprlock = { + + enable = true; + package = hyprlock.hyprlock; + + settings = { + + background = { + monitor = ""; + path = config.wallpaper; + blur_passes = 3; + contrast = 0.8916; + brightness = 0.8172; + vibrancy = 0.1696; + vibrancy_darkness = 0.0; + }; + + general = { + no_fade_in = false; + grace = 0; + disable_loading_bar = true; + }; + + input-field = { + monitor = ""; + size = "250, 60"; + outline_thickness = 2; + dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + outer_color = "rgba(0, 0, 0, 0)"; + inner_color = "rgba(0, 0, 0, 0.5)"; + font_color = "rgb(${config.theme.colors.base05})"; + font_family = config.theme.font; + fade_on_empty = false; + placeholder_text = "<i><span foreground=\"#${config.theme.colors.base05}\">Input Password...</span></i>"; + hide_input = false; + position = "0, -120"; + halign = "center"; + valign = "center"; + }; + + label = [ + # Clock + { + monitor = ""; + text = "cmd[update:1000] echo \"$(date +\"%-H:%M:%S\")\""; + font_size = 80; + font_color = "rgb(${config.theme.colors.base05})"; + font_family = config.theme.headerFont; + position = "0, 500"; + halign = "center"; + valign = "center"; + } + + # Name + { + monitor = ""; + text = config.fullName; + font_color = "rgb(${config.theme.colors.base05})"; + font_family = config.theme.headerFont; + font_size = 25; + position = "0, 50"; + halign = "center"; + valign = "center"; + } + ]; + + # Profile image + image = { + monitor = ""; + path = config.avatar; + size = 300; + rounding = -1; + border_size = 0; + position = "0, 250"; + halign = "center"; + valign = "center"; + }; + }; + }; + }; + + }; +} diff --git a/modules/programs/hypr/hyprpaper.nix b/modules/programs/hypr/hyprpaper.nix new file mode 100644 index 0000000..1d6b0cd --- /dev/null +++ b/modules/programs/hypr/hyprpaper.nix @@ -0,0 +1,28 @@ +{ config, pkgs, lib, inputs, ... }: + +let + # inputs + system = pkgs.stdenv.hostPlatform.system; + hyprpaper = inputs.hyprpaper.packages.${system}; +in +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + services.hyprpaper = { + + enable = true; + package = hyprpaper.hyprpaper; + + settings = { + preload = config.wallpaper; + wallpaper = ",${config.wallpaper}"; + splash = false; + }; + + }; + }; + + }; +} + diff --git a/modules/programs/kitty/default.nix b/modules/programs/kitty/default.nix new file mode 100644 index 0000000..f148e96 --- /dev/null +++ b/modules/programs/kitty/default.nix @@ -0,0 +1,88 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + programs.kitty = { + + enable = true; + environment = { }; + extraConfig = ""; + + settings = { + # Font + font_family = config.theme.monospaceFont; + font_size = 11; + bold_font = "auto"; + italic_font = "auto"; + bold_italic_font = "auto"; + + # Scrollback + scrollback_lines = 10000; + scrollback_pager_history_size = 300; # MB + + # Urls + detect_urls = true; + show_hyperlink_targets = false; + + # Window + window_padding_width = config.theme.outerGap; + window_border_width = 0; + draw_minimal_borders = true; + background_opacity = config.theme.opacity; + + # Disable audio + enable_audio_bell = false; + + # Disable close prompt + confirm_os_window_close = 0; + + # colors + background = "#${config.theme.colors.base00}"; + foreground = "#${config.theme.colors.base05}"; + selection_background = "#${config.theme.colors.base05}"; + selection_foreground = "#${config.theme.colors.base00}"; + url_color = "#${config.theme.colors.base04}"; + cursor = "#${config.theme.colors.base05}"; + active_border_color = "#${config.theme.colors.base03}"; + inactive_border_color = "#${config.theme.colors.base01}"; + active_tab_background = "#${config.theme.colors.base00}"; + active_tab_foreground = "#${config.theme.colors.base05}"; + inactive_tab_background = "#${config.theme.colors.base01}"; + inactive_tab_foreground = "#${config.theme.colors.base04}"; + tab_bar_background = "#${config.theme.colors.base01}"; + + # normal + color0 = "#${config.theme.colors.base00}"; + color1 = "#${config.theme.colors.base08}"; + color2 = "#${config.theme.colors.base0B}"; + color3 = "#${config.theme.colors.base0A}"; + color4 = "#${config.theme.colors.base0D}"; + color5 = "#${config.theme.colors.base0E}"; + color6 = "#${config.theme.colors.base0C}"; + color7 = "#${config.theme.colors.base05}"; + + # bright + color8 = "#${config.theme.colors.base03}"; + color9 = "#${config.theme.colors.base08}"; + color10 = "#${config.theme.colors.base0B}"; + color11 = "#${config.theme.colors.base0A}"; + color12 = "#${config.theme.colors.base0D}"; + color13 = "#${config.theme.colors.base0E}"; + color14 = "#${config.theme.colors.base0C}"; + color15 = "#${config.theme.colors.base07}"; + + # extended base16 colors + color16 = "#${config.theme.colors.base09}"; + color17 = "#${config.theme.colors.base0F}"; + color18 = "#${config.theme.colors.base01}"; + color19 = "#${config.theme.colors.base02}"; + color20 = "#${config.theme.colors.base04}"; + color21 = "#${config.theme.colors.base06}"; + }; + }; + }; + + }; +} diff --git a/modules/programs/mako/default.nix b/modules/programs/mako/default.nix new file mode 100644 index 0000000..3987d0d --- /dev/null +++ b/modules/programs/mako/default.nix @@ -0,0 +1,32 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + services.mako = { + + enable = true; + + font = "${config.theme.font} 11"; + + margin = toString config.theme.outerGap; + padding = toString config.theme.innerGap; + + backgroundColor = "#${config.theme.colors.base00}"; + progressColor = "#${config.theme.colors.base00}"; + textColor = "#${config.theme.colors.base05}"; + + borderColor = "#${config.theme.accentColor}"; + borderSize = config.theme.borderWidth; + borderRadius = 0; + + defaultTimeout = 5000; + layer = "overlay"; + icons = true; + + }; + }; + + }; +} diff --git a/modules/programs/starship/default.nix b/modules/programs/starship/default.nix new file mode 100644 index 0000000..a22909f --- /dev/null +++ b/modules/programs/starship/default.nix @@ -0,0 +1,52 @@ +{ config, lib, ... }: + +{ + config = { + + home-manager.users.${config.user} = { + programs.starship = { + + enable = true; + + settings = { + format = lib.concatStrings [ + "╭─ " + "$username" + "$hostname" + "$git_branch" + "$directory" + "$line_break" + "╰─ " + ]; + + username = { + style_user = "bold purple"; + style_root = "bold purple"; + format = "[$user]($style) "; + disabled = false; + show_always = true; + }; + + hostname = { + ssh_only = false; + format = "on [$hostname](bold blue) "; + disabled = false; + }; + + directory = { + format = "[$path]($style)[$read_only]($read_only_style) "; + truncation_length = -1; + truncate_to_repo = false; + truncation_symbol = "…/"; + }; + + git_branch = { + style = "bold fg:97"; + format = "at [$symbol$branch(:$remote_branch)]($style) "; + }; + }; + }; + }; + + }; +} diff --git a/modules/programs/waybar/default.nix b/modules/programs/waybar/default.nix new file mode 100644 index 0000000..702e3d5 --- /dev/null +++ b/modules/programs/waybar/default.nix @@ -0,0 +1,212 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + programs.waybar = { + + enable = true; + + settings = [{ + height = 24; + layer = "top"; + position = "top"; + spacing = 4; + + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + ]; + modules-center = [ + ]; + modules-right = [ + "battery" + "wireplumber" + "network" + "clock" + "tray" + ]; + + "hyprland/workspaces" = { + disable-scroll = true; + all-outputs = true; + format = "{name}"; + }; + + battery = { + interval = 1; + states = { + warning = 30; + critical = 15; + }; + forma = " {capacity}%"; + format-charging = " {capacity}%"; + format-plugged = " {capacity}%"; + format-full = " {capacity}%"; + format-warning = " {capacity}%"; + format-critical = " {capacity}%"; + }; + + wireplumber = { + format = " {volume}%"; + format-bluetooth = " {volume}%"; + format-muted = " muted"; + scroll-step = 1; + on-click = "pavucontrol"; + ignored-sinks = ["Easy Effects Sink"]; + }; + + network = { + format = " disconnected"; + format-wifi = " {essid}"; + format-ethernet = " {ipaddr}/{cidr}"; + format-disconnected = " disconnected"; + max-length = 50; + on-click = "nm-connection-editor"; + }; + + clock = { + interval = 1; + format = "{:%Y-%m-%d %a %H:%M:%S}"; + }; + + tray = { + spacing = config.theme.outerGap; + }; + }]; + + style = + let + accentColor = "#${config.theme.accentColor}"; + textColor = "#${config.theme.colors.base05}"; + baseColor = "#${config.theme.colors.base00}"; + surfaceColor = "#${config.theme.colors.base02}"; + greenColor = "#${config.theme.colors.base0B}"; + yellowColor = "#${config.theme.colors.base0A}"; + redColor = "#${config.theme.colors.base08}"; + fontSize = "${toString config.theme.fontSize}px"; + outerGap = "${toString config.theme.outerGap}px"; + innerGap = "${toString config.theme.innerGap}px"; + outerRadius = "${toString config.theme.outerRadius}px"; + innerRadius = "${toString config.theme.innerRadius}px"; + borderWidth = "${toString config.theme.borderWidth}px"; + in '' + +/** Base */ + +window#waybar { + font-family: "${config.theme.font}", "${config.theme.iconFont}", "${config.theme.monospaceFont}"; + font-size: ${fontSize}; + color: ${textColor}; + background-color: transparent; +} + +window#waybar > box { + margin: ${outerGap}; + margin-bottom: 0px; +} + +.modules-left, +.modules-right { + padding: ${innerGap} 0px; + border-radius: ${outerRadius}; + background-color: @base; + border: ${borderWidth} solid ${accentColor}; +} + +/** Workspaces */ + +#workspaces { + margin-left: ${innerGap}; +} + +#workspaces button { + all: initial; + color: ${textColor}; + background-color: transparent; + border-radius: ${innerRadius}; + padding: ${innerGap} ${outerGap}; +} + +#workspaces button.focused, +#workspaces button.active { + background-color: ${accentColor}; + color: ${baseColor}; +} + +#workspaces button.urgent { + background-color: ${redColor}; +} + +/** Window */ + +window#waybar:not(.empty) #window { + padding: 0 ${outerGap}; + border-left: ${borderWidth} solid ${surfaceColor}; + margin: 0 ${innerGap}; +} + +/** Tray */ + +#tray { + border: none; + margin-right: ${outerGap}; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; +} + +/** Right modules */ + +#battery, +#wireplumber, +#network, +#clock { + padding: 0 ${outerGap}; + border-right: ${borderWidth} solid ${surfaceColor}; + color: @text; +} + +/** Battery */ + +#battery.charging { + color: ${greenColor}; +} + +#battery.warning:not(.charging) { + color: ${yellowColor}; +} + +#battery.critical:not(.charging) { + color: ${redColor}; +} + +/** Wireplumber */ + +#wireplumber.muted { + color: ${redColor}; +} + +/** Network */ + +#network.wifi, +#network.ethernet { + color: ${greenColor}; +} + +#network.disconnected { + color: ${redColor}; +} + ''; + + }; + }; + + }; +} diff --git a/modules/programs/wofi/default.nix b/modules/programs/wofi/default.nix new file mode 100644 index 0000000..d60c052 --- /dev/null +++ b/modules/programs/wofi/default.nix @@ -0,0 +1,98 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.desktop.enable { + + home-manager.users.${config.user} = { + programs.wofi = { + + enable = true; + + settings = { + key_expand = "Tab"; + term = "kitty"; + matching = "multi-contains"; + insensitive = true; + gtk_dark = true; + hide_scroll = true; + }; + + style = + let + accentColor = "#${config.theme.accentColor}"; + textColor = "#${config.theme.colors.base05}"; + baseColor = "#${config.theme.colors.base00}"; + surfaceColor = "#${config.theme.colors.base02}"; + fontSize = "${toString config.theme.fontSize}px"; + outerGap = "${toString config.theme.outerGap}px"; + innerGap = "${toString config.theme.innerGap}px"; + outerRadius = "${toString config.theme.outerRadius}px"; + innerRadius = "${toString config.theme.innerRadius}px"; + borderWidth = "${toString config.theme.borderWidth}px"; + in '' +* { + font-family: ${config.theme.monospaceFont}; + font-size: ${fontSize}; +} + +/* Window */ +window { + margin: 0px; + border: ${borderWidth} solid ${accentColor}; + border-radius: ${outerRadius}; + background-color: ${baseColor}; +} + +/* Outer Box */ +#outer-box { + padding: ${outerGap}; +} + +/* Scroll */ +#scroll { + margin: 0px; + padding: ${innerGap}; + border: none; +} + +/* Input */ +#input { + margin: ${innerGap}; + padding: ${innerGap}; + border: none; + color: ${textColor}; + background-color: ${surfaceColor}; + border-radius: ${outerRadius}; +} + +#input:focus, +#input:active { + border: ${borderWidth} solid ${accentColor}; + box-shadow: none; + outline: none; +} + +/* Text */ +#text { + margin: ${innerGap}; + padding: ${innerGap}; + border: none; + color: ${textColor}; +} + +/* Selected Entry */ +#entry:selected { + background-color: ${accentColor}; + border-radius: ${outerRadius}; +} + +#entry:selected #text { + color: ${baseColor}; +} + ''; + + }; + }; + + }; +} diff --git a/modules/programs/zsh/default.nix b/modules/programs/zsh/default.nix new file mode 100644 index 0000000..d8f25eb --- /dev/null +++ b/modules/programs/zsh/default.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + config = { + + programs.zsh = { + enable = true; + enableCompletion = true; + enableGlobalCompInit = false; + }; + + }; +} diff --git a/modules/system.nix b/modules/system.nix new file mode 100644 index 0000000..25e1944 --- /dev/null +++ b/modules/system.nix @@ -0,0 +1,101 @@ +{ config, pkgs, ... }: + +{ + + # common system packages + environment.systemPackages = with pkgs; [ + # editor + neovim + vim + # lib + libz + openssl + # shell + bash + zsh + # utility + acpi + curl + htop + openssh + p7zip + ripgrep + tree + unzip + wget + ]; + + # timezone + time.timeZone = "Americia/New_York"; + + # locale + i18n.defaultLocale = "en_US.UTF-8"; + + # system component + networking.networkmanager.enable = config.system.enable; + services.fwupd.enable = config.system.enable; + services.pcscd.enable = config.system.enable; + services.printing.enable = config.system.enable; + services.pipewire = { + enable = config.system.enable; + alsa.enable = config.system.enable; + pulse.enable = config.system.enable; + jack.enable = config.system.enable; + }; + + # gui component + services.libinput.enable = config.desktop.enable; + + # create user account + users.users.${config.user} = { + isNormalUser = true; + description = config.fullName; + extraGroups = if config.system.enable then [ "networkmanager" "wheel" "sys" "video" "audio" ] else [ "wheel" ]; + home = config.homePath; + shell = pkgs.zsh; + }; + + # certs + security.pki.certificateFiles = [ + ../files/certs/freyanet.crt + ]; + + # fonts + fonts.packages = with pkgs; [ + dejavu_fonts + fira-code + fira-code-symbols + jetbrains-mono + material-icons + nerd-fonts.fira-code + noto-fonts + noto-fonts-cjk-sans + noto-fonts-emoji + twemoji-color-font + ]; + + fonts.fontconfig = { + enable = true; + defaultFonts = { + serif = [ + "Twemoji" + "DejaVu Serif" + ]; + sansSerif = [ + "Twemoji" + "DejaVu Sans" + ]; + monospace = [ + "Fira Code" + "FiraCode Nerd Font Mono" + "Font Awesome 6 Pro Regular" + "Twemoji" + "DejaVu Sans Mono" + ]; + emoji = [ + "Twemoji" + "Noto Color Emoji" + ]; + }; + }; +} diff --git a/modules/themes/catppuccin/default.nix b/modules/themes/catppuccin/default.nix new file mode 100644 index 0000000..5d587ef --- /dev/null +++ b/modules/themes/catppuccin/default.nix @@ -0,0 +1,6 @@ +{ + frappe = import ./frappe.nix; + latte = import ./latte.nix; + macchiato = import ./macchiato.nix; + mocha = import ./mocha.nix; +} diff --git a/modules/themes/catppuccin/frappe.nix b/modules/themes/catppuccin/frappe.nix new file mode 100644 index 0000000..77bae89 --- /dev/null +++ b/modules/themes/catppuccin/frappe.nix @@ -0,0 +1,21 @@ +{ + name = "Catppuccin Frappe"; + author = "https://github.com/catppuccin/catppuccin"; + + base00 = "303446"; # base + base01 = "292c3c"; # mantle + base02 = "414559"; # surface0 + base03 = "51576d"; # surface1 + base04 = "626880"; # surface2 + base05 = "c6d0f5"; # text + base06 = "f2d5cf"; # rosewater + base07 = "babbf1"; # lavender + base08 = "e78284"; # red + base09 = "ef9f76"; # peach + base0A = "e5c890"; # yellow + base0B = "a6d189"; # green + base0C = "81c8be"; # teal + base0D = "8caaee"; # blue + base0E = "ca9ee6"; # mauve + base0F = "eebebe"; # flamingo +} diff --git a/modules/themes/catppuccin/latte.nix b/modules/themes/catppuccin/latte.nix new file mode 100644 index 0000000..476e123 --- /dev/null +++ b/modules/themes/catppuccin/latte.nix @@ -0,0 +1,21 @@ +{ + name = "Catppuccin Latte"; + author = "https://github.com/catppuccin/catppuccin"; + + base00 = "eff1f5"; # base + base01 = "e6e9ef"; # mantle + base02 = "ccd0da"; # surface0 + base03 = "bcc0cc"; # surface1 + base04 = "acb0be"; # surface2 + base05 = "4c4f69"; # text + base06 = "dc8a78"; # rosewater + base07 = "7287fd"; # lavender + base08 = "d20f39"; # red + base09 = "fe640b"; # peach + base0A = "df8e1d"; # yellow + base0B = "40a02b"; # green + base0C = "179299"; # teal + base0D = "1e66f5"; # blue + base0E = "8839ef"; # mauve + base0F = "dd7878"; # flamingo +} diff --git a/modules/themes/catppuccin/macchiato.nix b/modules/themes/catppuccin/macchiato.nix new file mode 100644 index 0000000..1f401be --- /dev/null +++ b/modules/themes/catppuccin/macchiato.nix @@ -0,0 +1,21 @@ +{ + name = "Catppuccin Macchiato"; + author = "https://github.com/catppuccin/catppuccin"; + + base00 = "24273a"; # base + base01 = "1e2030"; # mantle + base02 = "363a4f"; # surface0 + base03 = "494d64"; # surface1 + base04 = "5b6078"; # surface2 + base05 = "cad3f5"; # text + base06 = "f4dbd6"; # rosewater + base07 = "b7bdf8"; # lavender + base08 = "ed8796"; # red + base09 = "f5a97f"; # peach + base0A = "eed49f"; # yellow + base0B = "a6da95"; # green + base0C = "8bd5ca"; # teal + base0D = "8aadf4"; # blue + base0E = "c6a0f6"; # mauve + base0F = "f0c6c6"; # flamingo +} diff --git a/modules/themes/catppuccin/mocha.nix b/modules/themes/catppuccin/mocha.nix new file mode 100644 index 0000000..950bf3c --- /dev/null +++ b/modules/themes/catppuccin/mocha.nix @@ -0,0 +1,21 @@ +{ + name = "Catppuccin Mocha"; + author = "https://github.com/catppuccin/catppuccin"; + + base00 = "1e1e2e"; # base + base01 = "181825"; # mantle + base02 = "313244"; # surface0 + base03 = "45475a"; # surface1 + base04 = "585b70"; # surface2 + base05 = "cdd6f4"; # text + base06 = "f5e0dc"; # rosewater + base07 = "b4befe"; # lavender + base08 = "f38ba8"; # red + base09 = "fab387"; # peach + base0A = "f9e2af"; # yellow + base0B = "a6e3a1"; # green + base0C = "94e2d5"; # teal + base0D = "89b4fa"; # blue + base0E = "f5c2e7"; # pink + base0F = "f2cdcd"; # flamingo +} diff --git a/modules/themes/default.nix b/modules/themes/default.nix new file mode 100644 index 0000000..6018fa8 --- /dev/null +++ b/modules/themes/default.nix @@ -0,0 +1,3 @@ +{ + catppuccin = import ./catppuccin; +} diff --git a/options.nix b/options.nix new file mode 100644 index 0000000..460ab63 --- /dev/null +++ b/options.nix @@ -0,0 +1,19 @@ +{ + user = "freya"; + fullName = "Freya Murphy"; + email = "freya@freyacat.org"; + + theme = rec { + colors = (import ./modules/themes).catppuccin.mocha; + accentColor = colors.base0D; + + opacity = 0.75; + outerRadius = 5; + innerRadius = 2; + outerGap = 10; + innerGap = 3; + }; + + wallpaper = "~/.config/nix/files/wallpapers/gay.png"; + avatar = "~/.config/nix/files/pfps/freya.png"; +}