git/noctun/main

complete rework of the entire page

diff --git a/LICENSE b/LICENSE
index f288702..68a49da 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,674 +1,24 @@
- 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>.
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/README.md b/README.md
index aa41c7a..dd59c6b 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1 @@
-## Noctun
-
-I tried to make my startpage as simple as possible. If you'd like to modify it, be my guest!
+my personal startpage
diff --git a/favicon.ico b/favicon.ico
deleted file mode 100644
index 8fe55c6..0000000
Binary files a/favicon.ico and /dev/null differ
diff --git a/favicon.png b/favicon.png
new file mode 100644
index 0000000..37b7964
Binary files /dev/null and b/favicon.png differ
diff --git a/index.html b/index.html
index 1d6e7f5..9c785a4 100644
--- a/index.html
+++ b/index.html
@@ -1,118 +1,584 @@
<!DOCTYPE html>
-
-
<html lang="en">
-
<head>
<meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>noctun link directory</title>
- <link rel="icon" href="favicon.ico" type="image/x-icon" sizes="any">
-</head>
+ <link rel="shortcut icon" type="image/png" href="favicon.png"/>
+ <link rel="icon" type="image/png" sizes="16x16" href="favicon.png"/>
+ <style>
+ :root {
+ --mono: "Iosevka NFM", "Iosevka Nerd Font Mono", monospace;
+ --black: #000000;
+ --white: #dddddd;
+ --green: #5bc0ae;
+ --green-light: #79ffe7;
+ --red: #bf667a;
+ --yellow: #bf9f7d;
+ --blue: #4c82c0;
+ --darkgrey: #333333;
+ --grey: #aaaaaa;
+ }
+
+ *, *:before, *:after { box-sizing: border-box; }
+ *:focus { outline: none; }
+
+ html { font-size: 62.5%; }
+
+ body {
+ background-color: var(--black);
+ color: var(--white);
+ padding: 60px 40px;
+ font-family: var(--mono);
+ font-size: 1.8rem;
+ line-height: 1.6;
+ max-width: 1100px;
+ margin: 0 auto;
+ }
+
+ .dashboard {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ gap: 50px;
+ margin-top: 30px;
+ align-items: start;
+ }
+
+ .panel {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .panel-title {
+ color: var(--grey);
+ font-family: var(--mono);
+ font-size: 1.4rem;
+ text-transform: uppercase;
+ display: flex;
+ align-items: center;
+ margin-bottom: 25px;
+ letter-spacing: 0.05em;
+ }
+
+ .panel-title::after {
+ content: "";
+ flex-grow: 1;
+ height: 1px;
+ background: var(--darkgrey);
+ margin-left: 15px;
+ }
+
+ .tui-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .tui-list li {
+ margin: 0 0 15px 0;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .tui-key {
+ border: 1px solid var(--darkgrey);
+ border-radius: 4px;
+ padding: 2px 10px;
+ color: var(--grey);
+ font-family: var(--mono);
+ font-size: 1.6rem;
+ min-width: 38px;
+ text-align: center;
+ display: inline-block;
+ margin-right: 18px;
+ flex-shrink: 0;
+ cursor: pointer;
+ transition: border-color 0.2s, color 0.2s;
+ user-select: none;
+ }
+
+ .tui-key:hover {
+ border-color: var(--green-light);
+ color: var(--white);
+ }
+
+ .tui-list li.active .tui-key {
+ border-color: var(--green);
+ color: var(--green);
+ }
+
+ .tui-list li.active span.channel-name {
+ color: var(--white);
+ font-weight: bold;
+ }
-<style>
-a {color:#FFF;}
-a:hover {background-color:#FFF;color:#000;}
-a:before {content:"["}
-a:after {content:"]"}
-body {background-color:#000;color:#FFF;padding-left:24px;padding-top:10px;}
-ul {list-style-type:none;margin-bottom:30px;padding:0px;}
-p {margin-bottom:5px;padding:0px;}
-</style>
+ .tui-list li.selected .tui-key {
+ border-color: var(--green);
+ color: var(--green);
+ }
+ .tui-list li.selected span.link-name {
+ color: var(--white);
+ font-weight: bold;
+ }
+
+ .channel-name, .link-name {
+ color: var(--grey);
+ font-family: var(--mono);
+ cursor: pointer;
+ user-select: none;
+ transition: color 0.2s;
+ }
+
+ .channel-name:hover, .link-name:hover { color: var(--white); }
+
+ .sys-info {
+ font-family: var(--mono);
+ color: var(--grey);
+ font-size: 1.6rem;
+ margin-top: 30px;
+ line-height: 2;
+ }
+
+ .sys-info span {
+ color: var(--white);
+ }
+
+ .cmd-line {
+ margin-top: 60px;
+ display: flex;
+ align-items: center;
+ font-family: var(--mono);
+ border-bottom: 1px solid var(--darkgrey);
+ padding-bottom: 10px;
+ transition: border-color 0.3s ease;
+ }
+
+ .cmd-line:focus-within { border-bottom: 1px solid var(--green); }
+
+ .cmd-prompt {
+ color: var(--green);
+ margin-right: 15px;
+ font-weight: bold;
+ font-size: 1.8rem;
+ }
+
+ #cli {
+ background: transparent;
+ border: none;
+ color: var(--white);
+ font-family: var(--mono);
+ font-size: 1.8rem;
+ flex-grow: 1;
+ }
+
+ #cli::placeholder {
+ color: var(--darkgrey);
+ }
+
+ .btn-exec {
+ background: transparent;
+ border: 1px solid var(--green);
+ color: var(--green);
+ font-family: var(--mono);
+ font-size: 1.6rem;
+ padding: 4px 14px;
+ border-radius: 4px;
+ cursor: pointer;
+ transition: all 0.2s;
+ display: none;
+ margin-left: 20px;
+ flex-shrink: 0;
+ user-select: none;
+ }
+
+ .btn-exec:hover {
+ background: var(--green);
+ color: var(--black);
+ font-weight: bold;
+ }
+
+ /* tip section styling */
+ .tip-content {
+ transition: opacity 0.3s ease-in-out;
+ opacity: 1;
+ line-height: 2;
+ }
+
+ .tip-content.fading {
+ opacity: 0;
+ }
+
+ #btn-refresh-tip:hover {
+ color: var(--green);
+ }
+
+ .tip-cat {
+ color: var(--green);
+ font-weight: bold;
+ display: block;
+ margin-bottom: 4px;
+ }
+
+ .tip-cmd {
+ border: 1px solid var(--darkgrey);
+ border-radius: 4px;
+ padding: 1px 6px;
+ color: var(--white);
+ font-family: var(--mono);
+ -webkit-box-decoration-break: clone;
+ box-decoration-break: clone;
+ word-break: keep-all;
+ }
+ </style>
+</head>
<body>
- <div>
- <div>
- <ul>
- <p>soc</p>
- <a rel="noopener noreferrer" href="https://youtube.com">yt</a>
- <a rel="noopener noreferrer" href="http://127.0.0.1:7001">mini</a>
- <a rel="noopener noreferrer" href="https://merveilles.town/">mrv</a>
- <a rel="noopener noreferrer" href="https://slrpnk.net/">lmy</a>
- <a rel="noopener noreferrer" href="https://redlib.zaggy.nl/">rdt</a>
- <a rel="noopener noreferrer" href="https://llllllll.co/">lin</a>
- <a rel="noopener noreferrer" href="https://tildeverse.org">til</a>
- </ul>
- </div>
- <div>
- <ul>
- <p>tool</p>
- <a rel="noopener noreferrer" href="https://configure.zsa.io/ergodox-ez/layouts/">orx</a>
- <a rel="noopener noreferrer" href="https://chat.mistral.ai/chat">ai</a>
- <a rel="noopener noreferrer" href="https://shodan.io">sho</a>
- <a rel="noopener noreferrer" href="https://librespeed.org">lbs</a>
- <a rel="noopener noreferrer" href="https://hydra.ojack.xyz/">hyd</a>
- <a rel="noopener noreferrer" href="https://temp.sh">tsh</a>
- </ul>
- </div>
- <div>
- <ul>
- <p>edu</p>
- <a rel="noopener noreferrer" href="https://vulnhub.com/">vlh</a>
- <a rel="noopener noreferrer" href="https://microcorruption.com">mc</a>
- <a rel="noopener noreferrer" href="https://study.pocketprep.com/study">prp</a>
- <a rel="noopener noreferrer" href="https://any.run">anyr</a>
- <a rel="noopener noreferrer" href="https://www.udemy.com/">udm</a>
- <a rel="noopener noreferrer" href="https://www.examtopics.com/">exm</a>
- </ul>
- </div>
- <div>
- <ul>
- <p>linux</p>
- <a rel="noopener noreferrer" href="https://wiki.archlinux.org/">awi</a>
- <a rel="noopener noreferrer" href="https://aur.archlinux.org/">aur</a>
- <a rel="noopener noreferrer" href="https://explainshell.com/">exs</a>
- <a rel="noopener noreferrer" href="https://github.com/kahun/awesome-sysadmin/">sys</a>
- <a rel="noopener noreferrer" href="https://github.com/aloisdg/awesome-regex">reg</a>
- </ul>
- </div>
- <div>
- <ul>
- <p>ins</p>
- <a rel="noopener noreferrer" href="https://webring.xxiivv.com/">wbr</a>
- <a rel="noopener noreferrer" href="http://punk.ist/">pnk</a>
- <a rel="noopener noreferrer" href="https://www.wiby.me/?q=">wby</a>
- <a rel="noopener noreferrer" href="https://search.marginalia.nu/">mar</a>
- <a rel="noopener noreferrer" href="https://n-o-d-e.net/">nde</a>
- <a rel="noopener noreferrer" href="https://solar.lowtechmagazine.com/">ltm</a>
- <a rel="noopener noreferrer" href="https://eldritchdata.neocities.org/">eld</a>
- </ul>
- </div>
- <div>
- <ul>
- <p>p2p</p>
- <a rel="noopener noreferrer" href="http://localhost:9696/">prow</a>
- <a rel="noopener noreferrer" href="https://comfybox.floofey.dog">cfb</a>
- <a rel="noopener noreferrer" href="https://rutracker.org/">ru</a>
- <a rel="noopener noreferrer" href="https://annas-archive.org/">aa</a>
- <a rel="noopener noreferrer" href="http://localhost:5030/">slsk</a>
- </ul>
+
+ <div class="dashboard">
+ <div class="panel" id="col-channels">
+ <div class="panel-title">Channels</div>
+ <ul class="tui-list" id="channel-list"></ul>
</div>
- <div>
- <ul>
- <p>my</p>
- <a rel="noopener noreferrer" href="http://localhost:8006">prx</a>
- <a rel="noopener noreferrer" href="https://git.sr.ht/~faen">srht</a>
- <a rel="noopener noreferrer" href="https://njal.la">nj</a>
- <a rel="noopener noreferrer" href="https://drive.proton.me/">ptd</a>
- <a rel="noopener noreferrer" href="https://beta.protonmail.com/">emm</a>
- <a rel="noopener noreferrer" href="https://mail.cock.li/">ema</a>
- <a rel="noopener noreferrer" href="https://ente.io/">ent</a>
- </ul>
+
+ <div class="panel" id="col-links">
+ <div class="panel-title" id="link-title">Links</div>
+ <ul class="tui-list" id="link-list"></ul>
</div>
- <div>
- <ul>
- <p>hid</p>
- <a rel="noopener noreferrer" href="http://dreadytofatroptsdj6io7l3xptbet6onoyno2yv7jicoxknyazubrad.onion">drd</a>
- <a rel="noopener noreferrer" href="http://libreeunomyly6ot7kspglmbd5cvlkogib6rozy43r2glatc6rmwauqd.onion">lbr</a>
- <a rel="noopener noreferrer" href="http://nehdddktmhvqklsnkjqcbpmb63htee2iznpcbs5tgzctipxykpj6yrid.onion">loc</a>
- <a rel="noopener noreferrer" href="http://endchancxfbnrfgauuxlztwlckytq7rgeo5v6pc2zd4nyqo3khfam4ad.onion">end</a>
- <a rel="noopener noreferrer" href="http://tortimeswqlzti2aqbjoieisne4ubyuoeiiugel2layyudcfrwln76qd.onion">trt</a>
- <a rel="noopener noreferrer" href="http://tortaxi2dev6xjwbaydqzla77rrnth7yn2oqzjfmiuwn5h6vsk2a4syd.onion">tax</a>
- <a rel="noopener noreferrer" href="http://libraryfyuybp7oyidyya3ah5xvwgyx6weauoini7zyz555litmmumad.onion">lib</a>
- </ul>
+
+ <div class="panel" id="col-info">
+ <div class="panel-title">Queue</div>
+ <ul class="tui-list" id="queue-list" style="min-height: 100px;"></ul>
+
+ <div class="panel-title" style="margin-top: 30px; display: flex;">
+ Tips
+ <span id="btn-refresh-tip" style="margin-left: auto; cursor: pointer; color: var(--darkgrey); transition: color 0.2s;">[r]</span>
+ </div>
+ <div class="sys-info tip-container" style="min-height: 100px; margin-top: 15px;">
+ <div id="tip-content" class="tip-content">
+ </div>
+ </div>
</div>
</div>
+
+ <div class="cmd-line">
+ <span class="cmd-prompt">></span>
+ <input type="text" id="cli" placeholder="enter sequence or search..." autocomplete="off" autofocus>
+ <button id="btn-exec" class="btn-exec">[ EXEC ]</button>
+ </div>
+
+ <script>
+ const database = {
+ "1": {
+ name: "social",
+ links: {
+ "a": { name: "youtube", url: "https://youtube.com" },
+ "b": { name: "merveilles", url: "https://merveilles.town" },
+ "c": { name: "lines", url: "https://llllllll.co" },
+ "d": { name: "reddit", url: "https://redlib.canine.tools" },
+ "e": { name: "lemmy", url: "https://slrpnk.net" },
+ "f": { name: "anilist", url: "https://anilist.co" },
+ "g": { name: "comfybox", url: "https://comfybox.floofey.dog" },
+ "h": { name: "hacker news", url: "https://news.ycombinator.com" },
+ "i": { name: "phoronix", url: "https://phoronix.com" }
+ }
+ },
+ "2": {
+ name: "tools",
+ links: {
+ "a": { name: "shodan", url: "https://shodan.io" },
+ "b": { name: "explainshell", url: "https://explainshell.com" },
+ "c": { name: "speedtest", url: "https://speed.cloudflare.com" },
+ "d": { name: "regex101", url: "https://regex101.com" },
+ "e": { name: "cidr calculator", url: "https://cidr.xyz" },
+ "f": { name: "cyberchef", url: "https://cyberchef.org" },
+ "g": { name: "mynoise", url: "https://mynoise.net" },
+ "h": { name: "marginalia", url: "https://marginalia-search.com" },
+ "i": { name: "urlscan", url: "https://urlscan.io" },
+ "j": { name: "cloudflare radar", url: "https://radar.cloudflare.com" },
+ "k": { name: "mxtoolbox", url: "https://mxtoolbox.com" }
+ }
+ },
+ "3": {
+ name: "education",
+ links: {
+ "a": { name: "sad servers", url: "https://sadservers.com" },
+ "b": { name: "pocketprep", url: "https://study.pocketprep.com/study" },
+ "c": { name: "udemy", url: "https://udemy.com" },
+ "d": { name: "examtopics", url: "https://examtopics.com" },
+ "e": { name: "command challenge", url: "https://cmdchallenge.com" },
+ "f": { name: "rhcsa-simulator", url: "https://github.com/AustinNicely/rhcsa-simulator" },
+ "g": { name: "knots 3d", url: "https://knots3d.com" },
+ "h": { name: "electronics club", url: "https://electronicsclub.info" },
+ "i": { name: "freemediaheckyeah", url: "https://fmhy.net" },
+ "j": { name: "ifixit", url: "https://ifixit.com" }
+ }
+ },
+ "4": {
+ name: "linux",
+ links: {
+ "a": { name: "arch wiki", url: "https://wiki.archlinux.org" },
+ "b": { name: "arch news", url: "https://archlinux.org/news" },
+ "c": { name: "protondb", url: "https://protondb.com" },
+ "d": { name: "lkml", url: "https://lkml.org" },
+ "e": { name: "distrowatch", url: "https://distrowatch.com" },
+ "f": { name: "arch forums", url: "https://bbs.archlinux.org" }
+ }
+ },
+ "5": {
+ name: "inspiration",
+ links: {
+ "a": { name: "xxiivv webring", url: "https://webring.xxiivv.com" },
+ "b": { name: "unixporn", url: "https://reddit.com/r/unixporn" },
+ "c": { name: "defacto2", url: "https://defacto2.net/website" },
+ "d": { name: "hackaday projects", url: "https://hackaday.io/discover" },
+ "e": { name: "printables", url: "https://printables.com" },
+ "f": { name: "hmmm...", url: "https://nothinghere.yet" }
+ }
+ },
+ "6": {
+ name: "p2p",
+ links: {
+ "a": { name: "anna's archive", url: "https://annas-archive.gl" },
+ "b": { name: "slum", url: "https://open-slum.pages.dev" },
+ "c": { name: "rutracker", url: "https://rutracker.org" },
+ "d": { name: "nyaa", url: "https://nyaa.si" },
+ "e": { name: "pairdrop", url: "https://pairdrop.net" },
+ "f": { name: "torrentfreak", url: "https://torrentfreak.com" },
+ "g": { name: "piracy megathread", url: "https://reddit.com/r/piracy/wiki/megathread" },
+ "h": { name: "seadex", url: "https://releases.moe" }
+
+ }
+ },
+ "7": {
+ name: "hidden",
+ links: {
+ "a": { name: "dread", url: "http://dreadytofatroptsdj6io7l3xptbekvqpcqa3eclz7ezws5gdpbrwvd.onion" },
+ "b": { name: "dark fail", url: "http://darkfaillnc5fdwg12z6eukouozpzpwqvw2zpxz5mrzv3q2w7e3yvxqd.onion" },
+ "c": { name: "daunt", url: "http://daunt5rnkzzwpl2gveb7y72iibtz5j7h3p6kntuoxnbhnhy52y66g7qd.onion" },
+ "d": { name: "tor times", url: "http://tortimescx6v3wwnbwwndnqq7s3lxyv272z2z572k2y2k2r6c2vq4yd.onion" },
+ "e": { name: "imperial library", url: "http://kx5thpx2olielkihfyo4jgjqfb7zx7wxr3logical5z4t2w3d2yqd.onion" },
+ "f": { name: "deep web radio", url: "http://anonyradixhkgh5myfrkarggfnmdzzhhcgoy2v66uf7sml27to5n2tid.onion" },
+ "g": { name: "pitch", url: "http://pitch2h3y5l36zrt4q2l755oebwvps72z77e23k2j2q6r2w4h2h4j2qd.onion" }
+ }
+ }
+ };
+ const searchEngines = {
+ "aw ": "https://wiki.archlinux.org/index.php?search=",
+ "ddg ": "https://duckduckgo.com/?q=",
+ "goo ": "https://google.com/search?q=",
+ "yt ": "https://youtube.com/results?search_query="
+ };
+
+ const fallbackSearchUrl = "https://duckduckgo.com/?q=";
+
+ const cli = document.getElementById('cli');
+ const channelList = document.getElementById('channel-list');
+ const linkList = document.getElementById('link-list');
+ const linkTitle = document.getElementById('link-title');
+ const queueList = document.getElementById('queue-list');
+ const btnExec = document.getElementById('btn-exec');
+
+ let activeChannel = "1";
+ let viewOverride = null;
+ let queuedLinks = [];
+
+ function setChannelView(chan) {
+ viewOverride = chan;
+ render();
+ cli.focus();
+ }
+
+ function appendLinkToCli(chan, key) {
+ let val = cli.value;
+ let segments = val.split(',');
+ let found = false;
+
+ for (let i = 0; i < segments.length; i++) {
+ let segMatch = segments[i].match(/^(\s*)(\d+)([a-z]*)(\s*)$/i);
+ if (segMatch && segMatch[2] === chan && segMatch[3].includes(key)) {
+ let newKeys = segMatch[3].replace(key, '');
+ if (newKeys === '') {
+ segments.splice(i, 1);
+ i--;
+ } else {
+ segments[i] = segMatch[1] + segMatch[2] + newKeys + segMatch[4];
+ }
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ let addedToExisting = false;
+ for (let i = 0; i < segments.length; i++) {
+ let segMatch = segments[i].match(/^(\s*)(\d+)([a-z]*)(\s*)$/i);
+ if (segMatch && segMatch[2] === chan) {
+ segments[i] = segMatch[1] + segMatch[2] + segMatch[3] + key + segMatch[4];
+ addedToExisting = true;
+ break;
+ }
+ }
+ if (!addedToExisting) {
+ segments.push(chan + key);
+ }
+ }
+
+ cli.value = segments.map(s => s.trim()).filter(s => s !== '' && !/^\d+$/.test(s)).join(', ');
+ viewOverride = chan;
+ render();
+ cli.focus();
+ }
+
+ function executeQueue() {
+ const val = cli.value.toLowerCase();
+ if (val.trim() === '') return;
+ let searchExecuted = false;
+ for (const [prefix, url] of Object.entries(searchEngines)) {
+ if (val.startsWith(prefix)) {
+ window.location.href = url + encodeURIComponent(val.slice(prefix.length));
+ searchExecuted = true;
+ break;
+ }
+ }
+ if (!searchExecuted && queuedLinks.length > 0) {
+ queuedLinks.forEach(q => window.open(q.data.url, '_blank', 'noopener,noreferrer'));
+ searchExecuted = true;
+ }
+ if (!searchExecuted && !/^\s*\d+[a-z\s]*(\s*,\s*\d*[a-z\s]*)*\s*$/.test(val)) {
+ window.location.href = fallbackSearchUrl + encodeURIComponent(val);
+ }
+ cli.value = ''; viewOverride = null; render();
+ }
+
+ function render() {
+ const val = cli.value.toLowerCase();
+ const commands = val.split(',');
+ queuedLinks = [];
+ let channelSelections = {};
+ let isSearchMode = false;
+ let computedActiveChannel = activeChannel;
+
+ for (const prefix in searchEngines) { if (val.startsWith(prefix)) { isSearchMode = true; break; } }
+
+ let isFallbackSearch = false;
+ if (!isSearchMode && val.trim().length > 0 && !/^\s*\d+[a-z\s]*(\s*,\s*\d*[a-z\s]*)*\s*$/.test(val)) { isFallbackSearch = true; }
+
+ if (!isSearchMode && !isFallbackSearch) {
+ for (let i = 0; i < commands.length; i++) {
+ const cmd = commands[i].trim();
+ if (!cmd) continue;
+ if (cmd.length >= 1 && database[cmd[0]]) {
+ if (i === commands.length - 1) computedActiveChannel = cmd[0];
+ if (cmd.length >= 2) {
+ const chan = cmd[0];
+ if (!channelSelections[chan]) channelSelections[chan] = [];
+ const keys = cmd.substring(1).replace(/\s+/g, '');
+ for (const key of keys) {
+ if (database[chan].links[key]) {
+ channelSelections[chan].push(key);
+ queuedLinks.push({ chan: chan, key: key, data: database[chan].links[key] });
+ }
+ }
+ }
+ }
+ }
+ }
+
+ const displayChannel = viewOverride || computedActiveChannel;
+
+ channelList.innerHTML = '';
+ for (const [key, data] of Object.entries(database)) {
+ const li = document.createElement('li');
+ if (key === displayChannel && !isSearchMode && !isFallbackSearch) li.className = 'active';
+ li.innerHTML = `<span class="tui-key" onclick="setChannelView('${key}')">${key}</span><span class="channel-name" onclick="setChannelView('${key}')">${data.name}</span>`;
+ channelList.appendChild(li);
+ }
+
+ linkList.innerHTML = '';
+ linkTitle.innerText = database[displayChannel].name;
+ const currentSelections = channelSelections[displayChannel] || [];
+ for (const [key, link] of Object.entries(database[displayChannel].links)) {
+ const li = document.createElement('li');
+ if (currentSelections.includes(key) && !isSearchMode && !isFallbackSearch) li.className = 'selected';
+ li.innerHTML = `<span class="tui-key" onclick="appendLinkToCli('${displayChannel}','${key}')">${key}</span><span class="link-name" onclick="appendLinkToCli('${displayChannel}','${key}')">${link.name}</span>`;
+ linkList.appendChild(li);
+ }
+
+ queueList.innerHTML = isSearchMode ? `<li style="color:var(--blue)">[ executing custom search... ]</li>` :
+ isFallbackSearch ? `<li style="color:var(--yellow)">[ fallback search... ]</li>` :
+ queuedLinks.length === 0 ? `<li style="color:var(--darkgrey)">[ empty ]</li>` :
+ queuedLinks.map(q => `<li><span class="tui-key" onclick="appendLinkToCli('${q.chan}','${q.key}')" style="border-color:var(--green);color:var(--green);min-width:40px;">${q.chan}${q.key}</span><span class="link-name" onclick="appendLinkToCli('${q.chan}','${q.key}')">${q.data.name}</span></li>`).join('');
+
+ btnExec.style.display = (cli.value.trim().length > 0) ? 'block' : 'none';
+ }
+
+ cli.addEventListener('input', (e) => {
+ if (e.isTrusted) viewOverride = null;
+
+ let val = cli.value.toLowerCase();
+ let segments = val.split(',');
+ let lastIdx = segments.length - 1;
+ let lastSegment = segments[lastIdx];
+
+ let numMatch = lastSegment.match(/^(\s*)(\d+)$/);
+ if (numMatch && numMatch[2].length > 1) {
+ const lastDigit = numMatch[2].slice(-1);
+ if (database[lastDigit]) {
+ segments[lastIdx] = numMatch[1] + lastDigit;
+ cli.value = segments.join(',');
+ }
+ }
+ render();
+ });
+
+ cli.addEventListener('keydown', (e) => { if (e.key === 'Enter') executeQueue(); });
+ btnExec.addEventListener('click', executeQueue);
+ document.addEventListener('click', (e) => { if(!['BUTTON','INPUT'].includes(e.target.tagName) && !e.target.classList.contains('tui-key') && !e.target.classList.contains('channel-name') && !e.target.classList.contains('link-name')) cli.focus(); });
+
+ // tip logic with json fetching
+ const tipContent = document.getElementById('tip-content');
+ const btnRefreshTip = document.getElementById('btn-refresh-tip');
+ let tipDatabase = [];
+
+ async function loadTips() {
+ try {
+ const response = await fetch('tips.json');
+ tipDatabase = await response.json();
+ displayNewTip();
+ } catch (error) {
+ tipDatabase = [{ cat: "error", text: "could not load tips.json. if testing locally, you might need to run a quick web server like `python -m http.server`." }];
+ displayNewTip();
+ }
+ }
+
+ function getRandomTip() {
+ if (tipDatabase.length === 0) return { cat: "loading", text: "fetching knowledge..." };
+ return tipDatabase[Math.floor(Math.random() * tipDatabase.length)];
+ }
+
+ function displayNewTip() {
+ tipContent.classList.add('fading');
+
+ setTimeout(() => {
+ const tip = getRandomTip();
+
+ // escape html brackets first
+ let safeText = tip.text.replace(/</g, "&lt;").replace(/>/g, "&gt;");
+
+ // turn `commands` into styled inline blocks
+ safeText = safeText.replace(/`([^`]+)`/g, '<code class="tip-cmd">$1</code>');
+
+ tipContent.innerHTML = `<span class="tip-cat">[${tip.cat}]</span><span style="color: var(--grey);">${safeText}</span>`;
+ tipContent.classList.remove('fading');
+ }, 300);
+ }
+
+ btnRefreshTip.addEventListener('click', displayNewTip);
+
+ // initialize page
+ loadTips();
+ render();
+ </script>
</body>
</html>
diff --git a/tips.json b/tips.json
new file mode 100644
index 0000000..ca6486f
--- /dev/null
+++ b/tips.json
@@ -0,0 +1,1658 @@
+[
+ {
+ "cat": "arch_linux",
+ "text": "running `pacman -Syuw` will download all pending updates to your cache without installing them, great for prepping updates in the background."
+ },
+ {
+ "cat": "arch_linux",
+ "text": "if you ever change your kernel modules or graphics drivers, do not forget to run `mkinitcpio -P` to rebuild your initramfs."
+ },
+ {
+ "cat": "arch_linux",
+ "text": "you can use `pacman -Fl <package>` to see exactly what files a package will install before you actually install it."
+ },
+ {
+ "cat": "arch_linux",
+ "text": "need an older package version? the arch linux archive (ALA) keeps historical snapshots of official repositories."
+ },
+ {
+ "cat": "arch_linux",
+ "text": "add `ILoveCandy` to your /etc/pacman.conf options section to turn the pacman progress bar into pac-man eating dots."
+ },
+ {
+ "cat": "arch_linux",
+ "text": "use `pacman -Qe` to list all packages you explicitly installed, filtering out all the automatic dependencies."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "present day, present time. hahahahaha."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "tuturu! mayushii desu!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wc lvl?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "your hue is cloudy."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i don't know everything, i just know what i know."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sea shanty 2 is objectively the best track."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "courage to tell a lie."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "modulating the cut-off frequency..."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "buying twisted bow - 1m"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "stay awhile and listen"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "not even death can save you from me"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "stone of jordan"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the bees are happy"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the ground is shaking"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you feel cold"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "a foul smell from the swamp"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you are being hunted"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "understand, understand, the concept of love"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "jet set radiooooo"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "beat is hitting the streets"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ararararagi-san"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i stuttered"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i said with a posed look"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "yay, peace peace"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "that is a black page in my history, i will never make another posed look."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "unlimited rulebook"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "shitsurei, kamimashita"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'm platinum mad!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'd prefer to enjoy this conversation without unnecessary evangelion references"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the fake is of far greater value. in its deliberate attempt to be real, its more real than the real thing."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "nyanyame nyanyajyuunyanya-do no nyarabi de nyakunyaku inyanyaku nyanyahan nyanyadai nyanynaku nyarabete nyaganyagame"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i know love. the convenience store was selling it. for 298 yen."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i don't know anything, araragi-senpai. it's you who knows."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i love you, senjougahara"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "el psy kongroo"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i am mad scientist, its so cool! sonuvabitch!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "time is passing so quickly. right now, i feel like complaining to einstein."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "relativity theory is so romantic. and so sad."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "no one knows what the future holds. that's why its potential is infinite."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "it's an intellectual drink for the chosen ones"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "kurisutina!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "IBN 5100"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "dominator portable psychological diagnosis and suppression system"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "crime coefficient is over 300"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "enforcement mode: lethal eliminator"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "let's all love lain"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "if you're not remembered then you never existed"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "god is here"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "electrical wires humming"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "no matter where you are, everyone is always connected"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "close the world, open the next"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wired sound for wired people"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "aurora, kill yourself."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "make a contract with me and become a magical girl!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "we understood nothing at all. not what it meant to wish for a miracle... nor its price."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "homura did nothing wrong."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "subarashii..."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "nnaa~"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the curse of the abyss"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "may your journey be filled with curses and blessings"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sosu"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "my very own warm darkness"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "hakase da nyan!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "get in the robot, shinji."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "absolute terror field."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "see you space cowboy..."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "clock divider out of sync"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "generative ambient sounds to sleep to"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "turning knobs until it sounds good"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "patch cable spaghetti"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "praise the math module"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "too much resonance"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "would you kindly"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "no gods or kings, only man"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "a man chooses, a slave obeys"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "is a man not entitled to the sweat of his brow?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "bring us the girl and wipe away the debt"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "there is always a lighthouse"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "booker, catch!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the mind of the subject will desperately struggle to create memories where none exist"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "we all make choices, but in the end our choices make us"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i am a superstar cop"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the expression"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "mr. evrart is helping me find my gun"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "(whisper.) are women bourgeois?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "your mangled brain would like you to know there is a boxer called contact mike"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "madre deus... [makes the sign of the cross] A LIBERAL!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "Wöman"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i want to have fuck with you."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "cuno doesn't fucking care!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'm an artist and liver damage is my art"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "say one of these fascist or communist things or FUCK OFF"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "hardware is ephemeral, software is eternal"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sunrise, parabellum"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "un jour je serai de retour pres de toi"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "detective arriving on the scene"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "rip and tear"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "unf"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "to win the game you must kill me, john romero"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "bfg 9000"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "idkfa"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "quad damage"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "shambler dance"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "slipgate"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "telefragging shub-niggurath"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "gibbed"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i need a weapon"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "were it so easy"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wake me when you need me"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wort wort wort"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "demon!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sir, giving the covenant back their bomb"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "don't make a girl a promise if you know you can't keep it"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "bapanada"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "shaw!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "higher beings, these words are for you alone"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "born of god and void"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "nasu"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i live... again"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "go all city"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "burn my dread"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "baby baby baby baby"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "looking cool, joker!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "take your time"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "none of these people know that i was an undesirable child"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "oracle, my ad-mice is that we pro-squeak with caution"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "damn brat, i'll sue!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ryuji, go piss off the police"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "woah, ann, are those CGI???"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "for real!?!?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ryuji is a phantom thief"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i am thou, thou art i"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the dark hour"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the arcana is the means by which all is revealed"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "more like stupei, ace defective"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "please paint my powerful persona a pretty purple"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "veeelvet, oh veeeeelvet..."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "memento mori"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "too much water"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i should write something"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "hey you, you're finally awake"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "stop right there criminal scum"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "by azura, by azura, by azura!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sweetroll stolen"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wait, i know you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "do you get to the cloud district very often?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "khajiit has wares if you have coin"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "impending doom approaches"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you feel an evil presence watching you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the blood moon is rising"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "creeper, aw man"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "never dig straight down"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "mankind is dead"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "blood is fuel"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "hell is full"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "what i am about to do has not been approved by the vatican"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "mortis"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "gary loves you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "unholy trinity"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "spaaaaace!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "lemons!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "yes, you. box. your stuff. out the front door. parking lot. car. goodbye."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "still alive"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the part where he kills you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "when life gives you lemons? don't make lemonade. make life take the lemons back! get mad!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'm the man who's gonna burn your house down! with the lemons!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "sorry fellas. she's married. to science."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'm a potato"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "losing is fun"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you're thinking about how much you want to fuck 2B, aren't you?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "DO YOU THINK GAMES ARE SILLY LITTLE THINGS?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "become as gods"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "weiss, you dumbass"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "everything that lives is designed to end"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "strike the earth!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "rdm"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "look at you, hacker"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "pathetic creature of meat and bone"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "l-l-look at you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "remember our promise"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "great holes secretly are digged where earth's pores ought to suffice"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "things have learnt to walk which ought to crawl"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "perhaps, this is hell"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ocean of blood"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ACTUNG, ACHTUNG"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "[compartmentalizing trauma]"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "this god will not forgive you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "no mask? no mask!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "it fills you with determination"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i can't go to hell. i'm all out of vacation days."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "despite everything, it's still you"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "oh no! you're meeting all my standards!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "endogeny is contented"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i'm 19 years old and i've already wasted my entire life"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "who needs arms with legs like these?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "beware the man who speaks in hands."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "ret-2-go!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "wall is stop"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "tomorrow comes"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "when one falls, we continue"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "time to mix drinks and change lives"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "and here i was thinking it was because i'm a sex worker"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "welcome to the hoenn region"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "soot sack full"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "pokeblock blending"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "the rule of six"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i wear no mask"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "penrose-512"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "knife effect"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "poniko's room"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "all city king"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "got my hair done, got my nails done"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "golden strawberry"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "b-side unlocked"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "morphine administered"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "have fun scraping my brains off the wall. fuck you."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "darkrp"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "blood. an ocean of blood. i wonder how many blood drops of blood there are in this blood ocean."
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "bjorn the unicorn"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "free ball!"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "squid baron"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "cherry disk"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "rad shiba"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "spider bake sale"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "temmie flakes"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "unworthy"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "patching the unpatchable"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "1v/oct tracking"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "mult the envelope"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "random source"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "slew limiter"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "there's beauty in the breakdown"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "we're throwing car parts off the cliff"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you'll meet an army of me"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "as if you actually were inside the saltwater room"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "moving in a technicolour beat"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "all we do is hide away"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "i get eaten by the worms and weird fishes"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "you used to be alright, what happened?"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "run away, deeper to see"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "velocity: design: comfort"
+ },
+ {
+ "cat": "easter_eggs",
+ "text": "fruitcake and cookies"
+ },
+ {
+ "cat": "helix_editor",
+ "text": "press `%` to select the entire file at once, which is perfect for a quick global format or copy."
+ },
+ {
+ "cat": "helix_editor",
+ "text": "use `s` to select text matching a regex pattern inside your current selection."
+ },
+ {
+ "cat": "helix_editor",
+ "text": "typing `mi` followed by a bracket or quote will select everything inside those characters."
+ },
+ {
+ "cat": "helix_editor",
+ "text": "press `]` then `p` to paste your clipboard content on the line below your cursor, perfectly indented."
+ },
+ {
+ "cat": "helix_editor",
+ "text": "use `ctrl + c` to quickly toggle line comments on your current selection."
+ },
+ {
+ "cat": "homelab_infra",
+ "text": "use `docker system prune -a --volumes` to completely nuke all unused containers, networks, images, and volumes."
+ },
+ {
+ "cat": "homelab_infra",
+ "text": "when writing docker-compose files, always define a custom network instead of relying on the default bridge for better security and dns resolution."
+ },
+ {
+ "cat": "homelab_infra",
+ "text": "if a container is having weird permission issues with a bind mount, check the uid/gid the container runs as and match it on your host."
+ },
+ {
+ "cat": "homelab_infra",
+ "text": "wireguard private keys should always have their permissions set to 600 so other users on the system cannot read them."
+ },
+ {
+ "cat": "homelab_infra",
+ "text": "caddy is fantastic for homelabs. a basic reverse proxy with automatic ssl is literally just `domain.com { reverse_proxy localhost:8080 }`."
+ },
+ {
+ "cat": "proxmox",
+ "text": "the `/etc/pve/` directory is actually a clustered sqlite database using corosync, not a normal filesystem. do not try to symlink things in there."
+ },
+ {
+ "cat": "proxmox",
+ "text": "run `pveperf` to run a quick cpu and disk benchmark on your host to verify your storage array isn't crawling."
+ },
+ {
+ "cat": "proxmox",
+ "text": "you can use `pct push` and `pct pull` to copy files in and out of an lxc container without needing to set up ssh or shared mounts."
+ },
+ {
+ "cat": "proxmox",
+ "text": "if a vm is completely locked up and ignoring stop requests, use `qm stop <vmid> --skiplock` to force it."
+ },
+ {
+ "cat": "proxmox",
+ "text": "use `pvesm status` to get a quick command line overview of all your configured storage pools and their usage."
+ },
+ {
+ "cat": "proxmox",
+ "text": "qemu-guest-agent is a lifesaver. install it in your vms so proxmox can properly issue shutdown commands and read the guest IP."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "adding a single space before a command will prevent it from being saved to your shell history."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "append the `-Z` flag to `ls`, `ps`, or `id` to reveal the hidden selinux security contexts attached to files, processes, or users."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "if a download gets interrupted, use `wget -c <url>` to continue right where it left off instead of starting over."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "if you cat a binary file and your terminal gets completely garbled, type `reset` and press enter to fix the character encoding."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "pipe any messy text output into `column -t` to automatically format it into beautifully aligned tables."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "pipe json output into `jq .` to automatically colorize and beautifully indent it."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `alt + .` to instantly paste the last argument of your previous command into your current prompt."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + a` to jump your cursor to the very beginning of the line, and `ctrl + e` to jump to the very end."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + l` to quickly clear your terminal screen instead of typing `clear`."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + r` to open a reverse search through your shell history. just start typing to find a past command."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + w` to delete the word right before your cursor, and `ctrl + u` to clear the whole line."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + z` to suspend a running command, then type `bg` to let it keep running in the background."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `grep -i error /var/log/secure` to quickly hunt down failed ssh login attempts or su permission denials."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `ln -s /target /link_name` to create a soft symbolic link, which acts like a shortcut to a file or directory."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `rsync -avz --progress /source /dest` for a robust file copy that preserves permissions, compresses data, and shows a progress bar."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `ssh-copy-id <user>@<host>` to automatically copy your public ssh key into the authorized_keys file of a remote server."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "running `> filename.txt` will instantly empty out all the contents of a file without deleting the file itself."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "running `find . -type f -name \"*.conf\"` will recursively search your current directory for all files ending in .conf."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "running `lsof -i :80` will instantly tell you which process and user is holding port 80 hostage."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "type `^old^new` to quickly re-run your last command, replacing the word `old` with `new`."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "type `echo $?` to see the exit code of the last command you ran. a zero means it succeeded, anything else is an error."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "type `sudo !!` to instantly re-run your previous command with root privileges if you forgot to add sudo."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `cd -` to instantly take you back to the previous directory you were in."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `chmod +x script.sh` to quickly make a text file executable."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `curl -I <url>` to fetch just the http headers of a website, great for testing redirects without downloading the whole page."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `dig +short <domain>` to get a perfectly clean, scriptable output of just the resolved IP addresses."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `du -sh * | sort -h` to see a human-readable, sorted list of which files and folders are taking up the most space in your current directory."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `grep -rnw \"search_term\" .` to recursively search through all files in a directory for a specific string of text."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `killall -9 <process_name>` to brutally force-quit all running instances of an application by its name instead of chasing pids."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `mkdir -p /path/to/nested/folders` to create a deep directory structure all at once without getting errors."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `nohup <command> &` to run a process in the background that will survive even if you close your ssh session."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `ping -c 4 <host>` to send exactly four icmp echo requests instead of letting it ping infinitely."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `pushd /path` to navigate to a directory, and `popd` to instantly jump back to where you were before."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `shuf -n 1 filename` to pick a completely random line out of a text file."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `tar -czvf archive.tar.gz /target` to create a compressed gzip archive, and use `-xzvf` to extract it."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `tail -f /path/to/log` to watch a log file update in real-time."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `watch -n 1 <command>` to run a command every second and display its output on screen, perfect for monitoring a long copy or build."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "press `ctrl + x` then `ctrl + e` to open your current long, messy command prompt in your default text editor (like vim or helix) to edit it safely before running."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use process substitution like `diff <(ls dir1) <(ls dir2)` to compare the output of two different commands without ever creating temporary files."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "type `cp filename{,.bak}` to instantly create a backup copy of a file named filename.bak using bash brace expansion."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "you cannot redirect sudo output with a simple `>`. use `echo \"text\" | sudo tee -a /etc/file` to safely append text to root-owned configuration files."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `ssh -J user@jumpbox user@destination` to effortlessly proxy your ssh connection through a bastion host in a single clean command."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "need to quickly transfer files over the lan? run `python3 -m http.server 8080` to turn your current directory into a fast, temporary web server."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `awk '!a[$0]++' filename` to strip duplicate lines from a file while preserving the original sorting order, which `uniq` cannot do."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `script session.log` before starting a complex task. it records absolutely every keystroke and output into a text file until you type `exit`."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "make your scripts fly by adding `-P <cores>` to `xargs`. it forces commands to process in parallel across multiple cpu threads."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use brace expansion to build out complex folder structures instantly: `mkdir -p project/{src,build,test,docs/assets}`."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "type `cd $(mktemp -d)` to instantly generate a secure, randomized temporary directory in /tmp and immediately move your shell into it."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "add `shopt -s cdspell` to your .bashrc and your shell will automatically fix minor typos when you try to `cd` into a mispelled directory."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `!!:gs/foo/bar` to completely re-run your previous command, globally replacing every single instance of the word `foo` with `bar`."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "need a cryptographically secure random string? run `tr -dc A-Za-z0-9 </dev/urandom | head -c 32` to generate a flawless password."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "if your terminal completely stops registering your keystrokes after a bad ssh disconnect, carefully blind-type `stty sane` and hit enter to restore your shell."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "when using `find` with `-exec`, end the command with `+` instead of `\\;`. this passes all found files to a single command execution, saving massive cpu overhead."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "pipe a real-time log into grep using `tail -f log | grep --line-buffered error` to filter a live stream without the output getting trapped in the buffer."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "run `cat -A file` to reveal all hidden non-printing characters, trailing spaces, and invisible line endings in a troublesome config file."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "pipe `yes` into a command like `yes | rm -i *` to automatically spam `y` to dozens of interactive warning prompts in a row."
+ },
+ {
+ "cat": "shell_magic",
+ "text": "use `disown -a && exit` to safely detach all your running background jobs from the current shell so they do not die when you close the terminal."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "need to safely edit a systemd unit file? `systemctl edit <unit>` creates a drop-in override snippet so your changes survive package updates."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `systemctl isolate multi-user.target` to immediately switch to a non-graphical runlevel without rebooting."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "running `journalctl -p err..emerg` filters your logs to only show errors, criticals, alerts, and emergencies."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `systemctl get-default` to see what target your system boots into, and `systemctl set-default` to change it permanently."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `journalctl --disk-usage` to see exactly how much drive space your archived systemd logs are eating up."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `systemd-analyze critical-chain` to print a tree of the time-critical chain of units holding up your boot process."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "the `systemctl daemon-reload` command is strictly required anytime you manually create or edit a unit file on disk."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `journalctl -u sshd --since today` to see only the logs for the ssh daemon generated since midnight."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `systemctl list-unit-files --state=enabled` to quickly audit everything that is configured to start on boot."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `systemctl show <unit>` to dump all the low-level properties and current state parameters of a specific service."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `dnf autoremove` to clean up orphaned dependencies that were installed for packages you have since removed."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "if an update breaks something critical, `dnf downgrade <package>` will attempt to revert it to the previously installed version."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `dnf repolist` to verify which software repositories are currently enabled and active on your system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `rpm -qc <package>` to list only the configuration files associated with an installed rpm package."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `rpm -qf /path/to/file` to find out exactly which installed package owns a specific file on your system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `rpm --scripts -qp <package.rpm>` before installing a random downloaded rpm to see what pre and post install scripts it runs."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `dnf makecache` to manually force your system to download the latest repository metadata right now."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `dnf module enable <module>:<stream>` to lock in a specific major version of an application stream before installing it."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `rpm -ql <package>` to get a complete list of every single file a package dropped onto your filesystem."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "running `dnf clean all` is the best way to resolve weird dependency resolution errors caused by corrupt local metadata."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `vgs`, `pvs`, and `lvs` for quick, single-line summaries of your lvm volume groups, physical volumes, and logical volumes."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `vgextend <vg_name> <device>` to add a newly initialized physical volume into an existing volume group."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `lvcreate -n <name> -L <size> <vg_name>` to carve out a new logical volume from the available free space in a volume group."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "always run `pvcreate /dev/sdX` to initialize a raw disk or partition before trying to hand it over to lvm."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `xfs_growfs /mountpoint` to expand an xfs filesystem after you have grown its underlying logical volume."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "if you are using ext4 instead of xfs, use `resize2fs /dev/mapper/vol` to expand the filesystem to fill the logical volume."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `blkid` to print out the universally unique identifiers (UUIDs) for every formatted block device on your system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `partprobe` to force the kernel to re-read the partition table without needing a full system reboot."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `mount -a` after editing /etc/fstab to verify there are no syntax errors before you reboot and break the system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `findmnt --verify` to let the system actively parse your fstab and warn you about missing devices or bad options."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `swapoff -a` and then `swapon -a` to completely flush your swap space back into regular ram if you have enough free."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `mkswap /dev/sdX` to format a dedicated partition or logical volume specifically for use as swap space."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `fdisk -l` for a traditional, verbose overview of all attached disks and their partition tables."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `getenforce` to quickly check if selinux is running in enforcing, permissive, or disabled mode."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `setenforce 0` to temporarily put selinux into permissive mode for troubleshooting without breaking the whole system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `semanage fcontext -a -t <type> \"/path(/.*)?\"` to define the default selinux context rules for a custom directory."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `semanage port -l` to see the complete list of default network ports and what selinux allows them to be used for."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `semanage login -l` to map linux users to specific selinux confined user roles for stricter access control."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `chcon -t <type> <file>` for a temporary context change, but remember that `restorecon` will overwrite it later."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "if you really messed up your contexts, run `touch /.autorelabel` and reboot to force selinux to re-evaluate every file on the system."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `ausearch -m AVC,USER_AVC -ts recent` to pull only the actual selinux denial events from the audit log."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `nmcli con show` to see all defined network profiles, and look at the color to see which ones are currently active."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `nmcli con up <name>` or `nmcli con down <name>` to toggle network connections on and off."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `nmcli con add type ethernet con-name <name> ifname <interface>` to generate a brand new network profile from scratch."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `nmcli con mod <name> ipv4.addresses <ip/cidr>` to assign a static IP address to a specific network connection."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "if you set a static IP, you must also run `nmcli con mod <name> ipv4.method manual` so it does not try to dhcp over it."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `nmcli dev status` to see the hardware state of your physical network interface cards."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `nmcli dev show <interface>` to dump all the active ip routing, dns, and hardware details for a specific adapter."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `ip a` as the modern, faster replacement for `ifconfig` to see your current interface addresses."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `ip r` to view the kernel routing table and figure out where your default gateway is pointing."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `ip n` to view the arp cache and see the mac addresses of other devices communicating on your local subnet."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `tracepath <host>` to discover the routing hops to a destination and see the path mtu discovery in action."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `firewall-cmd --state` to verify the firewalld daemon is actually running and actively managing iptables/nftables."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `firewall-cmd --get-active-zones` to see which firewall zones are currently bound to which network interfaces."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `firewall-cmd --list-all` to see exactly what ports, services, and rich rules are active in your default zone."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `firewall-cmd --add-service=http --permanent` to open the standard port 80 based on its service definition."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `firewall-cmd --remove-service=<service>` to close a port and block incoming traffic for that specific protocol."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `firewall-cmd --panic-on` to instantly drop all network packets in an emergency. use `--panic-off` to restore access."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `firewall-cmd --runtime-to-permanent` to save all the live rules you just tested into the permanent configuration."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use rich rules like `firewall-cmd --add-rich-rule=\"rule family=ipv4 source address=10.0.0.5 accept\"` for precise ip filtering."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `podman run -d --name <name> <image>` to start a container detached in the background."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `podman ps -a` to see all containers, including those that have crashed or successfully exited."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `podman images` to list all the container images currently cached in your local storage."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `podman rmi <image>` to permanently delete a cached image and free up disk space."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `podman rm <container>` to destroy an existing container. add `-f` to force it if it is still running."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `podman generate systemd --new --name <container>` to create a native systemd service file to manage your podman workload."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `podman exec -it <container> /bin/bash` to drop into an interactive shell inside a running container."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `podman logs -f <container>` to stream the stdout and stderr logs of a container in real-time."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `podman inspect <container>` to get a massive json dump of the internal networking, mounts, and state of a container."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `podman pod create` to group multiple containers together so they share the same network namespace and local host IP."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `useradd -m -s /bin/bash <user>` to create a new user account, force their home directory creation, and set their default shell."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `usermod -aG <group> <user>` to append a user to an additional group. do not forget the `a`, or you will remove them from their other groups."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `passwd -l <user>` to instantly lock an account without deleting their data. use `-u` to unlock it later."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `chage -l <user>` to view their password aging rules, expiration dates, and account validity."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "always use `visudo` to edit the /etc/sudoers file so it validates your syntax before saving and locking you out of root."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `chmod u+s <file>` to set the SUID bit, allowing the program to execute with the permissions of the file owner."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `chmod g+s <directory>` to set the SGID bit on a folder, forcing all new files created inside it to inherit the folder's group ownership."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `chmod +t <directory>` to set the sticky bit, ensuring only the file owner or root can delete files in a shared directory like /tmp."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `getfacl <file>` to view the extended access control lists if basic linux permissions are not enough."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `setfacl -m u:<user>:rwx <file>` to explicitly grant a specific user full permissions without changing the file owner."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `chronyc sources` to see exactly which ntp servers you are syncing with and their current stratum and polling rate."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `tuned-adm list` to see all the available system tuning profiles installed by the tuned daemon."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `tuned-adm profile <name>` to apply an optimized kernel profile like `virtual-guest` or `throughput-performance`."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `stratis pool list` to see your currently configured stratis storage pools if you are using rhel's newer volume manager."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `vdo status` to check the deduplication and compression ratios on your configured virtual data optimizer block devices."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `showmount -e <nfs_server>` to ask a remote server to list all the nfs shares it is actively exporting."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `autofs` combined with /etc/auto.master to automatically mount network shares on demand only when a user accesses the directory."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `lscpu` to get a clean, human-readable breakdown of your processor architecture, cores, threads, and numa nodes."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `free -h` to see your memory and swap utilization in megabytes and gigabytes instead of counting raw bytes."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `uptime` to get a quick one-liner showing how long the system has been running and the 1, 5, and 15 minute load averages."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `top -c` to see the process viewer with the full command line arguments displayed for every running process."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "use `crontab -e` to edit the current user's cron jobs, or look in /etc/cron.d/ for system-wide scheduling."
+ },
+ {
+ "cat": "sysadmin",
+ "text": "run `df -hT` to see your disk space utilization alongside the actual filesystem type (xfs, ext4, nfs) for each mount."
+ }
+]
\ No newline at end of file