mirror of
https://github.com/Anon-Planet/thgtoa.git
synced 2026-06-20 20:48:00 +02:00
docs(web!): get new web design up
Serve the new look, update licensing.
This commit is contained in:
@@ -154,7 +154,7 @@ jobs:
|
|||||||
|
|
||||||
### 🔏 Verifying GPG signatures
|
### 🔏 Verifying GPG signatures
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
# Import the release signing key
|
# Import the release signing key
|
||||||
gpg --import pgp/anonymousplanet-release.asc
|
gpg --import pgp/anonymousplanet-release.asc
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,427 @@
|
|||||||
|
Attribution-ShareAlike 4.0 International
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||||
|
does not provide legal services or legal advice. Distribution of
|
||||||
|
Creative Commons public licenses does not create a lawyer-client or
|
||||||
|
other relationship. Creative Commons makes its licenses and related
|
||||||
|
information available on an "as-is" basis. Creative Commons gives no
|
||||||
|
warranties regarding its licenses, any material licensed under their
|
||||||
|
terms and conditions, or any related information. Creative Commons
|
||||||
|
disclaims all liability for damages resulting from their use to the
|
||||||
|
fullest extent possible.
|
||||||
|
|
||||||
|
Using Creative Commons Public Licenses
|
||||||
|
|
||||||
|
Creative Commons public licenses provide a standard set of terms and
|
||||||
|
conditions that creators and other rights holders may use to share
|
||||||
|
original works of authorship and other material subject to copyright
|
||||||
|
and certain other rights specified in the public license below. The
|
||||||
|
following considerations are for informational purposes only, are not
|
||||||
|
exhaustive, and do not form part of our licenses.
|
||||||
|
|
||||||
|
Considerations for licensors: Our public licenses are
|
||||||
|
intended for use by those authorized to give the public
|
||||||
|
permission to use material in ways otherwise restricted by
|
||||||
|
copyright and certain other rights. Our licenses are
|
||||||
|
irrevocable. Licensors should read and understand the terms
|
||||||
|
and conditions of the license they choose before applying it.
|
||||||
|
Licensors should also secure all rights necessary before
|
||||||
|
applying our licenses so that the public can reuse the
|
||||||
|
material as expected. Licensors should clearly mark any
|
||||||
|
material not subject to the license. This includes other CC-
|
||||||
|
licensed material, or material used under an exception or
|
||||||
|
limitation to copyright. More considerations for licensors:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensors
|
||||||
|
|
||||||
|
Considerations for the public: By using one of our public
|
||||||
|
licenses, a licensor grants the public permission to use the
|
||||||
|
licensed material under specified terms and conditions. If
|
||||||
|
the licensor's permission is not necessary for any reason--for
|
||||||
|
example, because of any applicable exception or limitation to
|
||||||
|
copyright--then that use is not regulated by the license. Our
|
||||||
|
licenses grant only permissions under copyright and certain
|
||||||
|
other rights that a licensor has authority to grant. Use of
|
||||||
|
the licensed material may still be restricted for other
|
||||||
|
reasons, including because others have copyright or other
|
||||||
|
rights in the material. A licensor may make special requests,
|
||||||
|
such as asking that all changes be marked or described.
|
||||||
|
Although not required by our licenses, you are encouraged to
|
||||||
|
respect those requests where reasonable. More considerations
|
||||||
|
for the public:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensees
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Attribution-ShareAlike 4.0 International Public
|
||||||
|
License
|
||||||
|
|
||||||
|
By exercising the Licensed Rights (defined below), You accept and agree
|
||||||
|
to be bound by the terms and conditions of this Creative Commons
|
||||||
|
Attribution-ShareAlike 4.0 International Public License ("Public
|
||||||
|
License"). To the extent this Public License may be interpreted as a
|
||||||
|
contract, You are granted the Licensed Rights in consideration of Your
|
||||||
|
acceptance of these terms and conditions, and the Licensor grants You
|
||||||
|
such rights in consideration of benefits the Licensor receives from
|
||||||
|
making the Licensed Material available under these terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
|
||||||
|
Section 1 -- Definitions.
|
||||||
|
|
||||||
|
a. Adapted Material means material subject to Copyright and Similar
|
||||||
|
Rights that is derived from or based upon the Licensed Material
|
||||||
|
and in which the Licensed Material is translated, altered,
|
||||||
|
arranged, transformed, or otherwise modified in a manner requiring
|
||||||
|
permission under the Copyright and Similar Rights held by the
|
||||||
|
Licensor. For purposes of this Public License, where the Licensed
|
||||||
|
Material is a musical work, performance, or sound recording,
|
||||||
|
Adapted Material is always produced where the Licensed Material is
|
||||||
|
synched in timed relation with a moving image.
|
||||||
|
|
||||||
|
b. Adapter's License means the license You apply to Your Copyright
|
||||||
|
and Similar Rights in Your contributions to Adapted Material in
|
||||||
|
accordance with the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
c. BY-SA Compatible License means a license listed at
|
||||||
|
creativecommons.org/compatiblelicenses, approved by Creative
|
||||||
|
Commons as essentially the equivalent of this Public License.
|
||||||
|
|
||||||
|
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||||
|
closely related to copyright including, without limitation,
|
||||||
|
performance, broadcast, sound recording, and Sui Generis Database
|
||||||
|
Rights, without regard to how the rights are labeled or
|
||||||
|
categorized. For purposes of this Public License, the rights
|
||||||
|
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||||
|
Rights.
|
||||||
|
|
||||||
|
e. Effective Technological Measures means those measures that, in the
|
||||||
|
absence of proper authority, may not be circumvented under laws
|
||||||
|
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||||
|
Treaty adopted on December 20, 1996, and/or similar international
|
||||||
|
agreements.
|
||||||
|
|
||||||
|
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||||
|
any other exception or limitation to Copyright and Similar Rights
|
||||||
|
that applies to Your use of the Licensed Material.
|
||||||
|
|
||||||
|
g. License Elements means the license attributes listed in the name
|
||||||
|
of a Creative Commons Public License. The License Elements of this
|
||||||
|
Public License are Attribution and ShareAlike.
|
||||||
|
|
||||||
|
h. Licensed Material means the artistic or literary work, database,
|
||||||
|
or other material to which the Licensor applied this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
i. Licensed Rights means the rights granted to You subject to the
|
||||||
|
terms and conditions of this Public License, which are limited to
|
||||||
|
all Copyright and Similar Rights that apply to Your use of the
|
||||||
|
Licensed Material and that the Licensor has authority to license.
|
||||||
|
|
||||||
|
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||||
|
under this Public License.
|
||||||
|
|
||||||
|
k. Share means to provide material to the public by any means or
|
||||||
|
process that requires permission under the Licensed Rights, such
|
||||||
|
as reproduction, public display, public performance, distribution,
|
||||||
|
dissemination, communication, or importation, and to make material
|
||||||
|
available to the public including in ways that members of the
|
||||||
|
public may access the material from a place and at a time
|
||||||
|
individually chosen by them.
|
||||||
|
|
||||||
|
l. Sui Generis Database Rights means rights other than copyright
|
||||||
|
resulting from Directive 96/9/EC of the European Parliament and of
|
||||||
|
the Council of 11 March 1996 on the legal protection of databases,
|
||||||
|
as amended and/or succeeded, as well as other essentially
|
||||||
|
equivalent rights anywhere in the world.
|
||||||
|
|
||||||
|
m. You means the individual or entity exercising the Licensed Rights
|
||||||
|
under this Public License. Your has a corresponding meaning.
|
||||||
|
|
||||||
|
|
||||||
|
Section 2 -- Scope.
|
||||||
|
|
||||||
|
a. License grant.
|
||||||
|
|
||||||
|
1. Subject to the terms and conditions of this Public License,
|
||||||
|
the Licensor hereby grants You a worldwide, royalty-free,
|
||||||
|
non-sublicensable, non-exclusive, irrevocable license to
|
||||||
|
exercise the Licensed Rights in the Licensed Material to:
|
||||||
|
|
||||||
|
a. reproduce and Share the Licensed Material, in whole or
|
||||||
|
in part; and
|
||||||
|
|
||||||
|
b. produce, reproduce, and Share Adapted Material.
|
||||||
|
|
||||||
|
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||||
|
Exceptions and Limitations apply to Your use, this Public
|
||||||
|
License does not apply, and You do not need to comply with
|
||||||
|
its terms and conditions.
|
||||||
|
|
||||||
|
3. Term. The term of this Public License is specified in Section
|
||||||
|
6(a).
|
||||||
|
|
||||||
|
4. Media and formats; technical modifications allowed. The
|
||||||
|
Licensor authorizes You to exercise the Licensed Rights in
|
||||||
|
all media and formats whether now known or hereafter created,
|
||||||
|
and to make technical modifications necessary to do so. The
|
||||||
|
Licensor waives and/or agrees not to assert any right or
|
||||||
|
authority to forbid You from making technical modifications
|
||||||
|
necessary to exercise the Licensed Rights, including
|
||||||
|
technical modifications necessary to circumvent Effective
|
||||||
|
Technological Measures. For purposes of this Public License,
|
||||||
|
simply making modifications authorized by this Section 2(a)
|
||||||
|
(4) never produces Adapted Material.
|
||||||
|
|
||||||
|
5. Downstream recipients.
|
||||||
|
|
||||||
|
a. Offer from the Licensor -- Licensed Material. Every
|
||||||
|
recipient of the Licensed Material automatically
|
||||||
|
receives an offer from the Licensor to exercise the
|
||||||
|
Licensed Rights under the terms and conditions of this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
b. Additional offer from the Licensor -- Adapted Material.
|
||||||
|
Every recipient of Adapted Material from You
|
||||||
|
automatically receives an offer from the Licensor to
|
||||||
|
exercise the Licensed Rights in the Adapted Material
|
||||||
|
under the conditions of the Adapter's License You apply.
|
||||||
|
|
||||||
|
c. No downstream restrictions. You may not offer or impose
|
||||||
|
any additional or different terms or conditions on, or
|
||||||
|
apply any Effective Technological Measures to, the
|
||||||
|
Licensed Material if doing so restricts exercise of the
|
||||||
|
Licensed Rights by any recipient of the Licensed
|
||||||
|
Material.
|
||||||
|
|
||||||
|
6. No endorsement. Nothing in this Public License constitutes or
|
||||||
|
may be construed as permission to assert or imply that You
|
||||||
|
are, or that Your use of the Licensed Material is, connected
|
||||||
|
with, or sponsored, endorsed, or granted official status by,
|
||||||
|
the Licensor or others designated to receive attribution as
|
||||||
|
provided in Section 3(a)(1)(A)(i).
|
||||||
|
|
||||||
|
b. Other rights.
|
||||||
|
|
||||||
|
1. Moral rights, such as the right of integrity, are not
|
||||||
|
licensed under this Public License, nor are publicity,
|
||||||
|
privacy, and/or other similar personality rights; however, to
|
||||||
|
the extent possible, the Licensor waives and/or agrees not to
|
||||||
|
assert any such rights held by the Licensor to the limited
|
||||||
|
extent necessary to allow You to exercise the Licensed
|
||||||
|
Rights, but not otherwise.
|
||||||
|
|
||||||
|
2. Patent and trademark rights are not licensed under this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
3. To the extent possible, the Licensor waives any right to
|
||||||
|
collect royalties from You for the exercise of the Licensed
|
||||||
|
Rights, whether directly or through a collecting society
|
||||||
|
under any voluntary or waivable statutory or compulsory
|
||||||
|
licensing scheme. In all other cases the Licensor expressly
|
||||||
|
reserves any right to collect such royalties.
|
||||||
|
|
||||||
|
|
||||||
|
Section 3 -- License Conditions.
|
||||||
|
|
||||||
|
Your exercise of the Licensed Rights is expressly made subject to the
|
||||||
|
following conditions.
|
||||||
|
|
||||||
|
a. Attribution.
|
||||||
|
|
||||||
|
1. If You Share the Licensed Material (including in modified
|
||||||
|
form), You must:
|
||||||
|
|
||||||
|
a. retain the following if it is supplied by the Licensor
|
||||||
|
with the Licensed Material:
|
||||||
|
|
||||||
|
i. identification of the creator(s) of the Licensed
|
||||||
|
Material and any others designated to receive
|
||||||
|
attribution, in any reasonable manner requested by
|
||||||
|
the Licensor (including by pseudonym if
|
||||||
|
designated);
|
||||||
|
|
||||||
|
ii. a copyright notice;
|
||||||
|
|
||||||
|
iii. a notice that refers to this Public License;
|
||||||
|
|
||||||
|
iv. a notice that refers to the disclaimer of
|
||||||
|
warranties;
|
||||||
|
|
||||||
|
v. a URI or hyperlink to the Licensed Material to the
|
||||||
|
extent reasonably practicable;
|
||||||
|
|
||||||
|
b. indicate if You modified the Licensed Material and
|
||||||
|
retain an indication of any previous modifications; and
|
||||||
|
|
||||||
|
c. indicate the Licensed Material is licensed under this
|
||||||
|
Public License, and include the text of, or the URI or
|
||||||
|
hyperlink to, this Public License.
|
||||||
|
|
||||||
|
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||||
|
reasonable manner based on the medium, means, and context in
|
||||||
|
which You Share the Licensed Material. For example, it may be
|
||||||
|
reasonable to satisfy the conditions by providing a URI or
|
||||||
|
hyperlink to a resource that includes the required
|
||||||
|
information.
|
||||||
|
|
||||||
|
3. If requested by the Licensor, You must remove any of the
|
||||||
|
information required by Section 3(a)(1)(A) to the extent
|
||||||
|
reasonably practicable.
|
||||||
|
|
||||||
|
b. ShareAlike.
|
||||||
|
|
||||||
|
In addition to the conditions in Section 3(a), if You Share
|
||||||
|
Adapted Material You produce, the following conditions also apply.
|
||||||
|
|
||||||
|
1. The Adapter's License You apply must be a Creative Commons
|
||||||
|
license with the same License Elements, this version or
|
||||||
|
later, or a BY-SA Compatible License.
|
||||||
|
|
||||||
|
2. You must include the text of, or the URI or hyperlink to, the
|
||||||
|
Adapter's License You apply. You may satisfy this condition
|
||||||
|
in any reasonable manner based on the medium, means, and
|
||||||
|
context in which You Share Adapted Material.
|
||||||
|
|
||||||
|
3. You may not offer or impose any additional or different terms
|
||||||
|
or conditions on, or apply any Effective Technological
|
||||||
|
Measures to, Adapted Material that restrict exercise of the
|
||||||
|
rights granted under the Adapter's License You apply.
|
||||||
|
|
||||||
|
|
||||||
|
Section 4 -- Sui Generis Database Rights.
|
||||||
|
|
||||||
|
Where the Licensed Rights include Sui Generis Database Rights that
|
||||||
|
apply to Your use of the Licensed Material:
|
||||||
|
|
||||||
|
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||||
|
to extract, reuse, reproduce, and Share all or a substantial
|
||||||
|
portion of the contents of the database;
|
||||||
|
|
||||||
|
b. if You include all or a substantial portion of the database
|
||||||
|
contents in a database in which You have Sui Generis Database
|
||||||
|
Rights, then the database in which You have Sui Generis Database
|
||||||
|
Rights (but not its individual contents) is Adapted Material,
|
||||||
|
including for purposes of Section 3(b); and
|
||||||
|
|
||||||
|
c. You must comply with the conditions in Section 3(a) if You Share
|
||||||
|
all or a substantial portion of the contents of the database.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 4 supplements and does not
|
||||||
|
replace Your obligations under this Public License where the Licensed
|
||||||
|
Rights include other Copyright and Similar Rights.
|
||||||
|
|
||||||
|
|
||||||
|
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||||
|
|
||||||
|
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||||
|
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||||
|
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||||
|
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||||
|
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||||
|
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||||
|
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||||
|
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||||
|
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||||
|
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||||
|
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||||
|
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||||
|
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||||
|
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||||
|
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||||
|
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
c. The disclaimer of warranties and limitation of liability provided
|
||||||
|
above shall be interpreted in a manner that, to the extent
|
||||||
|
possible, most closely approximates an absolute disclaimer and
|
||||||
|
waiver of all liability.
|
||||||
|
|
||||||
|
|
||||||
|
Section 6 -- Term and Termination.
|
||||||
|
|
||||||
|
a. This Public License applies for the term of the Copyright and
|
||||||
|
Similar Rights licensed here. However, if You fail to comply with
|
||||||
|
this Public License, then Your rights under this Public License
|
||||||
|
terminate automatically.
|
||||||
|
|
||||||
|
b. Where Your right to use the Licensed Material has terminated under
|
||||||
|
Section 6(a), it reinstates:
|
||||||
|
|
||||||
|
1. automatically as of the date the violation is cured, provided
|
||||||
|
it is cured within 30 days of Your discovery of the
|
||||||
|
violation; or
|
||||||
|
|
||||||
|
2. upon express reinstatement by the Licensor.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||||
|
right the Licensor may have to seek remedies for Your violations
|
||||||
|
of this Public License.
|
||||||
|
|
||||||
|
c. For the avoidance of doubt, the Licensor may also offer the
|
||||||
|
Licensed Material under separate terms or conditions or stop
|
||||||
|
distributing the Licensed Material at any time; however, doing so
|
||||||
|
will not terminate this Public License.
|
||||||
|
|
||||||
|
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 7 -- Other Terms and Conditions.
|
||||||
|
|
||||||
|
a. The Licensor shall not be bound by any additional or different
|
||||||
|
terms or conditions communicated by You unless expressly agreed.
|
||||||
|
|
||||||
|
b. Any arrangements, understandings, or agreements regarding the
|
||||||
|
Licensed Material not stated herein are separate from and
|
||||||
|
independent of the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 8 -- Interpretation.
|
||||||
|
|
||||||
|
a. For the avoidance of doubt, this Public License does not, and
|
||||||
|
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||||
|
conditions on any use of the Licensed Material that could lawfully
|
||||||
|
be made without permission under this Public License.
|
||||||
|
|
||||||
|
b. To the extent possible, if any provision of this Public License is
|
||||||
|
deemed unenforceable, it shall be automatically reformed to the
|
||||||
|
minimum extent necessary to make it enforceable. If the provision
|
||||||
|
cannot be reformed, it shall be severed from this Public License
|
||||||
|
without affecting the enforceability of the remaining terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
c. No term or condition of this Public License will be waived and no
|
||||||
|
failure to comply consented to unless expressly agreed to by the
|
||||||
|
Licensor.
|
||||||
|
|
||||||
|
d. Nothing in this Public License constitutes or may be interpreted
|
||||||
|
as a limitation upon, or waiver of, any privileges and immunities
|
||||||
|
that apply to the Licensor or You, including from the legal
|
||||||
|
processes of any jurisdiction or authority.
|
||||||
|
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons is not a party to its public
|
||||||
|
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||||
|
its public licenses to material it publishes and in those instances
|
||||||
|
will be considered the “Licensor.” The text of the Creative Commons
|
||||||
|
public licenses is dedicated to the public domain under the CC0 Public
|
||||||
|
Domain Dedication. Except for the limited purpose of indicating that
|
||||||
|
material is shared under a Creative Commons public license or as
|
||||||
|
otherwise permitted by the Creative Commons policies published at
|
||||||
|
creativecommons.org/policies, Creative Commons does not authorize the
|
||||||
|
use of the trademark "Creative Commons" or any other trademark or logo
|
||||||
|
of Creative Commons without its prior written consent including,
|
||||||
|
without limitation, in connection with any unauthorized modifications
|
||||||
|
to any of its public licenses or any other arrangements,
|
||||||
|
understandings, or agreements concerning use of licensed material. For
|
||||||
|
the avoidance of doubt, this paragraph does not form part of the
|
||||||
|
public licenses.
|
||||||
|
|
||||||
|
Creative Commons may be contacted at creativecommons.org.
|
||||||
+2
-7
@@ -13,11 +13,8 @@ schema:
|
|||||||
- https://opencollective.com/anonymousplanetorg
|
- https://opencollective.com/anonymousplanetorg
|
||||||
- https://mastodon.social/@anonymousplanet
|
- https://mastodon.social/@anonymousplanet
|
||||||
---
|
---
|
||||||
{ align=right }
|
|
||||||
|
|
||||||
**Anonymous Planet** are the maintainers of the [_Hitchhiker's Guide_](../guide/index.md) and the [_PSA Community_](https://psa.anonymousplanet.net). It is responsible for maintaining the projects and code repositories. This project is part of our ongoing efforts to provide open-source tools and resources for the community, with regular updates and improvements added to the changelog.
|
**Anonymous Planet** are the maintainers of [_The Hitchhiker's Guide_](../guide/index.md) and the [_PSA Community_](https://psa.anonymousplanet.net). This project is part of our ongoing efforts to provide open-source tools and resources for the community, made by people with extensive knowledge in signals and forensics, and expertise in various distributions of Linux. We are providing an introduction to various online tracking techniques, online ID verification techniques, and detailed guidance to creating and maintaining (truly) anonymous online identities. It is written with the hopes that good people (e.g., activists, journalists, scientists, lawyers, whistle-blowers, etc.) will be able to fight oppression, censorship and harassment! The website and projects are free (as in freedom). We are high at risk individuals. We are not simply hackers with a bunch of recommendations and affiliate links like privacytools. To be blunt like Linus Torvalds with a bullshit Merge Request, we don't do that. Here, you will find a trove of information compiled into a single, cohesive set of instructions and sub-guides.
|
||||||
|
|
||||||
The purpose: providing an introduction to various online tracking techniques, online ID verification techniques, and detailed guidance to creating and maintaining (truly) anonymous online identities. It is written with the hopes that good people (e.g., activists, journalists, scientists, lawyers, whistle-blowers, etc.) will be able to fight oppression, censorship and harassment! The website and projects are free (as in freedom) and not affiliated with any donor or projects discussed.
|
|
||||||
|
|
||||||
??? Note "Where do I start?"
|
??? Note "Where do I start?"
|
||||||
|
|
||||||
@@ -25,14 +22,12 @@ The purpose: providing an introduction to various online tracking techniques, on
|
|||||||
|
|
||||||
??? Note "Notes on the journey"
|
??? Note "Notes on the journey"
|
||||||
|
|
||||||
This guide is a work in progress. It will probably never be "finished". You may (will) find broken links when you click on some search results and during some navigation steps. Please report these. Otherwise, most of the search functionality is a great experience and can help you find linked topics. Try to search for something in one section of the reading. It will show up in many other places.
|
This guide is a work in progress. It will probably never be "finished". You may find broken links when you click on some search results and during some navigation steps. Please report these. Otherwise, most of the search functionality is a great experience and can help you find linked topics. Try to search for something in one section of the reading. It will show up in many other places.
|
||||||
|
|
||||||
??? Note "Disclaimer"
|
??? Note "Disclaimer"
|
||||||
|
|
||||||
There might be some wrong or outdated information in this guide because no one is perfect. Your experience may vary. Remember, check regularly for an updated version of this guide. Please do your own independent, well-thought research. There is no one resource online that can provide 100% security, anonymity, and/or privacy.
|
There might be some wrong or outdated information in this guide because no one is perfect. Your experience may vary. Remember, check regularly for an updated version of this guide. Please do your own independent, well-thought research. There is no one resource online that can provide 100% security, anonymity, and/or privacy.
|
||||||
|
|
||||||
This guide is a non-profit open-source initiative, licensed under Creative Commons **Attribution-NonCommercial** 4.0 International ([cc-by-nc-4.0](https://creativecommons.org/licenses/by-nc/4.0/) <sup>[[Archive.org]](https://web.archive.org/web/https://creativecommons.org/licenses/by-nc/4.0/)</sup>).
|
|
||||||
|
|
||||||
- For mirrors see [Mirrors](../mirrors/index.md) and the links at the bottom right of the page. You should see these on every page.
|
- For mirrors see [Mirrors](../mirrors/index.md) and the links at the bottom right of the page. You should see these on every page.
|
||||||
|
|
||||||
- For help in comparing versions see [Comparing versions](../guide/index.md#appendix-a6-comparing-versions)
|
- For help in comparing versions see [Comparing versions](../guide/index.md#appendix-a6-comparing-versions)
|
||||||
|
|||||||
+11
-9
@@ -14,16 +14,20 @@ schema:
|
|||||||
- https://mastodon.social/@anonymousplanet
|
- https://mastodon.social/@anonymousplanet
|
||||||
---
|
---
|
||||||
|
|
||||||
# Release Notes
|
Notable changes to the guide. Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
Notable changes to the guide and its tooling. Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [v1.2.5]
|
## [v1.2.5]
|
||||||
|
|
||||||
|
!!! Note "Meta"
|
||||||
|
|
||||||
|
- Website theme customization
|
||||||
|
- License change to accomodate our fiscal host Open Source Collective
|
||||||
|
|
||||||
!!! Note "Changed"
|
!!! Note "Changed"
|
||||||
|
|
||||||
- Comprehensive updates throughout the guide reflecting the transition to Whonix 18.x as the default version
|
- Comprehensive updates throughout the guide reflecting the transition to Whonix 18.x as the newest version
|
||||||
- Replaced outdated Whonix.org wiki docs links with GitHub releases mirror and Archive.org backups
|
- Replaced outdated Whonix.org wiki docs links with GitHub releases mirror and Archive.org backups
|
||||||
- Updated Virtualbox hardening instructions (e.g., network time desync offsets, Spectre/Meltdown mitigations)
|
- Updated Virtualbox hardening instructions (e.g., network time desync offsets, Spectre/Meltdown mitigations)
|
||||||
- Added AppArmor enabling guidance for Debian-based Whonix 18.x Workstation VMs
|
- Added AppArmor enabling guidance for Debian-based Whonix 18.x Workstation VMs
|
||||||
@@ -33,20 +37,18 @@ Notable changes to the guide and its tooling. Follows [Keep a Changelog](https:/
|
|||||||
- Enhanced system verification instructions after upgrades (checkvm, tor --verify)
|
- Enhanced system verification instructions after upgrades (checkvm, tor --verify)
|
||||||
- Improved documentation links to use clean markdown format with Archive.org mirrors for resilience
|
- Improved documentation links to use clean markdown format with Archive.org mirrors for resilience
|
||||||
- Added comprehensive upgrade path guidance with backup procedures
|
- Added comprehensive upgrade path guidance with backup procedures
|
||||||
- Updated 196 Wikipedia reference links throughout the entire guide (All links now point to https://wikiless.tiekoetter.com/wiki/)
|
- Updated 196! Wikipedia reference links throughout the entire guide
|
||||||
|
|
||||||
!!! Note "Added"
|
!!! Note "Added"
|
||||||
|
|
||||||
- All Whonix.org/wiki links now have Archive.org mirror backups for availability
|
- All Whonix.org/wiki links now have Archive.org mirror backups for availability
|
||||||
- Upgrade path documented: Whonix 17 to 18 with automated release-upgrade support
|
- Upgrade path documented: Whonix 17 to 18 with automated release-upgrade support
|
||||||
- Detailed Qubes OS compatibility notes for both Whonix versions
|
- Detailed Qubes OS compatibility notes for both Whonix versions
|
||||||
- Memory file `whonix-docs-comprehensive-update.md` with full changelog of modifications
|
- You can now get the Anonymous Planet PGP keyring from the site (copy/paste or download)
|
||||||
- Memory file `whonix-18x-upgrade-notes.md` with upgrade guidance and best practices
|
|
||||||
- You can now get the RSK and MSK from the navbar
|
|
||||||
|
|
||||||
!!! Note "Improved"
|
!!! Note "Improved"
|
||||||
|
|
||||||
- Virtualbox hardening section reorganized with bullet points for better readability
|
- Virtualbox hardening section reorganized
|
||||||
- AppArmor configuration guidance added where applicable (Whonix 18.x)
|
- AppArmor configuration guidance added where applicable (Whonix 18.x)
|
||||||
- KVM alternative documented in Appendix N for Linux users seeking better security than VirtualBox
|
- KVM alternative documented in Appendix N for Linux users seeking better security than VirtualBox
|
||||||
- Whonix Improvements subsection added before "Pick your guest workstation" VMs section
|
- Whonix Improvements subsection added before "Pick your guest workstation" VMs section
|
||||||
|
|||||||
@@ -1,404 +0,0 @@
|
|||||||
# Developer Guide
|
|
||||||
|
|
||||||
This page covers everything you need to contribute to the project, run the build pipeline locally, configure GitHub Secrets, and publish a release.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Install these before anything else.
|
|
||||||
|
|
||||||
=== "Linux / macOS"
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Python 3.11+
|
|
||||||
python3 --version
|
|
||||||
|
|
||||||
# poppler (pdftoppm) and qpdf
|
|
||||||
sudo apt install poppler-utils qpdf # Debian/Ubuntu
|
|
||||||
brew install poppler qpdf # macOS
|
|
||||||
|
|
||||||
# GPG
|
|
||||||
sudo apt install gnupg # Debian/Ubuntu
|
|
||||||
brew install gnupg # macOS
|
|
||||||
|
|
||||||
# Python dependencies
|
|
||||||
pip install "mkdocs-material[imaging]" pillow numpy
|
|
||||||
```
|
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Python 3.11+ from https://python.org
|
|
||||||
|
|
||||||
# poppler: download from https://github.com/oschwartz10612/poppler-windows/releases
|
|
||||||
# Extract and add the bin\ folder to PATH
|
|
||||||
|
|
||||||
# qpdf: download from https://github.com/qpdf/qpdf/releases
|
|
||||||
# Extract and add the bin\ folder to PATH
|
|
||||||
|
|
||||||
# GPG: download Gpg4win from https://gpg4win.org
|
|
||||||
|
|
||||||
# Python dependencies
|
|
||||||
pip install "mkdocs-material[imaging]" pillow numpy
|
|
||||||
```
|
|
||||||
|
|
||||||
You also need **Google Chrome** or **Microsoft Edge** installed for the light-mode PDF build (headless Chromium).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Repository layout
|
|
||||||
|
|
||||||
```
|
|
||||||
.github/
|
|
||||||
workflows/
|
|
||||||
01-build.yml # builds PDFs, uploads artifact
|
|
||||||
02-sign.yml # hashes + GPG signs, uploads signatures artifact
|
|
||||||
03-release.yml # publishes GitHub Release with all assets
|
|
||||||
04-changelog.yml # prepends a new entry to docs/changelog/index.md
|
|
||||||
publish.yml # deploys MkDocs site to GitHub Pages
|
|
||||||
docs/
|
|
||||||
guide/index.md # the guide (single Markdown file)
|
|
||||||
changelog/ # release notes
|
|
||||||
code/ # this page
|
|
||||||
export/ # PDF output (PDFs gitignored; .sha256, .b2sum, .asc tracked)
|
|
||||||
pgp/ # public signing keys
|
|
||||||
scripts/
|
|
||||||
build_guide_pdf.py # MkDocs + Chromium PDF builder
|
|
||||||
convert.py # pixel-based dark mode PDF converter
|
|
||||||
update_changelog.py # auto-generates changelog entries from git log
|
|
||||||
setup_workflow.py # GitHub Secrets setup assistant
|
|
||||||
verify_pdf.py # signature verification helper
|
|
||||||
archived/
|
|
||||||
tag_release.py # ARCHIVED - GPG tag helper (not used in current flow)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Building locally
|
|
||||||
|
|
||||||
### Build both PDFs
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python scripts/build_guide_pdf.py --both
|
|
||||||
```
|
|
||||||
|
|
||||||
This builds the MkDocs site, renders it to `export/thgtoa.pdf` via headless Chromium, then calls `scripts/convert.py` to produce `export/thgtoa-dark.pdf`.
|
|
||||||
|
|
||||||
| Flag | Effect |
|
|
||||||
|------|--------|
|
|
||||||
| `--both` | Light PDF then dark PDF |
|
|
||||||
| (no flag) | Light PDF only |
|
|
||||||
| `--dark` | Dark PDF only (light PDF must already exist) |
|
|
||||||
|
|
||||||
### Build only the dark PDF from an existing light PDF
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python scripts/convert.py export/thgtoa.pdf export/thgtoa-dark.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
| Flag | Default | Description |
|
|
||||||
|------|---------|-------------|
|
|
||||||
| `--dpi` | `200` | Rasterization DPI. 150 = smaller file, 300 = sharper but slow |
|
|
||||||
| `--batch-size` | `50` | Pages per batch. Reduce if you hit OOM |
|
|
||||||
| `--bg` | `1f1f31` | Background colour (hex) |
|
|
||||||
| `--text` | `e0e0e0` | Body text colour (hex) |
|
|
||||||
| `--link` | `5e8bde` | Link / blue element colour (hex) |
|
|
||||||
|
|
||||||
### Preview the MkDocs site
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdocs serve
|
|
||||||
```
|
|
||||||
|
|
||||||
Opens at `http://127.0.0.1:8000`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## CI/CD pipeline overview
|
|
||||||
|
|
||||||
The pipeline is fully manual after the initial build - no step automatically triggers the next. This prevents version mismatches between what was built, what was signed, and what gets released. The workflows are numbered to help guide you.
|
|
||||||
|
|
||||||
```
|
|
||||||
push to main (or manual trigger)
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
01-build.yml
|
|
||||||
Builds thgtoa.pdf + thgtoa-dark.pdf.
|
|
||||||
Uploads artifact: pdfs
|
|
||||||
Note the run ID.
|
|
||||||
│
|
|
||||||
│ # manually trigger 02-sign.yml with the build run ID
|
|
||||||
▼
|
|
||||||
02-sign.yml
|
|
||||||
Downloads pdfs artifact. Hashes (SHA-256 + BLAKE2b) and GPG-signs
|
|
||||||
all files. Commits export/ back to main. Uploads artifacts:
|
|
||||||
signatures, pdfs-signed
|
|
||||||
Note the run ID.
|
|
||||||
│
|
|
||||||
│ # manually trigger 03-release.yml with the sign run ID
|
|
||||||
▼
|
|
||||||
03-release.yml
|
|
||||||
Downloads signatures + pdfs-signed artifacts. Runs VirusTotal.
|
|
||||||
Creates GitHub Release tagged release-YYYYMMDD-<short-sha>.
|
|
||||||
│
|
|
||||||
│ # manually trigger 04-changelog.yml with the version string
|
|
||||||
▼
|
|
||||||
04-changelog.yml
|
|
||||||
Runs update_changelog.py, prepends a new ## [vX.Y.Z] entry,
|
|
||||||
commits back to main.
|
|
||||||
```
|
|
||||||
|
|
||||||
Each stage is independent. If signing fails (e.g. an expired/revoked key, other problems in CI), re-run only `02-sign.yml` pointing at the existing build artifact - no need to rebuild the PDFs.
|
|
||||||
|
|
||||||
!!! warning "Before you push"
|
|
||||||
|
|
||||||
- Make sure the working tree is clean (`git status`)
|
|
||||||
- Run `mkdocs build` locally if you changed `docs/` to catch broken links before CI does
|
|
||||||
- If you added new footnotes, verify they have both a definition `[^N]:` and at least one inline citation `[^N]`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release process (step by step)
|
|
||||||
|
|
||||||
### 1. Trigger a build
|
|
||||||
|
|
||||||
Push to `main` - `01-build.yml` runs automatically when `docs/`, `mkdocs.yml`, or `scripts/` change. You can also trigger it manually from **Actions → Build PDFs → Run workflow**.
|
|
||||||
|
|
||||||
Once it completes successfully, **note the run ID** from the URL or the Actions list.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. Sign the PDFs
|
|
||||||
|
|
||||||
Go to **Actions → Sign PDFs → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `build_run_id` | The run ID from step 1 |
|
|
||||||
|
|
||||||
`02-sign.yml` will:
|
|
||||||
|
|
||||||
- Download the PDFs artifact from the build run
|
|
||||||
- Compute SHA-256 and BLAKE2b hashes, writing `thgtoa.pdf.sha256`, `thgtoa.pdf.b2sum`, `sha256sums.txt`, `b2sums.txt`, and the dark equivalents
|
|
||||||
- GPG-sign all PDFs and hash files, writing `.asc` detached signature files
|
|
||||||
- Commit the updated `export/` directory back to `main`
|
|
||||||
- Upload two artifacts: `signatures` and `pdfs-signed`
|
|
||||||
|
|
||||||
Once it completes successfully, **note the run ID**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. Publish the release
|
|
||||||
|
|
||||||
Go to **Actions → Release → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `sign_run_id` | The run ID from step 2 |
|
|
||||||
| `prerelease` | `false` for a normal release |
|
|
||||||
|
|
||||||
`03-release.yml` will:
|
|
||||||
|
|
||||||
- Download `signatures` and `pdfs-signed` artifacts from the sign run
|
|
||||||
- Upload both PDFs to VirusTotal
|
|
||||||
- Auto-generate a release tag in the format `release-YYYYMMDD-<short-sha>` (e.g. `release-20260527-abc1234`)
|
|
||||||
- Create a GitHub Release with all PDFs, hash files, and signatures attached, and the VirusTotal report URLs in the body
|
|
||||||
|
|
||||||
No version number needs to be chosen at this step - the tag is derived from the date and commit SHA, so it is always unique and always traceable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. Update the changelog
|
|
||||||
|
|
||||||
Go to **Actions → Update Changelog → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `version` | The human-readable version string, e.g. `v1.2.4` |
|
|
||||||
| `dry_run` | `true` to preview without committing |
|
|
||||||
|
|
||||||
`04-changelog.yml` runs `scripts/update_changelog.py`, which:
|
|
||||||
|
|
||||||
- Reads git log since the last `## [vX.Y.Z]` heading in the changelog
|
|
||||||
- Categorises commits into Added / Changed / Fixed using conventional-commit prefixes
|
|
||||||
- Prepends a new `## [version]` admonition block to `docs/changelog/index.md`
|
|
||||||
- Commits the result back to `main`
|
|
||||||
|
|
||||||
The version string is the only human decision in the release process. It goes into the changelog only - it does not affect the release tag.
|
|
||||||
|
|
||||||
!!! tip "Previewing the changelog entry"
|
|
||||||
Run with `dry_run: true` first to review the generated entry before it is committed.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release tag format
|
|
||||||
|
|
||||||
Release tags use the format `release-YYYYMMDD-<short-sha>`, for example:
|
|
||||||
|
|
||||||
```
|
|
||||||
release-20260527-abc1234
|
|
||||||
```
|
|
||||||
|
|
||||||
This format is always unique, requires no version decision at release time, and is directly traceable to the commit that was built. The version string (e.g. `v1.2.4`) is a separate, human-assigned label that lives only in the changelog.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Commit message format
|
|
||||||
|
|
||||||
All commits must follow the [Conventional Commits](https://www.conventionalcommits.org) format. This is enforced by the `commitizen` pre-commit hook. Not because we want to limit cooperation with others, but becasue it promotes a cleaner Changelog; we can avoid all the noise by doing this programatically.
|
|
||||||
|
|
||||||
```
|
|
||||||
<type>(<scope>): <description>
|
|
||||||
```
|
|
||||||
|
|
||||||
Accepted types and their changelog bucket:
|
|
||||||
|
|
||||||
| Type | Bucket |
|
|
||||||
|------|--------|
|
|
||||||
| `feat`, `feature`, `add` | Added |
|
|
||||||
| `fix`, `bugfix`, `revert`, `security` | Fixed |
|
|
||||||
| `perf`, `refactor`, `change`, `chore`, `ci`, `docs`, `style`, `test`, `build` | Changed |
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
feat: add dark-mode PDF export
|
|
||||||
fix(scripts): handle locked PDF on Windows
|
|
||||||
docs: update developer workflow guide
|
|
||||||
chore(ci): pin Chrome version to 120
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## GitHub Secrets
|
|
||||||
|
|
||||||
Configure these in **Settings → Secrets and variables → Actions** before the pipeline will fully work. The build step requires no secrets; signing and releasing require all of them.
|
|
||||||
|
|
||||||
### `GPG_PRIVATE_KEY`
|
|
||||||
|
|
||||||
The ASCII-armored private key used to sign PDFs and hash files.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --armor --export-secret-keys C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
|
||||||
```
|
|
||||||
|
|
||||||
Copy the entire output (including `-----BEGIN PGP PRIVATE KEY BLOCK-----` and the closing line) and paste it as the secret value.
|
|
||||||
|
|
||||||
!!! danger "Key security"
|
|
||||||
This is the release signing key. Only repository admins should have access to it. Never commit it to the repository or share it outside of GitHub Secrets.
|
|
||||||
|
|
||||||
### `GPG_PASSPHRASE`
|
|
||||||
|
|
||||||
The passphrase protecting the private key above. Must match exactly - no trailing newline.
|
|
||||||
|
|
||||||
### `ACTIONS_SSH_SIGNING_KEY`
|
|
||||||
|
|
||||||
An SSH private key used by `02-sign.yml` to sign the commit that pushes `export/` back to `main`. Generate a dedicated key for this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ssh-keygen -t ed25519 -C "github-actions signing key" -f actions_signing_key
|
|
||||||
```
|
|
||||||
|
|
||||||
Add the **private key** as the `ACTIONS_SSH_SIGNING_KEY` secret, and the **public key** to the repository's Deploy Keys (Settings → Deploy Keys) with write access.
|
|
||||||
|
|
||||||
### `VT_API_KEY`
|
|
||||||
|
|
||||||
A [VirusTotal](https://www.virustotal.com) API key with file upload permissions. Used by `03-release.yml` to scan both PDFs before publishing. Get one by creating a free account at `virustotal.com` → API key under your profile. The free tier (4 lookups/minute, 500/day) is sufficient.
|
|
||||||
|
|
||||||
### `CHANGELOG_PAT`
|
|
||||||
|
|
||||||
A GitHub Personal Access Token with `contents: write` scope on this repository. Needed because `04-changelog.yml` commits back to `main` - commits made with the default `GITHUB_TOKEN` do not trigger further workflow runs (GitHub loop-prevention). A PAT bypasses this. If absent, falls back to `GITHUB_TOKEN` - the commit still happens, it just won't trigger downstream workflows.
|
|
||||||
|
|
||||||
**Creating one:** GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens → set Contents to Read and write for this repo only.
|
|
||||||
|
|
||||||
### Secrets summary
|
|
||||||
|
|
||||||
| Secret | Required by | What happens if missing |
|
|
||||||
|--------|------------|------------------------|
|
|
||||||
| `GPG_PRIVATE_KEY` | `02-sign.yml` | Signing step fails - no `.asc` files produced |
|
|
||||||
| `GPG_PASSPHRASE` | `02-sign.yml` | GPG import succeeds but signing fails |
|
|
||||||
| `ACTIONS_SSH_SIGNING_KEY` | `02-sign.yml` | Export commit is unsigned (may fail if branch protection requires signed commits) |
|
|
||||||
| `VT_API_KEY` | `03-release.yml` | VirusTotal step fails - release is not published |
|
|
||||||
| `CHANGELOG_PAT` | `04-changelog.yml` | Falls back to `GITHUB_TOKEN` - changelog updates but commit won't trigger downstream workflows |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Verifying a release
|
|
||||||
|
|
||||||
Anyone can verify the authenticity of a release download.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Import the release signing key
|
|
||||||
gpg --import pgp/anonymousplanet-release.asc
|
|
||||||
|
|
||||||
# Verify the PDFs
|
|
||||||
gpg --verify thgtoa.pdf.asc thgtoa.pdf
|
|
||||||
gpg --verify thgtoa-dark.pdf.asc thgtoa-dark.pdf
|
|
||||||
|
|
||||||
# Verify the hash files
|
|
||||||
gpg --verify sha256sums.txt.asc sha256sums.txt
|
|
||||||
gpg --verify b2sums.txt.asc b2sums.txt
|
|
||||||
|
|
||||||
# Check the PDF hashes match
|
|
||||||
sha256sum -c sha256sums.txt
|
|
||||||
b2sum -c b2sums.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
A successful verify looks like:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
gpg: Signature made Sun 31 May 2026 03:23:26 AM EDT
|
|
||||||
gpg: using EDDSA key C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
|
||||||
gpg: Good signature from "Anonymous Planet Release Signing Key" [ultimate]
|
|
||||||
Primary key fingerprint: C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
|
||||||
```
|
|
||||||
|
|
||||||
You can safely ignore Github, Codeberg, etc. warnings like "The email in this signature doesn’t match the committer email."
|
|
||||||
|
|
||||||
```txt
|
|
||||||
λ > git tag -v v1.2.3
|
|
||||||
object cdc54d8b3bc2b286827b23921d8d4062f85295cf
|
|
||||||
type commit
|
|
||||||
tag v1.2.3
|
|
||||||
tagger nopeitsnothing <no@anonymousplanet.net> 1780212206 -0400
|
|
||||||
|
|
||||||
v1.2.3
|
|
||||||
gpg: Signature made Sun 31 May 2026 03:23:26 AM EDT
|
|
||||||
gpg: using EDDSA key C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
|
||||||
gpg: Good signature from "Anonymous Planet Release Signing Key" [ultimate]
|
|
||||||
Primary key fingerprint: C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**`cairosvg` missing during MkDocs build**
|
|
||||||
Install the imaging extras: `pip install "mkdocs-material[imaging]"`. Required by the `social` plugin.
|
|
||||||
|
|
||||||
**`KeyError: 'JPEG'` in convert.py**
|
|
||||||
Pillow needs libjpeg. Reinstall after installing the system lib: `sudo apt install libjpeg-dev && pip install --force-reinstall pillow`.
|
|
||||||
|
|
||||||
**`qpdf: can't find PDF header`**
|
|
||||||
Ensure you are on the current version of `convert.py` - qpdf only accepts PDF inputs, not PNG.
|
|
||||||
|
|
||||||
**GPG signing fails on CI with `No secret key`**
|
|
||||||
The `GPG_PRIVATE_KEY` secret is missing or malformed. Re-export with `gpg --armor --export-secret-keys <fingerprint>` and paste the full block including header and footer lines.
|
|
||||||
|
|
||||||
**GPG signing fails with `Bad passphrase`**
|
|
||||||
The `GPG_PASSPHRASE` secret has a trailing space or newline. Paste it again with no surrounding whitespace.
|
|
||||||
|
|
||||||
**`03-release.yml` fails on VirusTotal**
|
|
||||||
The `VT_API_KEY` is missing, invalid, or over the rate limit (500 requests/day on the free tier). Check the secret and re-run after a few minutes.
|
|
||||||
|
|
||||||
**`02-sign.yml` fails downloading PDF artifact**
|
|
||||||
The `build_run_id` is wrong, or the artifact has expired (90-day retention). Trigger a new build and use the fresh run ID.
|
|
||||||
|
|
||||||
**Changelog already contains version X**
|
|
||||||
`update_changelog.py` will error if `MANUAL_VERSION` is set to a version already in the changelog. Choose the next version string.
|
|
||||||
|
|
||||||
**Footnote warnings from MkDocs (`link '#fnref:N' has no anchor`)**
|
|
||||||
A footnote definition `[^N]:` exists without a matching inline citation. Add the citation or remove the orphaned definition.
|
|
||||||
+349
-10
@@ -1,6 +1,58 @@
|
|||||||
---
|
---
|
||||||
title: Content Contributions
|
title: "Content Contributions"
|
||||||
|
description: We are the maintainers of the Hitchhiker's Guide and the PSA Matrix space.
|
||||||
|
schema:
|
||||||
|
"@context": https://schema.org
|
||||||
|
"@type": Organization
|
||||||
|
"@id": https://anonymousplanet.net/
|
||||||
|
name: Anonymous Planet
|
||||||
|
url: https://anonymousplanet.net/code/
|
||||||
|
logo: ../media/profile.png
|
||||||
|
sameAs:
|
||||||
|
- https://github.com/Anon-Planet
|
||||||
|
- https://opencollective.com/anonymousplanetorg
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
Install these before anything else.
|
||||||
|
|
||||||
|
=== "Linux / macOS"
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Python 3.11+
|
||||||
|
python3 --version
|
||||||
|
|
||||||
|
# poppler (pdftoppm) and qpdf
|
||||||
|
sudo apt install poppler-utils qpdf # Debian/Ubuntu
|
||||||
|
brew install poppler qpdf # macOS
|
||||||
|
|
||||||
|
# GPG
|
||||||
|
sudo apt install gnupg # Debian/Ubuntu
|
||||||
|
brew install gnupg # macOS
|
||||||
|
|
||||||
|
# Python dependencies
|
||||||
|
pip install "mkdocs-material[imaging]" pillow numpy
|
||||||
|
```
|
||||||
|
|
||||||
|
=== "Windows"
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Python 3.11+ from https://python.org
|
||||||
|
|
||||||
|
# poppler: download from https://github.com/oschwartz10612/poppler-windows/releases
|
||||||
|
# Extract and add the bin\ folder to PATH
|
||||||
|
|
||||||
|
# qpdf: download from https://github.com/qpdf/qpdf/releases
|
||||||
|
# Extract and add the bin\ folder to PATH
|
||||||
|
|
||||||
|
# GPG: download Gpg4win from https://gpg4win.org
|
||||||
|
|
||||||
|
# Python dependencies
|
||||||
|
pip install "mkdocs-material[imaging]" pillow numpy
|
||||||
|
```
|
||||||
|
|
||||||
|
You also need **Google Chrome** or **Microsoft Edge** installed for the light-mode PDF build (headless Chromium).
|
||||||
|
|
||||||
You can [submit bugs and feature requests](https://github.com/Anon-Planet/thgtoa/issues/new) with detailed information about your issue or idea:
|
You can [submit bugs and feature requests](https://github.com/Anon-Planet/thgtoa/issues/new) with detailed information about your issue or idea:
|
||||||
|
|
||||||
- If you'd like to propose an addition, please follow the standards outlined here.
|
- If you'd like to propose an addition, please follow the standards outlined here.
|
||||||
@@ -10,8 +62,6 @@ You can [submit bugs and feature requests](https://github.com/Anon-Planet/thgtoa
|
|||||||
|
|
||||||
For those of you who are looking to add content to the guide, include the following:
|
For those of you who are looking to add content to the guide, include the following:
|
||||||
|
|
||||||
##### <u>Pull Requests</u>
|
|
||||||
|
|
||||||
- **Do** create a [topic branch] to work on instead of working directly on `main`. This helps to:
|
- **Do** create a [topic branch] to work on instead of working directly on `main`. This helps to:
|
||||||
+ Protect the process.
|
+ Protect the process.
|
||||||
+ Ensures users are aware of commits on the branch being considered for merge.
|
+ Ensures users are aware of commits on the branch being considered for merge.
|
||||||
@@ -26,7 +76,7 @@ For those of you who are looking to add content to the guide, include the follow
|
|||||||
- **Don't** abandon your pull request. Being responsive helps us land your changes faster.
|
- **Don't** abandon your pull request. Being responsive helps us land your changes faster.
|
||||||
- **Don't** post questions in older closed PRs.
|
- **Don't** post questions in older closed PRs.
|
||||||
- **Do** stick to the guide to find common style issues.
|
- **Do** stick to the guide to find common style issues.
|
||||||
- **Don't** make mass changes (such as replacing "I" with "we") using automated serach/replace functionality.
|
- **Don't** make mass changes (such as replacing "I" with "we") using automated search/replace functionality.
|
||||||
+ Search/replace doesn't understand context, and as such, will inevitably cause inconsistencies and make the guide harder to read.
|
+ Search/replace doesn't understand context, and as such, will inevitably cause inconsistencies and make the guide harder to read.
|
||||||
+ If it's part of a larger PR, it'll also make the reviewer's life harder, as they'll have to go through manually and undo everything by hand.
|
+ If it's part of a larger PR, it'll also make the reviewer's life harder, as they'll have to go through manually and undo everything by hand.
|
||||||
+ _If you're going to make mass changes, take the time to do it properly_. Otherwise we'll just have to undo it anyway.
|
+ _If you're going to make mass changes, take the time to do it properly_. Otherwise we'll just have to undo it anyway.
|
||||||
@@ -39,23 +89,312 @@ When reporting guide issues:
|
|||||||
- **Don't** file duplicate reports; search for your bug before filing a new report.
|
- **Don't** file duplicate reports; search for your bug before filing a new report.
|
||||||
- **Don't** attempt to report issues on a closed PR.
|
- **Don't** attempt to report issues on a closed PR.
|
||||||
|
|
||||||
### Large PRs
|
|
||||||
|
|
||||||
Please split large sets of changes into multiple PRs. For example, a PR that adds Windows 11 support, removes Windows AME references, and fixes typos can be split into 3 PRs. This makes PRs easier to review prior to merging.
|
Please split large sets of changes into multiple PRs. For example, a PR that adds Windows 11 support, removes Windows AME references, and fixes typos can be split into 3 PRs. This makes PRs easier to review prior to merging.
|
||||||
|
|
||||||
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. This PR contains enough changes to split into multiple smaller and individually reviewable PRs.
|
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. This PR contains enough changes to split into multiple smaller and individually reviewable PRs.
|
||||||
|
|
||||||
### Updating PRs
|
|
||||||
|
|
||||||
While a PR is being reviewed, modifications may be made to it by the reviewer prior to merging. If this is the case, a new branch will be created for the PR's review. If you would like to submit a change to a PR that is in the process of being reviewed, _do not update the PR directly_. This will only cause merge conflicts and delay the PR from being merged. Instead, submit your changes to the PR's review branch.
|
While a PR is being reviewed, modifications may be made to it by the reviewer prior to merging. If this is the case, a new branch will be created for the PR's review. If you would like to submit a change to a PR that is in the process of being reviewed, _do not update the PR directly_. This will only cause merge conflicts and delay the PR from being merged. Instead, submit your changes to the PR's review branch.
|
||||||
|
|
||||||
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. Instead of submitting changes to the PR directly, they should have been submitted as changes to the PR's associated review branch.
|
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. Instead of submitting changes to the PR directly, they should have been submitted as changes to the PR's associated review branch.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Thank you** for taking the few moments to read this far! You're already way ahead of the
|
**Thank you** for taking the few moments to read this far! You're already way ahead of the
|
||||||
curve, so keep it up!
|
curve, so keep it up!
|
||||||
|
|
||||||
|
## Repository layout
|
||||||
|
|
||||||
|
```txt
|
||||||
|
.github/
|
||||||
|
workflows/
|
||||||
|
01-build.yml # builds PDFs, uploads artifact
|
||||||
|
02-sign.yml # hashes + GPG signs, uploads signatures artifact
|
||||||
|
03-release.yml # publishes GitHub Release with all assets
|
||||||
|
04-changelog.yml # prepends a new entry to docs/changelog/index.md
|
||||||
|
publish.yml # deploys MkDocs site to GitHub Pages
|
||||||
|
docs/
|
||||||
|
guide/index.md # the guide (single Markdown file)
|
||||||
|
changelog/ # release notes
|
||||||
|
code/ # this page
|
||||||
|
export/ # PDF output (PDFs gitignored; .sha256, .b2sum, .asc tracked)
|
||||||
|
pgp/ # public signing keys
|
||||||
|
scripts/
|
||||||
|
build_guide_pdf.py # MkDocs + Chromium PDF builder
|
||||||
|
convert.py # pixel-based dark mode PDF converter
|
||||||
|
update_changelog.py # auto-generates changelog entries from git log
|
||||||
|
setup_workflow.py # GitHub Secrets setup assistant
|
||||||
|
verify_pdf.py # signature verification helper
|
||||||
|
archived/
|
||||||
|
tag_release.py # ARCHIVED - GPG tag helper (not used in current flow)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building locally
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python scripts/build_guide_pdf.py --both
|
||||||
|
```
|
||||||
|
|
||||||
|
This builds the MkDocs site, renders it to `export/thgtoa.pdf` via headless Chromium, then calls `scripts/convert.py` to produce `export/thgtoa-dark.pdf`.
|
||||||
|
|
||||||
|
| Flag | Effect |
|
||||||
|
|------|--------|
|
||||||
|
| `--both` | Light PDF then dark PDF |
|
||||||
|
| (no flag) | Light PDF only |
|
||||||
|
| `--dark` | Dark PDF only (light PDF must already exist) |
|
||||||
|
|
||||||
|
Build only the dark PDF from an existing light PDF:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python scripts/convert.py export/thgtoa.pdf export/thgtoa-dark.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
| Flag | Default | Description |
|
||||||
|
|------|---------|-------------|
|
||||||
|
| `--dpi` | `200` | Rasterization DPI. 150 = smaller file, 300 = sharper but slow |
|
||||||
|
| `--batch-size` | `50` | Pages per batch. Reduce if you hit OOM |
|
||||||
|
| `--bg` | `1f1f31` | Background colour (hex) |
|
||||||
|
| `--text` | `e0e0e0` | Body text colour (hex) |
|
||||||
|
| `--link` | `5e8bde` | Link / blue element colour (hex) |
|
||||||
|
|
||||||
|
# Preview the MkDocs site
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdocs serve
|
||||||
|
```
|
||||||
|
|
||||||
|
Opens at `http://127.0.0.1:8000`.
|
||||||
|
|
||||||
|
# CI/CD pipeline overview
|
||||||
|
|
||||||
|
The pipeline is fully manual after the initial build - no step automatically triggers the next. This prevents version mismatches between what was built, what was signed, and what gets released. The workflows are numbered to help guide you.
|
||||||
|
|
||||||
|
```txt
|
||||||
|
push to main (or manual trigger)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
01-build.yml
|
||||||
|
Builds thgtoa.pdf + thgtoa-dark.pdf.
|
||||||
|
Uploads artifact: pdfs
|
||||||
|
Note the run ID.
|
||||||
|
│
|
||||||
|
│ # manually trigger 02-sign.yml with the build run ID
|
||||||
|
▼
|
||||||
|
02-sign.yml
|
||||||
|
Downloads pdfs artifact. Hashes (SHA-256 + BLAKE2b) and GPG-signs
|
||||||
|
all files. Commits export/ back to main. Uploads artifacts:
|
||||||
|
signatures, pdfs-signed
|
||||||
|
Note the run ID.
|
||||||
|
│
|
||||||
|
│ # manually trigger 03-release.yml with the sign run ID
|
||||||
|
▼
|
||||||
|
03-release.yml
|
||||||
|
Downloads signatures + pdfs-signed artifacts. Runs VirusTotal.
|
||||||
|
Creates GitHub Release tagged release-YYYYMMDD-<short-sha>.
|
||||||
|
│
|
||||||
|
│ # manually trigger 04-changelog.yml with the version string
|
||||||
|
▼
|
||||||
|
04-changelog.yml
|
||||||
|
Runs update_changelog.py, prepends a new ## [vX.Y.Z] entry,
|
||||||
|
commits back to main.
|
||||||
|
```
|
||||||
|
|
||||||
|
Each stage is independent. If signing fails (e.g. an expired/revoked key, other problems in CI), re-run only `02-sign.yml` pointing at the existing build artifact - no need to rebuild the PDFs.
|
||||||
|
|
||||||
|
!!! warning "Before you push"
|
||||||
|
|
||||||
|
- Make sure the working tree is clean (`git status`)
|
||||||
|
- Run `mkdocs build` locally if you changed `docs/` to catch broken links before CI does
|
||||||
|
- If you added new footnotes, verify they have both a definition `[^N]:` and at least one inline citation `[^N]`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Release process
|
||||||
|
|
||||||
|
## Trigger a build
|
||||||
|
|
||||||
|
Push to `main` - `01-build.yml` runs automatically when `docs/`, `mkdocs.yml`, or `scripts/` change. You can also trigger it manually from **Actions → Build PDFs → Run workflow**.
|
||||||
|
|
||||||
|
Once it completes successfully, **note the run ID** from the URL or the Actions list.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sign the PDFs
|
||||||
|
|
||||||
|
Go to **Actions → Sign PDFs → Run workflow**.
|
||||||
|
|
||||||
|
| Input | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| `build_run_id` | The run ID from step 1 |
|
||||||
|
|
||||||
|
`02-sign.yml` will:
|
||||||
|
|
||||||
|
- Download the PDFs artifact from the build run
|
||||||
|
- Compute SHA-256 and BLAKE2b hashes, writing `thgtoa.pdf.sha256`, `thgtoa.pdf.b2sum`, `sha256sums.txt`, `b2sums.txt`, and the dark equivalents
|
||||||
|
- GPG-sign all PDFs and hash files, writing `.asc` detached signature files
|
||||||
|
- Commit the updated `export/` directory back to `main`
|
||||||
|
- Upload two artifacts: `signatures` and `pdfs-signed`
|
||||||
|
|
||||||
|
Once it completes successfully, **note the run ID**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Publish the release
|
||||||
|
|
||||||
|
Go to **Actions → Release → Run workflow**.
|
||||||
|
|
||||||
|
| Input | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| `sign_run_id` | The run ID from step 2 |
|
||||||
|
| `prerelease` | `false` for a normal release |
|
||||||
|
|
||||||
|
`03-release.yml` will:
|
||||||
|
|
||||||
|
- Download `signatures` and `pdfs-signed` artifacts from the sign run
|
||||||
|
- Upload both PDFs to VirusTotal
|
||||||
|
- Auto-generate a release tag in the format `release-YYYYMMDD-<short-sha>` (e.g. `release-20260527-abc1234`)
|
||||||
|
- Create a GitHub Release with all PDFs, hash files, and signatures attached, and the VirusTotal report URLs in the body
|
||||||
|
|
||||||
|
No version number needs to be chosen at this step - the tag is derived from the date and commit SHA, so it is always unique and always traceable.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Update the changelog
|
||||||
|
|
||||||
|
Go to **Actions → Update Changelog → Run workflow**.
|
||||||
|
|
||||||
|
| Input | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| `version` | The human-readable version string, e.g. `v1.2.4` |
|
||||||
|
| `dry_run` | `true` to preview without committing |
|
||||||
|
|
||||||
|
`04-changelog.yml` runs `scripts/update_changelog.py`, which:
|
||||||
|
|
||||||
|
- Reads git log since the last `## [vX.Y.Z]` heading in the changelog
|
||||||
|
- Categorises commits into Added / Changed / Fixed using conventional-commit prefixes
|
||||||
|
- Prepends a new `## [version]` admonition block to `docs/changelog/index.md`
|
||||||
|
- Commits the result back to `main`
|
||||||
|
|
||||||
|
The version string is the only human decision in the release process. It goes into the changelog only - it does not affect the release tag.
|
||||||
|
|
||||||
|
!!! tip "Previewing the changelog entry"
|
||||||
|
Run with `dry_run: true` first to review the generated entry before it is committed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Release tag format
|
||||||
|
|
||||||
|
Release tags use the format `release-YYYYMMDD-<short-sha>`, for example:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
release-20260527-abc1234
|
||||||
|
```
|
||||||
|
|
||||||
|
This format is always unique, requires no version decision at release time, and is directly traceable to the commit that was built. The version string (e.g. `v1.2.4`) is a separate, human-assigned label that lives only in the changelog.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Commit message format
|
||||||
|
|
||||||
|
All commits must follow the [Conventional Commits](https://www.conventionalcommits.org) format. This is enforced by the `commitizen` pre-commit hook. Not because we want to limit cooperation with others, but becasue it promotes a cleaner Changelog; we can avoid all the noise by doing this programatically.
|
||||||
|
|
||||||
|
```txt
|
||||||
|
<type>(<scope>): <description>
|
||||||
|
```
|
||||||
|
|
||||||
|
Accepted types and their changelog bucket:
|
||||||
|
|
||||||
|
| Type | Bucket |
|
||||||
|
|------|--------|
|
||||||
|
| `feat`, `feature`, `add` | Added |
|
||||||
|
| `fix`, `bugfix`, `revert`, `security` | Fixed |
|
||||||
|
| `perf`, `refactor`, `change`, `chore`, `ci`, `docs`, `style`, `test`, `build` | Changed |
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
feat: add dark-mode PDF export
|
||||||
|
fix(scripts): handle locked PDF on Windows
|
||||||
|
docs: update developer workflow guide
|
||||||
|
chore(ci): pin Chrome version to 120
|
||||||
|
```
|
||||||
|
|
||||||
|
# Verifying a release
|
||||||
|
|
||||||
|
Anyone can verify the authenticity of a release download.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Import the release signing key
|
||||||
|
gpg --import pgp/anonymousplanet-release.asc
|
||||||
|
|
||||||
|
# Verify the PDFs
|
||||||
|
gpg --verify thgtoa.pdf.asc thgtoa.pdf
|
||||||
|
gpg --verify thgtoa-dark.pdf.asc thgtoa-dark.pdf
|
||||||
|
|
||||||
|
# Verify the hash files
|
||||||
|
gpg --verify sha256sums.txt.asc sha256sums.txt
|
||||||
|
gpg --verify b2sums.txt.asc b2sums.txt
|
||||||
|
|
||||||
|
# Check the PDF hashes match
|
||||||
|
sha256sum -c sha256sums.txt
|
||||||
|
b2sum -c b2sums.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
A successful verify looks like:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
gpg: Signature made Sun 31 May 2026 03:23:26 AM EDT
|
||||||
|
gpg: using EDDSA key C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
||||||
|
gpg: Good signature from "Anonymous Planet Release Signing Key" [ultimate]
|
||||||
|
Primary key fingerprint: C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
||||||
|
```
|
||||||
|
|
||||||
|
You can safely ignore Github, Codeberg, etc. warnings like "The email in this signature doesn’t match the committer email."
|
||||||
|
|
||||||
|
```txt
|
||||||
|
λ > git tag -v v1.2.3
|
||||||
|
object cdc54d8b3bc2b286827b23921d8d4062f85295cf
|
||||||
|
type commit
|
||||||
|
tag v1.2.3
|
||||||
|
tagger nopeitsnothing <no@anonymousplanet.net> 1780212206 -0400
|
||||||
|
|
||||||
|
v1.2.3
|
||||||
|
gpg: Signature made Sun 31 May 2026 03:23:26 AM EDT
|
||||||
|
gpg: using EDDSA key C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
||||||
|
gpg: Good signature from "Anonymous Planet Release Signing Key" [ultimate]
|
||||||
|
Primary key fingerprint: C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**`cairosvg` missing during MkDocs build**
|
||||||
|
Install the imaging extras: `pip install "mkdocs-material[imaging]"`. Required by the `social` plugin.
|
||||||
|
|
||||||
|
**`KeyError: 'JPEG'` in convert.py**
|
||||||
|
Pillow needs libjpeg. Reinstall after installing the system lib: `sudo apt install libjpeg-dev && pip install --force-reinstall pillow`.
|
||||||
|
|
||||||
|
**`qpdf: can't find PDF header`**
|
||||||
|
Ensure you are on the current version of `convert.py` - qpdf only accepts PDF inputs, not PNG.
|
||||||
|
|
||||||
|
**GPG signing fails on CI with `No secret key`**
|
||||||
|
The `GPG_PRIVATE_KEY` secret is missing or malformed. Re-export with `gpg --armor --export-secret-keys <fingerprint>` and paste the full block including header and footer lines.
|
||||||
|
|
||||||
|
**GPG signing fails with `Bad passphrase`**
|
||||||
|
The `GPG_PASSPHRASE` secret has a trailing space or newline. Paste it again with no surrounding whitespace.
|
||||||
|
|
||||||
|
**`03-release.yml` fails on VirusTotal**
|
||||||
|
The `VT_API_KEY` is missing, invalid, or over the rate limit (500 requests/day on the free tier). Check the secret and re-run after a few minutes.
|
||||||
|
|
||||||
|
**`02-sign.yml` fails downloading PDF artifact**
|
||||||
|
The `build_run_id` is wrong, or the artifact has expired (90-day retention). Trigger a new build and use the fresh run ID.
|
||||||
|
|
||||||
|
**Changelog already contains version X**
|
||||||
|
`update_changelog.py` will error if `MANUAL_VERSION` is set to a version already in the changelog. Choose the next version string.
|
||||||
|
|
||||||
|
**Footnote warnings from MkDocs (`link '#fnref:N' has no anchor`)**
|
||||||
|
A footnote definition `[^N]:` exists without a matching inline citation. Add the citation or remove the orphaned definition.
|
||||||
|
|
||||||
[discussions]: https://github.com/Anon-Planet/thgtoa/discussions
|
[discussions]: https://github.com/Anon-Planet/thgtoa/discussions
|
||||||
[issues]: https://github.com/Anon-Planet/thgtoa/issues
|
[issues]: https://github.com/Anon-Planet/thgtoa/issues
|
||||||
[help fellow users with open issues]: https://github.com/Anon-Planet/thgtoa/issues
|
[help fellow users with open issues]: https://github.com/Anon-Planet/thgtoa/issues
|
||||||
|
|||||||
+94
-87
@@ -1,87 +1,94 @@
|
|||||||
---
|
---
|
||||||
title: Impressum
|
title: Impressum
|
||||||
---
|
---
|
||||||
# A Constitution for an Anonymous Planet.
|
|
||||||
|
To amend the rules and regulations of the network and of the PSA community, this constitution is hereby set forth. It is applicable to all the projects of the initiative, especially the Hitchhiker's Guide to Online Anonymity. All members/collaborators must abide by these lines when contributing within the context of the initiative.
|
||||||
To amend the rules and regulations of the network and of the PSA community, this constitution is hereby set forth. It is applicable to all the projects of the initiative, especially the Hitchhiker's Guide to Online Anonymity. All members/collaborators must abide by these lines when contributing within the context of the initiative.
|
|
||||||
|
## Requirements
|
||||||
## Requirements
|
|
||||||
|
### Anonymity above everything
|
||||||
> Content is licensed under **[Creative Commons Attribution NonCommercial](https://creativecommons.org/licenses/by-nc/3.0/)** to prevent commercial usage.
|
|
||||||
|
Anonymity is necessary to maintain the balance of power, specifically to help journalists, whistleblowers, lawyers, scientists, and victims of oppression. Anonymity first, even if that means using non-free and/or proprietary means. Security and privacy are second, again, even if using non-free or non-open-source and/or proprietary means. In this sense, the ends may at times justify proprietary means.
|
||||||
### Anonymity above everything.
|
|
||||||
Anonymity is necessary to maintain the balance of power, specifically to help journalists, whistleblowers, lawyers, scientists, and victims of oppression. Anonymity first, even if that means using non-free and/or proprietary means. Security and privacy are second, again, even if using non-free or non-open-source and/or proprietary means. In this sense, the ends may at times justify proprietary means.
|
### Independence
|
||||||
|
|
||||||
### Independence.
|
The Anonymous Planet initiative has no affiliation with the "Anonymous" collective and does not endorse their activities
|
||||||
The Anonymous Planet initiative has no affiliation with the "Anonymous" collective and does not endorse their activities.
|
Any overlap of their activities and our guide are purely coincidental.
|
||||||
Any overlap of their activities and our guide are purely coincidental.
|
|
||||||
|
### Accessibility
|
||||||
### Accessibility.
|
|
||||||
We will strive to always keep available the following methods of reading the Hitchhiker's Guide:
|
We will strive to always keep available the following methods of reading the Hitchhiker's Guide:
|
||||||
|
|
||||||
- online;
|
- online;
|
||||||
- offline (e.g., PDF, ODT);
|
- offline (e.g., PDF, ODT);
|
||||||
- via the Tor network
|
- via the Tor network
|
||||||
|
|
||||||
### Freedom.
|
### Freedom
|
||||||
Maintain free, open-source, and non-commercial nature of all our projects. This does not mean proprietary and/or closed-source tools won't be recommendeded. All scientific knowledge should be free for anyone and we support and encourage Sci-Hub and LibGen. Any attempt to erode the freedom of information and flow of knowledge of our projects, in any manner, is hostile.
|
|
||||||
|
Maintain free, open-source, and non-commercial nature of all our projects. This does not mean proprietary and/or closed-source tools won't be recommendeded. All scientific knowledge should be free for anyone and we support and encourage Sci-Hub and LibGen. Any attempt to erode the freedom of information and flow of knowledge of our projects, in any manner, is hostile.
|
||||||
### Verifiability, falsifiability and reproducibility.
|
|
||||||
We will make every effort to be transparent about any and all bias we have.
|
### Verifiability, falsifiability and reproducibility
|
||||||
Anyone claiming to be unbiased is lying, therefore we will not falsely claim to be.
|
|
||||||
|
We will make every effort to be transparent about any and all bias we have.
|
||||||
All our content shall be verifiable, reproducible and fact-checked:
|
Anyone claiming to be unbiased is lying, therefore we will not falsely claim to be.
|
||||||
|
|
||||||
- academic references (e.g., studies, papers, and peer reviewed publications);
|
All our content shall be verifiable, reproducible and fact-checked:
|
||||||
- reputable media references (e.g., articles, videos, and documentaries);
|
|
||||||
- official documentation (e.g., manuals, field guides, and technical documents);
|
- academic references (e.g., studies, papers, and peer reviewed publications);
|
||||||
- renowned and reputable expert review;
|
- reputable media references (e.g., articles, videos, and documentaries);
|
||||||
- direct testing by our own collaborators for falsifiablity
|
- official documentation (e.g., manuals, field guides, and technical documents);
|
||||||
|
- renowned and reputable expert review;
|
||||||
### Innocence.
|
- direct testing by our own collaborators for falsifiablity
|
||||||
Suspected offenders are innocent until proven guilty, with zero tolerance for abuse of power or position.
|
|
||||||
|
### Innocence
|
||||||
Any accusing/moderating member is:
|
|
||||||
|
Suspected offenders are innocent until proven guilty, with zero tolerance for abuse of power or position.
|
||||||
- Subject to the burden of proving the wrong-doing of the offender.
|
|
||||||
- Required to motivate any sanction.
|
Any accusing/moderating member is:
|
||||||
|
|
||||||
Any offender has the right to:
|
- Subject to the burden of proving the wrong-doing of the offender
|
||||||
|
- Required to motivate any sanction
|
||||||
- Face their accuser (know who is accusing them).
|
|
||||||
- Appeal sanctions to an uninvolved third party.
|
Any offender has the right to:
|
||||||
- Participate in their own incrimination (the burden of proof lies with the accuser).
|
|
||||||
- Due process of the above.
|
- Face their accuser (know who is accusing them)
|
||||||
|
- Appeal sanctions to an uninvolved third party
|
||||||
### Freedom of thought.
|
- Participate in their own incrimination (the burden of proof lies with the accuser)
|
||||||
Open-minded and pragmatic - with no tolerance for gatekeeping.
|
- Due process of the above
|
||||||
|
|
||||||
Critical thinking and fact-checking are strongly encouraged; we welcome criticism including of a harsh nature (excluding ad-hominem and slurs).
|
### Freedom of thought
|
||||||
|
|
||||||
### We do not tolerate intolerance.
|
Open-minded and pragmatic - with no tolerance for gatekeeping.
|
||||||
See the [Paradox of Tolerance](https://en.wikipedia.org/wiki/Paradox_of_tolerance), which includes hate speech.
|
|
||||||
|
Critical thinking and fact-checking are strongly encouraged; we welcome criticism including of a harsh nature (excluding ad-hominem and slurs).
|
||||||
### No analytics.
|
|
||||||
Note that, while we will never use analytics, the (now free) platforms hosting our content might be gathering such analytics outside of our control, such as Github pages. As the initiative progresses, we will strive to avoid these as soon as possible.
|
### We do not tolerate intolerance
|
||||||
|
|
||||||
### No profit.
|
See the [Paradox of Tolerance](https://en.wikipedia.org/wiki/Paradox_of_tolerance), which includes hate speech.
|
||||||
Any excess donations will only be used to support our main projects first and possibly support other intitiatives (like hosting Tor exit nodes). In all cases, we abide by the following principles:
|
|
||||||
|
### No analytics
|
||||||
- Funding transparency (i.e., all donations, spendings, source code, and future goals will be public).
|
|
||||||
- Acceptance of donations from any entity anonymously or acknowledged (opt-in) will not have any influence on our content.
|
Note that, while we will never use analytics, the (now free) platforms hosting our content might be gathering such analytics outside of our control, such as Github pages. As the initiative progresses, we will strive to avoid these as soon as possible.
|
||||||
- No sponsored content.
|
|
||||||
- No affiliate links.
|
### No profit
|
||||||
- No product placements.
|
|
||||||
- No advertising.
|
Any excess donations will only be used to support our main projects first and possibly support other intitiatives (like hosting Tor exit nodes). In all cases, we abide by the following principles:
|
||||||
|
|
||||||
**Disclaimer: it is possible that, coincidentally, a donation could correlate with a recommendation. It will then be clearly stated that while the donation was welcome, the donating entity will not be gaining visibility/coverage/endorsement/recommendations due to such a donation.**
|
- Funding transparency (i.e., all donations, spendings, source code, and future goals will be public)
|
||||||
|
- Acceptance of donations from any entity anonymously or acknowledged (opt-in) will not have any influence on our content
|
||||||
## Core Goals.
|
- No sponsored content
|
||||||
|
- No affiliate links
|
||||||
Help people in need of anonymity to maintain both their physical and digital safety.
|
- No product placements
|
||||||
|
- No advertising
|
||||||
## Non-Goals.
|
|
||||||
|
**Disclaimer: it is possible that, coincidentally, a donation could correlate with a recommendation. It will then be clearly stated that while the donation was welcome, the donating entity will not be gaining visibility/coverage/endorsement/recommendations due to such a donation.**
|
||||||
Help any people who are using this knowledge for bad purposes. Helping people takes precedence and we know our content can be used nefariously. Our initiative believes in having one good person given an anonymous voice, safely, is worth the risk of having several using our content for evil. As we do adhere to a fair "rule of law" system which, having 9 criminals and 1 innocent person free, is much better than having one innocent person in prison among 9 criminals.
|
|
||||||
|
## Core Goals
|
||||||
**Yours faithfully, Anonymous Planet**
|
|
||||||
|
Help people in need of anonymity to maintain both their physical and digital safety.
|
||||||
|
|
||||||
|
## Non-Goals
|
||||||
|
|
||||||
|
Help any people who are using this knowledge for bad purposes. Helping people takes precedence and we know our content can be used nefariously. Our initiative believes in having one good person given an anonymous voice, safely, is worth the risk of having several using our content for evil. As we do adhere to a fair "rule of law" system which, having 9 criminals and 1 innocent person free, is much better than having one innocent person in prison among 9 criminals.
|
||||||
|
|
||||||
|
**Yours faithfully, Anonymous Planet**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: How to Get Involved
|
title: How to Get Involved
|
||||||
---
|
---
|
||||||
|
|
||||||
There are multiple ways you can add to the guide. Donations to support this project are welcome but are entirely optional. Those donations are mainly used to pay for Tor onion hosting (VPS), mail hosting, domain name registration, and to maintain/run Tor exit nodes. **No profit is ever being made**. All donations and spendings are being logged here below for transparency. Some costs for load balancer servers have been omitted for privacy reasons, but are not paid for with existing Anonymous Planet finances.
|
There are multiple ways you can add to the guide. Donations to support this project are welcome but are entirely optional. Those donations are mainly used to pay for Tor onion hosting (VPS), mail hosting, domain name registration, and to maintain/run Tor exit nodes. **No profit is ever being made**. All donations and spendings are being logged here below for transparency. Some costs for load balancer servers have been omitted for privacy reasons, but are not paid for with existing Anonymous Planet finances.
|
||||||
|
|
||||||
<span style="color: red">**Current project donation goals:**</span>
|
<span style="color: red">**Current project donation goals:**</span>
|
||||||
@@ -35,7 +36,7 @@ Legacy address: ```1BBgBSVe6w4DWq2BewUQhDEjsNovhfPswD```
|
|||||||
|
|
||||||
## Content Contributions
|
## Content Contributions
|
||||||
|
|
||||||
You can easily contribute code or information suggestions at our code repositories listed at the bottom of the website and on the [Mirrors](../mirrors/index.md) tab above. We have many options that are easily accessible. Please follow our [contributing guidelines](../code/index.md) and use good PR syntax.
|
You can easily contribute code or information suggestions at our code repositories listed at the bottom of the website and on the [Mirrors](../mirrors/index.md) tab above. We have many options that are easily accessible. Please follow our [contributing guidelines](../code/index.md) and use good PR syntax. Be sure to go to the [developer guide](../code/index.md) first.
|
||||||
|
|
||||||
**Thank you for any contribution. All donations will be mentioned on this page.**
|
**Thank you for any contribution. All donations will be mentioned on this page.**
|
||||||
|
|
||||||
|
|||||||
+35
-67
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: "./"
|
title: "The Hitchhiker's Guide"
|
||||||
description: We are the maintainers of the Hitchhiker's Guide and the PSA Matrix space.
|
description: We are the maintainers of the Hitchhiker's Guide and the PSA Matrix space.
|
||||||
schema:
|
schema:
|
||||||
"@context": https://schema.org
|
"@context": https://schema.org
|
||||||
@@ -12,26 +12,29 @@ schema:
|
|||||||
- https://github.com/Anon-Planet
|
- https://github.com/Anon-Planet
|
||||||
- https://opencollective.com/anonymousplanetorg
|
- https://opencollective.com/anonymousplanetorg
|
||||||
---
|
---
|
||||||
<div class="pdf-title-page" aria-hidden="true">
|
<div style="text-align: center; padding: 4em 2em;">
|
||||||
<p class="pdf-title-page__title">The Hitchhiker's Guide to Online Anonymity</p>
|
|
||||||
<p class="pdf-title-page__subtitle"><em>(Or "How I learned to start worrying and love privacy and anonymity")</em></p>
|
<h4 style="font-family: var(--code-font); font-size: 2rem; color: var(--crt-green); letter-spacing: 0.1em; margin-bottom: 2em;">
|
||||||
<p class="pdf-title-page__meta">v1.2.4, Jun 2026 by Anonymous Planet</p>
|
"We kill people based on metadata."
|
||||||
|
</h3>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="guide-intro-lead" markdown="1">
|
<div class="guide-intro-lead" markdown="1">
|
||||||

|
|
||||||
|
|
||||||
There are several ways you could read this guide:
|
1. **Do you want to understand the current state of online privacy and anonymity, while not necessarily getting too technical about it?**
|
||||||
|
|
||||||
1. **You want to understand the current state of online privacy and anonymity, not necessarily get too technical about it.**
|
|
||||||
- Read the [Introduction](#introduction), [Requirements](#requirements-limitations), understanding some basics beginning with [your network](#your-network), and [the final notes](#a-small-final-editorial-note).
|
- Read the [Introduction](#introduction), [Requirements](#requirements-limitations), understanding some basics beginning with [your network](#your-network), and [the final notes](#a-small-final-editorial-note).
|
||||||
|
|
||||||
2. **You want to do the above but also learn how to remove some online information about you.**
|
2. **Do you want to learn, but also learn how to remove some online information about you?**
|
||||||
- All of the items in no. 1 and [how to clean your identities from search engines and other platforms](#removing-your-identities-from-search-engines-and-other-platforms) to get a good idea of how to clean your data off the web.
|
- All of the items in no. 1 and [how to clean your identities from search engines and other platforms](#removing-your-identities-from-search-engines-and-other-platforms) to get a good idea of how to clean your data off the web.
|
||||||
|
|
||||||
3. **You want to do the above and create online anonymous identities online safely and securely.**
|
3. **Do you want to do the above and create online anonymous identities online safely and securely.**
|
||||||
- Read the whole thing. A specific list of the most vital things to read in the guide will be coming later, but you should read the whole thing.
|
- Read the whole thing. A specific list of the most vital things to read in the guide will be coming later, but you should read the whole thing.
|
||||||
|
|
||||||
|
<div style="font-family: var(--code-font); color: var(--text-primary); font-size: 0.9rem; margin-bottom: 2em;">
|
||||||
Precautions while reading this guide and accessing the various links:
|
Precautions while reading this guide and accessing the various links:
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
- **YouTube Videos** have a **[Invidious]** link next to them for accessing content through an Invidious Instance (in this case yewtu.be hosted in the Netherlands) for increased privacy. It is recommended to use these links when possible. See <https://github.com/iv-org/invidious> <sup>[[Archive.org]](https://web.archive.org/web/https://github.com/iv-org/invidious)</sup> for more information.
|
- **YouTube Videos** have a **[Invidious]** link next to them for accessing content through an Invidious Instance (in this case yewtu.be hosted in the Netherlands) for increased privacy. It is recommended to use these links when possible. See <https://github.com/iv-org/invidious> <sup>[[Archive.org]](https://web.archive.org/web/https://github.com/iv-org/invidious)</sup> for more information.
|
||||||
|
|
||||||
@@ -675,7 +678,7 @@ The question is: Is there someone somewhere that would have both pieces of infor
|
|||||||
|
|
||||||
Have you heard of Edward Snowden[^134]? Now is the time to google him and read his book[^135]. Also read about XKEYSCORE[^136]'[^137], MUSCULAR[^138], SORM[^139], Tempora[^140] , and PRISM[^141].
|
Have you heard of Edward Snowden[^134]? Now is the time to google him and read his book[^135]. Also read about XKEYSCORE[^136]'[^137], MUSCULAR[^138], SORM[^139], Tempora[^140] , and PRISM[^141].
|
||||||
|
|
||||||
See "We kill people based on Metadata"[^142] or this famous tweet from the IDF <https://twitter.com/idf/status/1125066395010699264> <sup>[[Archive.org]](https://web.archive.org/web/https://twitter.com/idf/status/1125066395010699264)</sup> <sup>[[Nitter]](https://nitter.net/idf/status/1125066395010699264)</sup>.
|
See "We kill people based on Metadata"[^142] or this famous tweet from the IDF <https://twitter.com/idf/status/1125066395010699264> <sup>[[Archive.org]](https://web.archive.org/web/20210519061345/https://twitter.com/idf/status/1125066395010699264)</sup> <sup>[[Nitter]](https://nitter.net/idf/status/1125066395010699264)</sup>.
|
||||||
|
|
||||||
See [Appendix N](#appendix-n-warning-about-smartphones-and-smart-devices) for a warning on using smartphones and other smart devices. See [Metadata auditing](#metadata-auditing) for a way to get rid of the metadata - which is probably what brought you to this section anyway.
|
See [Appendix N](#appendix-n-warning-about-smartphones-and-smart-devices) for a warning on using smartphones and other smart devices. See [Metadata auditing](#metadata-auditing) for a way to get rid of the metadata - which is probably what brought you to this section anyway.
|
||||||
|
|
||||||
@@ -1890,51 +1893,11 @@ As with the desktop version, you need to know there are safety levels in Onion B
|
|||||||
|
|
||||||
- You will have three levels to pick from
|
- You will have three levels to pick from
|
||||||
|
|
||||||
- 1. Gold: Ideal if you are suspicious, paranoid, or accessing what you think are dangerous resources.
|
| Security Level | JavaScript | WS/XHR/Geo | A/V | Apps | WebRTC | HTTP↔HTTPS | Ads/Pop-ups |
|
||||||
|
|-------|------------|-------------|------|------|---------|------------|-------------|
|
||||||
+ JavaScript is disabled
|
| **Gold** | Disabled | Disabled | No | Blocked | Blocked | Blocked | Blocked |
|
||||||
|
| Silver | Partially allowed | Disabled | No | Blocked | Blocked | Blocked | Blocked |
|
||||||
+ WebSockets, Geolocation, and XHR are disabled
|
| Bronze | Allowed | Enabled | Allowed | Blocked | Not blocked | Not blocked | Blocked |
|
||||||
|
|
||||||
+ No Video or Audio
|
|
||||||
|
|
||||||
+ Links cannot open Apps
|
|
||||||
|
|
||||||
+ WebRTC is blocked
|
|
||||||
|
|
||||||
+ Mixed HTTP/HTTPS is blocked
|
|
||||||
|
|
||||||
+ Ads and Pop-Ups are blocked
|
|
||||||
|
|
||||||
- 2. Silver:
|
|
||||||
|
|
||||||
+ JavaScript partially allowed
|
|
||||||
|
|
||||||
+ WebSockets, Geolocation, and XHR are disabled
|
|
||||||
|
|
||||||
+ No Video or Audio
|
|
||||||
|
|
||||||
+ Links cannot open Apps
|
|
||||||
|
|
||||||
+ WebRTC is blocked
|
|
||||||
|
|
||||||
+ Mixed HTTP/HTTPS is blocked
|
|
||||||
|
|
||||||
+ Ads and Pop-Ups are blocked
|
|
||||||
|
|
||||||
- 3. Bronze (not recommended):
|
|
||||||
|
|
||||||
+ JavaScript allowed
|
|
||||||
|
|
||||||
+ Audio and Video allowed
|
|
||||||
|
|
||||||
+ Links cannot open Apps
|
|
||||||
|
|
||||||
+ WebRTC is not blocked
|
|
||||||
|
|
||||||
+ Mixed HTTP/HTTPS is not blocked
|
|
||||||
|
|
||||||
+ Ads and Pop-Ups are blocked
|
|
||||||
|
|
||||||
We would recommend the "Silver" level for most cases. The Gold level should only be enabled if you think you are accessing suspicious or dangerous websites or if you are extra paranoid. The Gold mode will also most likely break many websites that rely actively on JavaScript.
|
We would recommend the "Silver" level for most cases. The Gold level should only be enabled if you think you are accessing suspicious or dangerous websites or if you are extra paranoid. The Gold mode will also most likely break many websites that rely actively on JavaScript.
|
||||||
|
|
||||||
@@ -3522,7 +3485,7 @@ For ideal security, follow the [Whonix Hardening Guide](https://www.whonix.org/w
|
|||||||
**Network Time Desync:**
|
**Network Time Desync:**
|
||||||
Desync VM clocks to prevent synchronization attacks (see [[Whonix Documentation - Network Time Synchronization]](https://www.whonix.org/wiki/Network_Time_Synchronization) <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Network_Time_Synchronization)</sup>):
|
Desync VM clocks to prevent synchronization attacks (see [[Whonix Documentation - Network Time Synchronization]](https://www.whonix.org/wiki/Network_Time_Synchronization) <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Network_Time_Synchronization)</sup>):
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
# Example offsets (choose different values for each VM)
|
# Example offsets (choose different values for each VM)
|
||||||
VBoxManage modifyvm "Whonix-Gateway-XFCE" --biossystemtimeoffset -35017
|
VBoxManage modifyvm "Whonix-Gateway-XFCE" --biossystemtimeoffset -35017
|
||||||
VBoxManage modifyvm "Whonix-Workstation-XFCE" --biossystemtimeoffset +27931
|
VBoxManage modifyvm "Whonix-Workstation-XFCE" --biossystemtimeoffset +27931
|
||||||
@@ -4853,30 +4816,35 @@ After you are connected to a Wi-Fi you need to update Qubes OS and Whonix. You m
|
|||||||
|
|
||||||
1. **Backup all data** — Clone the VMs before upgrading using Virtualbox snapshots or your preferred method.
|
1. **Backup all data** — Clone the VMs before upgrading using Virtualbox snapshots or your preferred method.
|
||||||
|
|
||||||
2. **Upgrade your Qubes host first:**
|
1. **Upgrade your Qubes host first:**
|
||||||
- Ensure you're running at least Qubes R4.2 (for Whonix 17 compatibility)
|
- Ensure you're running at least Qubes R4.2 (for Whonix 17 compatibility)
|
||||||
- Update to Qubes R4.3+ if possible (recommended for Whonix 18 support)
|
- Update to Qubes R4.3+ if possible (recommended for Whonix 18 support)
|
||||||
|
|
||||||
3. Run standard updates per OS instructions on your templates:
|
1. **Run standard updates per OS instructions on your templates:**
|
||||||
```bash
|
|
||||||
|
```sh
|
||||||
sudo unattended-upgrade --auto-run
|
sudo unattended-upgrade --auto-run
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Execute the automated upgrade:
|
1. **Execute the automated upgrade:**
|
||||||
```bash
|
|
||||||
|
```sh
|
||||||
sudo release-upgrade
|
sudo release-upgrade
|
||||||
```
|
```
|
||||||
This will handle the upgrade automatically without requiring user input.
|
|
||||||
|
|
||||||
5. **Reboot VMs** and run `systemcheck` to verify system integrity after the upgrade:
|
- This will handle the upgrade automatically without requiring user input.
|
||||||
```bash
|
|
||||||
|
1. **Reboot VMs and run** `systemcheck` **to verify system integrity after the upgrade:**
|
||||||
|
|
||||||
|
```sh
|
||||||
sudo checkvm --all
|
sudo checkvm --all
|
||||||
sudo tor --verify
|
sudo tor --verify
|
||||||
```
|
```
|
||||||
|
|
||||||
6. For Qubes, update APT repo sources post-upgrade (optional later).
|
1. **For Qubes, update APT repo sources post-upgrade (optional later).**
|
||||||
|
|
||||||
**Important Notes:**
|
**Important Notes:**
|
||||||
|
|
||||||
- **Qubes R4.2+ with Whonix 18 is now officially supported**. See <https://www.whonix.org/wiki/Release_Upgrade_17_to_18> <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Release_Upgrade_17_to_18)</sup> for detailed instructions.
|
- **Qubes R4.2+ with Whonix 18 is now officially supported**. See <https://www.whonix.org/wiki/Release_Upgrade_17_to_18> <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Release_Upgrade_17_to_18)</sup> for detailed instructions.
|
||||||
- Always verify system integrity after upgrade using `systemcheck` and Tor verification tools.
|
- Always verify system integrity after upgrade using `systemcheck` and Tor verification tools.
|
||||||
- If you're not using Qubes OS, follow the general [Whonix Upgrade Guide](https://www.whonix.org/wiki/Release_Upgrade_17_to_18) <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Release_Upgrade_17_to_18)</sup>.
|
- If you're not using Qubes OS, follow the general [Whonix Upgrade Guide](https://www.whonix.org/wiki/Release_Upgrade_17_to_18) <sup>[[Archive.org]](https://web.archive.org/web/https://www.whonix.org/wiki/Release_Upgrade_17_to_18)</sup>.
|
||||||
|
|||||||
+37
-38
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: ""
|
title: "Home"
|
||||||
description: "The Hitchhiker's Guide to Online Anonymity"
|
description: "The Hitchhiker's Guide to Online Anonymity"
|
||||||
schema:
|
schema:
|
||||||
"@context": https://schema.org
|
"@context": https://schema.org
|
||||||
@@ -14,61 +14,60 @@ schema:
|
|||||||
- https://mastodon.social/@anonymousplanet
|
- https://mastodon.social/@anonymousplanet
|
||||||
---
|
---
|
||||||
|
|
||||||
<div style="text-align: center; padding: 4em 2em;">
|
<div style="text-align: center; font-size: 3.9rem; font-weight: 700; line-height: 1; margin: 2em 0;">
|
||||||
|
<span>Privacy.</span><br>
|
||||||
<h1 style="font-family: var(--code-font); font-size: 1.5rem; color: var(--accent-green); letter-spacing: 0.1em; margin-bottom: 2em;">
|
<span style="color: var(--crt-green);">Security.</span><br>
|
||||||
// THE HITCHHIKER'S GUIDE TO ONLINE ANONYMITY
|
<span>Anonymity.</span>
|
||||||
</h1>
|
|
||||||
|
|
||||||
<div style="font-size: 3.5rem; font-weight: 700; line-height: 1.2; margin: 2em 0;">
|
|
||||||
<span style="color: var(--text-primary);">Privacy.</span><br>
|
|
||||||
<span style="color: var(--accent-green);">Security.</span><br>
|
|
||||||
<span style="color: var(--text-primary);">Anonymity.</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p style="max-width: 60ch; margin: 2.5em auto; color: var(--text-secondary); font-size: 1.05rem;">
|
<div style="text-align: center; font-size: 3.0rem; font-weight: 400; line-height: 0.9; margin: 2em 0;">
|
||||||
A comprehensive open-source guide for activists, journalists, scientists, lawyers, whistle-blowers — and anyone seeking true digital anonymity. No ads. No affiliates. No BS.
|
<span style="color: var(--crt-green);">No ads.</span><br>
|
||||||
</p>
|
<span style="color: var(--crt-amber);">No affiliate links.</span><br>
|
||||||
|
<span style="color: var(--crt-red);">No bullshit.</span>
|
||||||
|
|
||||||
<div style="margin: 3em auto; display: flex; gap: 1em; justify-content: center;">
|
|
||||||
<a href="guide/index.md" class="btn-download" style="min-width: auto !important;">- Read the Guide</a>
|
|
||||||
<a href="https://github.com/Anon-Planet/thgtoa" class="btn-download" style="min-width: auto !important; border-color: var(--accent-green) !important; color: var(--accent-green) !important; background: transparent !important;">📅 GitHub</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="background: rgba(255, 0, 0, 0.1); border: 1px solid rgba(255, 0, 0, 0.3); border-left: 4px solid #ff4444; padding: 1em; max-width: 70ch; margin: 3em auto; color: #ff6b6b;">
|
<div style="text-align: center; background: rgba(255, 0, 0, 0.1); border: 1px solid rgba(255, 0, 0, 0.3);
|
||||||
<span style="color: #ff6b6b;">⚠</span> <strong style="color: #ff6b6b;">NOTICE:</strong> Anonymous Planet has been the target of fake look-alike domains. Always verify you are on <a href="https://anonymousplanet.net/" style="color: #ff6b6b; text-decoration: underline;">anonymousplanet.net</a>. Bookmark the official site and check the URL before trusting any content.
|
border-left: 4px solid #ff4444; padding: 1em; max-width: 70ch; margin: 3em auto; color: var(--crt-red)">
|
||||||
|
<span style="color: #ff6b6b;">⚠</span> <strong style="color: var(--status-error);">NOTICE:</strong> Always
|
||||||
|
verify you are on <a href="https://anonymousplanet.net/" style="color:
|
||||||
|
var(--status-error);">anonymousplanet.net</a><strong style="color: #ff6b6b;"> ⚠</strong>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="border-top: 2px solid var(--border-color); padding-top: 3em; margin-top: 3em;">
|
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; max-width:
|
||||||
<div style="font-family: var(--code-font); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: 1.5em;">Quick Access</div>
|
1000px; margin: 0 auto;">
|
||||||
|
|
||||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; max-width: 1000px; margin: 0 auto;">
|
|
||||||
|
|
||||||
<!-- The Full Guide Card -->
|
|
||||||
<div class="quick-access-card">
|
<div class="quick-access-card">
|
||||||
<span class="md-icon" style="font-size: 2.5rem; display: block;">📖</span>
|
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">Online</h3>
|
||||||
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">The Full Guide</h3>
|
<p style="margin: 0 0 1em;">Comprehensive coverage of tracking techniques, ID verification, and how to create
|
||||||
<p style="margin: 0 0 1em;">The Hitchhiker's Guide to Online Anonymity — comprehensive coverage of tracking techniques, ID verification, and how to create truly anonymous identities.</p>
|
truly anonymous identities.</p>
|
||||||
<a href="guide/index.md" style="font-family: var(--code-font); font-size: 0.85rem; color: var(--accent-green);">Read online <span style="font-size: 0.7em;">→</span></a>
|
<a href="guide/" style="font-family: var(--code-font); font-size: 0.85rem; color: var(--crt-amber);">Read online
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- PDF/ODT Downloads Card -->
|
|
||||||
<div class="quick-access-card">
|
<div class="quick-access-card">
|
||||||
<span class="md-icon" style="font-size: 2.5rem; display: block;">📄</span>
|
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">PDF</h3>
|
||||||
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">PDF / ODT Downloads</h3>
|
<p style="margin: 0 0 1em;">Download the guide as a PDF (best for readability) or ODT. Verify integrity with the
|
||||||
<p style="margin: 0 0 1em;">Download the guide as a PDF (best for readability) or ODT. Verify integrity with the provided public key before trusting any downloaded file.</p>
|
provided public key before trusting any downloaded file.</p>
|
||||||
<a href="pgp/index.md" class="btn-download" style="min-width: auto !important;">Get the files <span style="font-size: 0.7em;">→</span></a>
|
<a href="export/thgtoa.pdf" class="btn-download" style="min-width: auto !important; color: var(--crt-amber);">Get
|
||||||
|
the files </a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tor Mirror Card -->
|
|
||||||
<div class="quick-access-card">
|
<div class="quick-access-card">
|
||||||
<span class="md-icon" style="font-size: 2.5rem; display: block;">🌐</span>
|
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">Tor</h3>
|
||||||
<h3 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">Tor Mirror</h3>
|
<p style="margin: 0 0 1em;">Access the guide over the Tor network for maximum privacy. The .onion address ensures
|
||||||
<p style="margin: 0 0 1em;">Access the guide over the Tor network for maximum privacy. The .onion address ensures you reach us without exposing your IP or destination.</p>
|
you reach us without exposing your IP or destination.</p>
|
||||||
<a href="mirrors/index.md" style="font-family: var(--code-font); font-size: 0.85rem; color: var(--accent-green);">Open .onion <span style="font-size: 0.7em;">→</span></a>
|
<a href="mirrors/" style="font-family: var(--code-font); font-size: 0.85rem; color: var(--crt-amber);">Open .onion
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div style="text-align: center; font-family: var(--code-font); font-size: 0.8rem; padding: 1.5em 0; border-top:
|
||||||
|
1px solid rgba(255,255,255,0.1); margin-top: 4em; color: var(--crt-green); opacity: 0.9;">
|
||||||
|
<strong>The Hitchhiker's Guide</strong> is
|
||||||
|
licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/" style="color: var(--crt-amber);">CC BY-SA
|
||||||
|
4.0</a>.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,9 +13,6 @@ schema:
|
|||||||
- https://opencollective.com/anonymousplanetorg
|
- https://opencollective.com/anonymousplanetorg
|
||||||
- https://mastodon.social/@anonymousplanet
|
- https://mastodon.social/@anonymousplanet
|
||||||
---
|
---
|
||||||
{ align=right }
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
???+ tip "Where to find the Hitchhiker's Guide"
|
???+ tip "Where to find the Hitchhiker's Guide"
|
||||||
|
|
||||||
|
|||||||
+102
-48
@@ -14,66 +14,120 @@ schema:
|
|||||||
- https://mastodon.social/@anonymousplanet
|
- https://mastodon.social/@anonymousplanet
|
||||||
---
|
---
|
||||||
|
|
||||||
# PGP Keyring for Verification
|
# PGP
|
||||||
|
|
||||||
<div style="text-align: center; margin: 2rem 0;">
|
<div style="font-family: var(--text-primary); color: var(--crt-green); font-size: 1.1rem; margin-bottom: 2em;">
|
||||||
<a href="../pgp/anonymousplanet.asc" class="btn-download">
|
<a href="anonymousplanet.asc" class="btn-download">
|
||||||
Download Our Public Keyring (anonymousplanet.asc)
|
>>Download Our Public Keyring<<
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Import this keyring to verify the authenticity of our releases and signed content.
|
Anonymous Planet uses GnuPG keys as the standard for encryption/signing. Import this keyring to verify the authenticity of our releases, signed content, and secure your emails to us.
|
||||||
|
|
||||||
## Import Instructions
|
## Anonymous Planet Keys
|
||||||
|
|
||||||
### GnuPG (Command Line)
|
Our entire keyring is available at <https://anonymousplanet.net/pgp/anonymousplanet.asc> (click the above button to get it). It is also pasted below.
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --import docs/pgp/anonymousplanet.asc
|
|
||||||
```
|
|
||||||
|
|
||||||
Or directly from GitHub:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --keyserver keys.openpgp.org --recv-keys C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
|
||||||
```
|
|
||||||
|
|
||||||
### Import and Verify
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Import the keyring (includes both MSK and RSK)
|
|
||||||
gpg --import docs/pgp/anonymousplanet.asc
|
|
||||||
|
|
||||||
# List imported keys
|
|
||||||
gpg --list-keys anonymousplanet.net
|
|
||||||
|
|
||||||
# Verify a release signature (replace with your file)
|
|
||||||
gpg --verify file.sig file.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
### GPG-Agent Setup
|
|
||||||
|
|
||||||
Ensure GPG-agent is running:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export GNUPGHOME="${XDG_DATA_HOME:-$HOME/.local/share}/gnupg"
|
|
||||||
chmod 700 "$GNUPGHOME" # Critical for security!
|
|
||||||
```
|
|
||||||
|
|
||||||
## Our Keys
|
|
||||||
|
|
||||||
| Name | Key ID | Purpose |
|
| Name | Key ID | Purpose |
|
||||||
|------|--------|---------|
|
|------|--------|---------|
|
||||||
| **Master Signing Key (MSK)** | `9FA5436D0EE360985157382517ECA05F768DEFDA` | Code releases, signing GPG-agent |
|
| Master Signing Key (MSK) | `9FA5436D0EE360985157382517ECA05F768DEFDA` | Announcements, signing subkeys, etc. |
|
||||||
| **Release Signing Key (RSK)** | `C3023DBEA3FB38C438BA1EECEC60AEDE8B992A2` | Release artifacts only |
|
| Release Signing Key (RSK) | `C3023DBEA3FB38C438BA1EECEC60AEDE8B992A2` | Release signing, occasional commit signing |
|
||||||
|
| Email Encryption/Signing Key (ESK) | `FCBD2CABDEFD1FBA2E9E7591A1A82CD2DD2CF890` | Secure email |
|
||||||
|
|
||||||
**Fingerprint verification:** Always verify key fingerprints against our [GitHub announcements](https://github.com/Anon-Planet/thgtoa/releases) before importing.
|
**Fingerprint verification:** Always verify key fingerprints against our [GitHub announcements](https://github.com/Anon-Planet/thgtoa/releases) before importing.
|
||||||
|
|
||||||
## Security Notes
|
## Key Rotation
|
||||||
|
|
||||||
- Keep `GNUPGHOME` permissions set to `700` (owner only).
|
We may rotate keys periodically. Check our [GitHub Releases](https://github.com/Anon-Planet/thgtoa/releases) and [changelog](../changelog/index.md) for announcements.
|
||||||
- Never share private keys — we don't have any!
|
|
||||||
|
|
||||||
??? warning "Key Rotation"
|
```txt
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
We may rotate keys periodically. Check our [GitHub Releases](https://github.com/Anon-Planet/thgtoa/releases) and [changelog](../changelog/index.md) for announcements.
|
mDMEZc0QYxYJKwYBBAHaRw8BAQdAm8mOR8/0qWrm9Tqzfl9Ks5rjtIbQZLAR/qxH
|
||||||
|
HVGJsxi0LUFub255bW91cyBQbGFuZXQgRW1haWwgRW5jcnlwdGlvbi9TaWduaW5n
|
||||||
|
IEtleYiTBBMWCgA7FiEE/L0sq979H7ounnWRoags0t0s+JAFAmXNEGMCGwMFCwkI
|
||||||
|
BwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQoags0t0s+JDbRAEAuZlBmMGgZ3bh
|
||||||
|
12Js9jjDcu+jhKqL4fJrJG5z9+KFkQwA/An1StA6EhcM7qlzZ5bzm2SZAbP9hQRZ
|
||||||
|
GmfaeU2P5KgHiHgEMBYKACAWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaiCYTgId
|
||||||
|
AAAKCRAX7KBfdo3t9gNUAP9/SyGBYJ7s9YeqLHOJ+veQZjZYHvFGQ7yPn0Fetx0Z
|
||||||
|
LAD/UOQ8rP2QaldCMyVSG8SqfPd7n++SEAXWAl2gAo9mhg6IdQQQFgoAHRYhBJ+l
|
||||||
|
Q20O42CYUVc4JRfsoF92je32BQJmpEUQAAoJEBfsoF92je32tD8A/ir9hE8UjrJE
|
||||||
|
psG+PNfxYAwAagKUGbAMDUxQp3z+t81+AP45hYT4aR89zSQaankHLs3Lh7Cp5ael
|
||||||
|
NBe/BtfR9hCLAYkCMwQQAQgAHRYhBF7WeRgs0hkTAMDm6kyyELegkVLWBQJqIJiM
|
||||||
|
AAoJEEyyELegkVLWjZYP/j1k5vl+r0NDQXmE8hS9IKhaQPggP72iXc5RWeMQHuIv
|
||||||
|
b1laQZm64xerJNdAh0uk1bwfmJnVGfyxBUrlCgAIeVGRSlni2Rig4azaQ1IS0pqF
|
||||||
|
4sC1KzKEhEaNdkh3pJyGtP1cikcSjWeU2oYQou3/7VN3vNyW+n8OAVF+2fsC5d78
|
||||||
|
EvdpZgal+komb+J8Bt552uDbCCVI4TFIPBZmHWoXjaP6L+730YphbV7Aw0L5J6OO
|
||||||
|
ob0nzHn4X0dIvGE7Phdp2e1yNRUOSRLh8B/D5OiE9k7CaeYmJNPv5qOw/R+NgrrA
|
||||||
|
ZFnoOuwHo0D+aL9WT9q4aM/cDCEIbvhQ4l5ZhVGqZuQ9wxNCgPi3ZiZRTfk1PW4v
|
||||||
|
uMw1xGwXBKy7jDO12xWIWWv9MiwIQLw0OxSxKbr76rgucq7e7JrWr64rItu5Wm7F
|
||||||
|
8qxg2cwmDat6tFSRVWlEDy8oNkRMJNjdQJDu3ez9YOfJNnApAz94Of1XU7CUuYjY
|
||||||
|
PV88BaHdUBVtANEzy0iSDCcSj6auzLfv9dBN8cOdUxlVcrPf2jjK6JR/6qe6VWNp
|
||||||
|
wRg9VQW2fe8HJTMUt0o9qQBJUsF68KOHtIdoE4az9AyyBNKl67dKqLB9HoIItLzD
|
||||||
|
MJRcbS2p6plCTNagwPVvgtPRChll9JP3jLPVhRL2BixYVkbHUoJxsEfscTUl6Azt
|
||||||
|
tEtBbm9ueW1vdXMgUGxhbmV0IEVtYWlsIEVuY3J5cHRpb24vU2lnbmluZyBLZXkg
|
||||||
|
PGFub255bW91c3BsYW5ldEBkaXNyb290Lm9yZz6IkwQTFgoAOxYhBPy9LKve/R+6
|
||||||
|
Lp51kaGoLNLdLPiQBQJmhqXqAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA
|
||||||
|
AAoJEKGoLNLdLPiQJ34A/RJT9Hyj7hT/0D1BbDU6s6YzD+/x7Pyq2+9kNSI0L77W
|
||||||
|
AQAAG+CfDrKDXJtBNKZVNFZpld3wUeoIOcAqLl7KpsVGCYh1BBAWCgAdFiEEn6VD
|
||||||
|
bQ7jYJhRVzglF+ygX3aN7fYFAmakRRAACgkQF+ygX3aN7fbypgEAnEg0IbWnpaLj
|
||||||
|
/4wU179vUZZu/Y0DE63GbJuZjj72hKUA/0xyzIgSvXByjoOkEwCn5w1+RPYXKw7Z
|
||||||
|
syERsDCUAAMIiQIzBBABCAAdFiEEXtZ5GCzSGRMAwObqTLIQt6CRUtYFAmogmIwA
|
||||||
|
CgkQTLIQt6CRUtafPQ/+LTWFU84tDZAM0Hp7bWB0dw8nP0JvNQ2WtZf0flh+r1tF
|
||||||
|
cmVnc9szZBh+zzSpY25iK5+Waa6+l1POYSQpkS67VR0Jrv9nL94YrRhqalSRWsjW
|
||||||
|
MQJO+Obu4LIRIqiMZLJlAd9Bg9FshYagbQDVDOI8v9mxqCzIVm3tBx1Jp57ATHgm
|
||||||
|
sMDWn7l1BI0SkLlG49LYxVDQ6QAx4XLCQw+JzdiJs+yExa5ymYmV61evVVbDV5UF
|
||||||
|
pEwW6nsuEDc68UN6npjr8OuGH5y+1ot1vaBderoXFZ8hRG/czzODX5L0zGDX9R2C
|
||||||
|
cGyIrv4AoXTtnbiVZGG6Vn1p3C/RMFZsVOMKvyQKh0rjcD9dqVQ4thI41o92jZ0V
|
||||||
|
K5ALjPiWe1kM4DVYgk/b46q9/8rjzYb4WJCwPQJkRBp36y26oRWM0JaY2Tobzt/H
|
||||||
|
3c8d36hQSXtjKLY27ZY5jL0N4vJaiclAuy03wKonmKlUc1ROUBEgNoZcvx6rLx6e
|
||||||
|
64G7ypOpvlQCcLT/3x+VqX+KTwf4bbigrlonFMpq2lX/uwvHDMfc9/yB5xaUKLpf
|
||||||
|
/zuk/gHKzAfKPItzEyRx5Lvql9Aywaa+/gTCZhwM3D6DzR5Q5waDXcdsptB+GZAi
|
||||||
|
5s+BTxe1a4H6PMobdNOsYDFa77QKQXtWdHkybhV5xzRRMoSdKi+zwvU77BRnwf24
|
||||||
|
OARlzRBjEgorBgEEAZdVAQUBAQdApPitK71WFqWUCycq2bWYYykmU1YFgea3q/V3
|
||||||
|
DfsbbhIDAQgHiHgEGBYKACAWIQT8vSyr3v0fui6edZGhqCzS3Sz4kAUCZc0QYwIb
|
||||||
|
DAAKCRChqCzS3Sz4kLhXAQDhI8tMCEWLu3MhG9pI8BBYH4fS7kuN8ggxqDSbRpKJ
|
||||||
|
dgEAk1CA06WvsH4/n0HmJ83sJSbmFGmEMp2RyvKbdCIW5gKYMwRlzRBIFgkrBgEE
|
||||||
|
AdpHDwEBB0CVyNrq08EGyU77is+cf7/vqDqi95rCeZvE7yRU7SYFDrQjQW5vbnlt
|
||||||
|
b3VzIFBsYW5ldCBNYXN0ZXIgU2lnbmluZyBLZXmIkgQTFgoAOxYhBJ+lQ20O42CY
|
||||||
|
UVc4JRfsoF92je32BQJlzRBIAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheA
|
||||||
|
AAoJEBfsoF92je32NywA+JKlENQl/Kn03FojFNC1Xw5dfNMKnDAs6lV/loSDtOYB
|
||||||
|
ALrDCc1eWeeBt0FQItPiNcGycBBbRtJciNJMu2AUQ9wCiJMEExYKADsWIQSfpUNt
|
||||||
|
DuNgmFFXOCUX7KBfdo3t9gUCZc0QSAIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIe
|
||||||
|
BwIXgAAKCRAX7KBfdo3t9jcsAQAAkqUQ1CX8qfTcWiMU0LVfDl180wqcMCzqVX+W
|
||||||
|
hIO05gEAusMJzV5Z54G3QVAi0+I1wbJwEFtG0lyI0ky7YBRD3AKIdQQQFgoAHRYh
|
||||||
|
BIs6dIkFNrrVDZN26/HLMvZ+MwKhBQJqIJYjAAoJEPHLMvZ+MwKhm7YA/Rdrap0+
|
||||||
|
zzfVtXomRmVkeIaabzxImPuYnvwvgSulFw0oAP9ZkmMjexGKnbuLc1znUNoUjKyR
|
||||||
|
SmpT0ezNJRPcB2x3DokCMwQQAQgAHRYhBF7WeRgs0hkTAMDm6kyyELegkVLWBQJq
|
||||||
|
IJcQAAoJEEyyELegkVLW2YQP/0ry3BvS1pmEl60Ty0smBtEfoYsqQOz4uMBeOYzN
|
||||||
|
IHXtFrw19XAZQjVXYRhUp9NOol6JY8KtqUg0LXQZaRWhVwbA6hMqDbFeT+l+Psu/
|
||||||
|
Ek3dghpwR6xEDSNcm3V1aznNgADcDkGLINbZ7ZW/iDnrws5JMDA0k3+Qt1d596Le
|
||||||
|
kv609g28bxGgt0YENUDFGwXTawO0PALMF3Xg4gwyGU8UELoCoUUWvCYEECqO1vWc
|
||||||
|
BrZNDNulp9ovfsC8A4BkAo6yCv6RPOJVGHaKlfsO81HvBz+pExT0S71DFX5Gm9Qo
|
||||||
|
zkDIEZKLuBji6zuhi88dm17vvDs2SKjVd9OnZhs8THbGW+4WRqU6woYMN1YJAedp
|
||||||
|
+hAaYhJjQfdnFXql7bY5f9uqiBLGy4c5BPoXGYQNi8GABCzUdoiBwsFM/DQ9L8qA
|
||||||
|
fA355CVayg3aODo/NGore3N2Gqxa0GUz21ImMRV/8EIR05zFRVHeR7gu2czDyGih
|
||||||
|
9eHadE2FAAmu2iifZcxKfe3ibSBijub11Wxkfei1gipQ/OvkEfCONVVNRyi6H9Kv
|
||||||
|
6lRP+2n93GQLxlcqxd1qW2tpAt8Pimetb0M20ZY3LkuxhXvsir3sRFRcU4dLSbld
|
||||||
|
7VdwG7AsMmmA98Tp6CKjzI9FS/JcZTDoAVw6PgDSthrK5ev2plALMtWrOg9TggYE
|
||||||
|
6a/nuDgEZc0QSBIKKwYBBAGXVQEFAQEHQP1nHDDQfCi8qGG2QJj/wmMUl8ZGEiAY
|
||||||
|
pVc/+S0ZIJEnAwEIB4h4BBgWCgAgFiEEn6VDbQ7jYJhRVzglF+ygX3aN7fYFAmXN
|
||||||
|
EEgCGwwACgkQF+ygX3aN7fbSGAD9GLAarXceWbfEUWYC4IwVJAKSHDPWSzLGgFnV
|
||||||
|
x/D3238A/RiJHKYzmigvFLL/A28WStW6P47CjNYjJCS490qG/L0GmDMEZc0J8xYJ
|
||||||
|
KwYBBAHaRw8BAQdAWIpOKf8GnTINRH7uW4oeGW4D4vfmK9xeQrnqn/TMIMe0JEFu
|
||||||
|
b255bW91cyBQbGFuZXQgUmVsZWFzZSBTaWduaW5nIEtleYiTBBMWCgA7FiEEwwI9
|
||||||
|
vqP7OMQ4uh7tzsYK7ei5kqIFAmXNCfMCGwMFCwkIBwICIgIGFQoJCAsCBBYCAwEC
|
||||||
|
HgcCF4AACgkQzsYK7ei5kqJJVgD+NKdW7U/uMWl6Ov1Ye9PPy6MbIyyCYd2j5snO
|
||||||
|
60e7msQA/0rxLaeLwzraevcE+WpdPMadxP2M8MxIKrKeAkKAe+IJiHUEEBYKAB0W
|
||||||
|
IQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCZqRFIAAKCRAX7KBfdo3t9o9LAP426yx7
|
||||||
|
1EP9sLKKpkkdAT19HJgsNBeA7SdR/DtMzWEbegD/f2oQYwVz3O1w7xuUqJMHS6/b
|
||||||
|
N1E8B78JSi576up9rA2IdQQQFgoAHRYhBJ+lQ20O42CYUVc4JRfsoF92je32BQJp
|
||||||
|
508bAAoJEBfsoF92je32TM8A/2j51Jc3owAx9STceeamG5GG7inq5jRMyKlMG4Kw
|
||||||
|
1y1lAQD2kKSR9tz/l4Yhvy96WOuQYb+uG0W78T12l2c61F/xBrg4BGXNCfMSCisG
|
||||||
|
AQQBl1UBBQEBB0DOf/mxiZClX/sJqtj7Ob+pCHbsMp9Wd4SHW7/PFaUKHwMBCAeI
|
||||||
|
eAQYFgoAIBYhBMMCPb6j+zjEOLoe7c7GCu3ouZKiBQJlzQnzAhsMAAoJEM7GCu3o
|
||||||
|
uZKie1EBAL5P2th3moOj4IDdXrP6KgdBB0kYweAHix0djG1jV/1+AQDrgVyMPBbT
|
||||||
|
Eztpvc4cyyGAmI42SLM/jKbqO2yWqwVoAg==
|
||||||
|
=ww/S
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
```
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
.md-typeset a::after,
|
||||||
|
a:not(.btn)::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: var(--bg-card);
|
||||||
|
transition: width 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset a:hover::after,
|
||||||
|
a:not(.btn):hover::after {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset code {
|
||||||
|
background-color: rgba(0, 26, 3, 0.226) !important;
|
||||||
|
padding: 0.2em 0.4em;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset .admonition code {
|
||||||
|
background-color: rgba(0, 26, 3, 0.226) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition {
|
||||||
|
border-left: 4px solid var(--crt-amber);
|
||||||
|
background: linear-gradient(180deg, transparent 0%, rgba(0, 255, 0, 0.03) 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-note,
|
||||||
|
.admonition-todo,
|
||||||
|
.admonition-important {
|
||||||
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, rgba(0, 255, 0, 0.05) 100%) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-tip,
|
||||||
|
.admonition-hint,
|
||||||
|
.admonition-important,
|
||||||
|
.admonition-new {
|
||||||
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, rgba(0, 255, 0, 0.05) 100%) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-caution,
|
||||||
|
.admonition-warning,
|
||||||
|
.admonition-failure {
|
||||||
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, rgba(255, 165, 0, 0.08) 100%) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-error,
|
||||||
|
.admonition-failure {
|
||||||
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, rgba(239, 68, 68, 0.08) 100%) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset__table th {
|
||||||
|
background-color: var(--bg-primary) !important;
|
||||||
|
border-bottom: 2px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h1,
|
||||||
|
.md-typeset h2,
|
||||||
|
.md-typeset h3 {
|
||||||
|
animation: fadeIn 0.4s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; transform: translateY(-10px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .md-search__overlay .md-search__scrollwrap .md-search__form {
|
||||||
|
background-color: var(--bg-card) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .md-search__overlay .md-search__scrollwrap .md-search__form input {
|
||||||
|
background-color: var(--bg-card) !important;
|
||||||
|
color: var(--text-primary) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .md-search__overlay .md-search__results {
|
||||||
|
background-color: var(--bg-card) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-footer {
|
||||||
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%);
|
||||||
|
border-top: 2px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* High contrast mode overrides */
|
||||||
|
@media (prefers-contrast: high) {
|
||||||
|
.admonition-note,
|
||||||
|
.admonition-tip,
|
||||||
|
.admonition-important,
|
||||||
|
.md-typeset details.admonition {
|
||||||
|
background: var(--bg-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav[data-md-level="1"] .md-nav__link,
|
||||||
|
nav[data-md-level="2"] .md-nav__link {
|
||||||
|
color: var(--bg-color) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
/* Generate dark mode PDF of the HTML at guide/index.html */
|
|
||||||
|
|
||||||
/*
|
|
||||||
DARK_MODE_PDF.CSS
|
|
||||||
Use this stylesheet when generating a PDF from HTML.
|
|
||||||
*/
|
|
||||||
|
|
||||||
:root {
|
|
||||||
/* Color Palette */
|
|
||||||
--bg-color: #121212; /* Deep dark grey (easier on eyes than pure black) */
|
|
||||||
--text-primary: #e0e0e0; /* Off-white for readability */
|
|
||||||
--text-secondary: #a0a0a0; /* Grey for captions/metadata */
|
|
||||||
--accent-color: #bb86fc; /* Light purple accent (optional) */
|
|
||||||
--border-color: #333333; /* Subtle borders */
|
|
||||||
|
|
||||||
/* Fonts - System fonts ensure best rendering across PDF engines */
|
|
||||||
--font-main: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- RESET & BASE STYLES --- */
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: var(--bg-color);
|
|
||||||
color: var(--text-primary);
|
|
||||||
font-family: var(--font-main);
|
|
||||||
line-height: 1.6;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- TYPOGRAPHY & HEADINGS --- */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
color: var(--text-primary);
|
|
||||||
font-weight: 700;
|
|
||||||
margin-top: 1.5em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
color: var(--text-secondary); /* Slightly dimmer text for body copy */
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--accent-color);
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- CONTAINER & LAYOUT --- */
|
|
||||||
.container {
|
|
||||||
max-width: 800px;
|
|
||||||
margin: 40px auto;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cards / Sections with dark backgrounds */
|
|
||||||
.card {
|
|
||||||
background-color: #1e1e1e;
|
|
||||||
border: 1px solid var(--border-color);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- TABLES (Common in PDFs) --- */
|
|
||||||
table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
margin: 20px 0;
|
|
||||||
color: var(--text-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
th, td {
|
|
||||||
padding: 12px;
|
|
||||||
text-align: left;
|
|
||||||
border-bottom: 1px solid var(--border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
|
||||||
background-color: #2c2c2c;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
tr:last-child td {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- IMAGES --- */
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
height: auto;
|
|
||||||
display: block;
|
|
||||||
margin: 20px 0;
|
|
||||||
/* This ensures high contrast images don't get washed out */
|
|
||||||
filter: brightness(1.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- CRITICAL FOR PDF GENERATORS --- */
|
|
||||||
/* Forces the browser/PDF engine to print background colors and graphics */
|
|
||||||
@media print {
|
|
||||||
@page {
|
|
||||||
size: A4; /* Change to 'Letter' if preferred */
|
|
||||||
margin: 20mm;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: var(--bg-color) !important;
|
|
||||||
color: var(--text-primary) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card, table th {
|
|
||||||
-webkit-print-color-adjust: exact !important; /* Chrome/Safari */
|
|
||||||
print-color-adjust: exact !important; /* Firefox/Standard */
|
|
||||||
background-color: #1e1e1e !important;
|
|
||||||
color: var(--text-primary) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent page breaks in the middle of a sentence or card if possible */
|
|
||||||
.card {
|
|
||||||
break-inside: avoid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hide elements you don't want in PDF (like navigation bars) */
|
|
||||||
nav, footer, button {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
/*
|
|
||||||
*/
|
|
||||||
|
|
||||||
:root {
|
|
||||||
/* Core Colors - Terminal/Hacker Theme */
|
|
||||||
--bg-primary: #0a0f0a; /* Very dark green-black */
|
|
||||||
--bg-secondary: #0d140d; /* Slightly lighter background */
|
|
||||||
--bg-card: #0f180f; /* Card backgrounds */
|
|
||||||
|
|
||||||
--text-primary: #e0e0e0; /* Main text (off-white) */
|
|
||||||
--text-secondary: #8a9a8a; /* Secondary text (dimmed green-gray) */
|
|
||||||
--text-muted: #5c6a5c; /* Muted metadata */
|
|
||||||
|
|
||||||
--accent-green: #0f0; /* Terminal green */
|
|
||||||
--accent-green-dim: rgba(0, 255, 0, 0.1);
|
|
||||||
--accent-green-light: rgba(0, 255, 0, 0.3);
|
|
||||||
|
|
||||||
--border-color: #1a2a1a; /* Subtle borders */
|
|
||||||
--border-highlight: #1f3a1f; /* Highlighted borders */
|
|
||||||
|
|
||||||
--code-font: 'JetBrains Mono', 'Fira Code', 'Liberation Mono', Consolas, monospace;
|
|
||||||
--body-font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Background with subtle grid pattern */
|
|
||||||
body {
|
|
||||||
background-color: var(--bg-primary);
|
|
||||||
color: var(--text-primary);
|
|
||||||
font-family: var(--body-font);
|
|
||||||
line-height: 1.7;
|
|
||||||
background-image:
|
|
||||||
linear-gradient(rgba(0, 255, 0, 0.03) 1px, transparent 1px),
|
|
||||||
linear-gradient(90deg, rgba(0, 255, 0, 0.03) 1px, transparent 1px);
|
|
||||||
background-size: 40px 40px;
|
|
||||||
background-position: center center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Typography */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: var(--code-font);
|
|
||||||
color: var(--text-primary);
|
|
||||||
margin-top: 1.5em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 { font-size: 2.25rem; font-weight: 700; }
|
|
||||||
h2 { font-size: 1.85rem; font-weight: 600; border-bottom: 1px solid var(--border-color); padding-bottom: 0.5em; }
|
|
||||||
h3 { font-size: 1.4rem; font-weight: 500; }
|
|
||||||
|
|
||||||
p {
|
|
||||||
color: var(--text-secondary);
|
|
||||||
margin-bottom: 1.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--accent-green);
|
|
||||||
text-decoration: none;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
text-underline-offset: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Code blocks - terminal style */
|
|
||||||
pre, code, kbd {
|
|
||||||
font-family: var(--code-font) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
background: var(--bg-card);
|
|
||||||
border: 1px solid var(--border-color);
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 1.25em;
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cards with subtle borders */
|
|
||||||
.md-typeset__table, .md-typeset table:not([class]) {
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset__table tr {
|
|
||||||
background-color: var(--bg-secondary);
|
|
||||||
transition: background-color 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PGP download button - matching site theme */
|
|
||||||
.btn-download {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 0.5em;
|
|
||||||
padding: 0.7em 1.25em;
|
|
||||||
border-radius: 4px;
|
|
||||||
text-decoration: none !important;
|
|
||||||
font-weight: 600;
|
|
||||||
color: var(--accent-green);
|
|
||||||
background: transparent;
|
|
||||||
border: 2px solid var(--accent-green);
|
|
||||||
font-family: var(--code-font) !important;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-download:hover {
|
|
||||||
background-color: var(--accent-green-dim);
|
|
||||||
border-color: var(--accent-green);
|
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: 0 2px 6px rgba(0, 255, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-download:active {
|
|
||||||
transform: translateY(0);
|
|
||||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Link styling */
|
|
||||||
.md-typeset a:not(.btn):not([class]) {
|
|
||||||
color: var(--accent-green);
|
|
||||||
text-decoration: underline;
|
|
||||||
text-underline-offset: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset a:not(.btn):not([class]):hover {
|
|
||||||
background-color: var(--accent-green-dim);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Alerts/Admonitions - terminal warnings */
|
|
||||||
.admonition-title,
|
|
||||||
div.admonition > div:first-of-type::before {
|
|
||||||
font-family: var(--code-font) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Card-style containers (like the reference site's quick access section) */
|
|
||||||
.md-typeset details,
|
|
||||||
.md-typeset summary,
|
|
||||||
div[data-md-component="content"] {
|
|
||||||
/* Subtle card effect */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Table styling */
|
|
||||||
.md-typeset__table th,
|
|
||||||
.md-typeset__table td {
|
|
||||||
padding: 0.75em 0.5em;
|
|
||||||
border-bottom: 1px solid var(--border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset__table th {
|
|
||||||
background-color: var(--bg-secondary);
|
|
||||||
font-family: var(--code-font);
|
|
||||||
font-weight: 600;
|
|
||||||
color: var(--text-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer customization */
|
|
||||||
.footer {
|
|
||||||
border-top: 1px solid var(--border-color);
|
|
||||||
padding-top: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Admonition styling */
|
|
||||||
.md-typeset details summary {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset details[open] > summary::after {
|
|
||||||
content: '+';
|
|
||||||
font-family: var(--code-font);
|
|
||||||
position: absolute;
|
|
||||||
right: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Smooth scrolling */
|
|
||||||
html {
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Smooth theme toggle transition */
|
|
||||||
[data-md-color-scheme="slate"] .md-header__title {
|
|
||||||
color: var(--accent-green);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Selection color */
|
|
||||||
::selection {
|
|
||||||
background-color: var(--accent-green-light);
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Focus styles for accessibility */
|
|
||||||
a:focus, button:focus {
|
|
||||||
outline: 2px solid var(--accent-green);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Smooth highlight effect on links */
|
|
||||||
.md-typeset a::selection {
|
|
||||||
background-color: var(--accent-green-light);
|
|
||||||
}
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
* FOOTER CLEANUP & LICENSE DISPLAY FIXES
|
|
||||||
* Removes CRT overlay effects from footer and improves license display
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* === REMOVE CRT OVERLAY EFFECTS FROM FOOTER === */
|
|
||||||
|
|
||||||
/* Exclude footer from CRT scanline effect */
|
|
||||||
.md-footer::before,
|
|
||||||
#md-footer::before {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exclude footer from CRT curvature effect */
|
|
||||||
.md-footer::after {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exclude footer from phosphor decay effect */
|
|
||||||
.md-footer::after::before {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exclude footer from vignette effect */
|
|
||||||
body > .md-footer::before {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === FOOTER LAYOUT FIXES === */
|
|
||||||
|
|
||||||
/* Clean footer container - remove any unwanted spacing or overflow */
|
|
||||||
.md-footer,
|
|
||||||
#md-footer {
|
|
||||||
margin: 0;
|
|
||||||
padding: 1.5em 2em;
|
|
||||||
background: linear-gradient(180deg,
|
|
||||||
var(--bg-secondary) 0%,
|
|
||||||
var(--bg-primary) 100%
|
|
||||||
) !important;
|
|
||||||
border-top: 2px solid var(--accent-green) !important;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer meta container - clean layout for copyright/license */
|
|
||||||
.md-footer-meta {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 1em;
|
|
||||||
max-width: 1200px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding-top: 0.5em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure footer meta has proper background (not transparent) */
|
|
||||||
.md-footer-meta__inner {
|
|
||||||
background: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copyright text - centered and clean */
|
|
||||||
.md-footer-copyright {
|
|
||||||
font-size: 0.85rem;
|
|
||||||
color: var(--text-secondary) !important;
|
|
||||||
line-height: 1.6;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* License link styling */
|
|
||||||
.md-footer-copyright a,
|
|
||||||
.md-footer-copyright a:hover {
|
|
||||||
color: var(--accent-green) !important;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-footer-copyright a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer meta background - ensure it doesn't have CRT effects */
|
|
||||||
.md-footer__meta,
|
|
||||||
.md-typeset .md-footer-meta {
|
|
||||||
background-color: var(--bg-secondary) !important;
|
|
||||||
border-top: 1px solid var(--border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Center content in footer properly */
|
|
||||||
footer > :nth-child(1),
|
|
||||||
.md-footer-meta {
|
|
||||||
text-align: center !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === ENSURE LICENSE TEXT IS READING CORRECTLY === */
|
|
||||||
|
|
||||||
/* Make license badge and text readable without CRT overlay */
|
|
||||||
#md-footer-copyright > a,
|
|
||||||
#md-footer-copyright__indent .md-footer-copyright__license a {
|
|
||||||
position: relative; /* Ensure effects don't bleed into footer */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove any potential z-index stacking issues */
|
|
||||||
.md-footer {
|
|
||||||
z-index: 10 !important; /* Above CRT overlays which are at z-index 9997-9999 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === FOOTER SEPARATOR LINES (if needed) === */
|
|
||||||
|
|
||||||
.footer-separator {
|
|
||||||
border-color: var(--border-color) !important;
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === RESPONSIVE FOOTER FIXES === */
|
|
||||||
|
|
||||||
@media (max-width: 91.42857143em) {
|
|
||||||
.md-footer-meta {
|
|
||||||
gap: 0.75em;
|
|
||||||
padding-top: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-footer-copyright {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 60em) {
|
|
||||||
.md-footer,
|
|
||||||
#md-footer {
|
|
||||||
padding: 1em 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-footer-copyright {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === SOCIAL LINKS INLINE DISPLAY FIX === */
|
|
||||||
|
|
||||||
/* Force all social links to display inline on same line */
|
|
||||||
.social,
|
|
||||||
.social__link {
|
|
||||||
display: inline-flex !important;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
white-space: nowrap;
|
|
||||||
vertical-align: middle;
|
|
||||||
margin-right: 0.75em !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social svg {
|
|
||||||
width: 24px !important;
|
|
||||||
height: 24px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure no line breaks between social icons */
|
|
||||||
#social {
|
|
||||||
display: flex !important;
|
|
||||||
flex-wrap: nowrap !important;
|
|
||||||
gap: 0.75em !important;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrap inline with main content instead of creating separate line */
|
|
||||||
.md-social,
|
|
||||||
[data-md-color-scheme="slate"] .md-typeset a[href*="social"] {
|
|
||||||
display: inline !important;
|
|
||||||
vertical-align: middle;
|
|
||||||
margin-right: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 60em) {
|
|
||||||
.social {
|
|
||||||
margin-right: 0.5em !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social svg {
|
|
||||||
width: 20px !important;
|
|
||||||
height: 20px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === ACCESSIBILITY FIXES FOR FOOTER === */
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion: reduce) {
|
|
||||||
/* Remove animations in footer area */
|
|
||||||
.md-footer h4,
|
|
||||||
.md-footer p {
|
|
||||||
animation: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-contrast: high) {
|
|
||||||
.md-footer {
|
|
||||||
border-top-color: var(--text-primary) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-footer-copyright {
|
|
||||||
color: var(--text-primary) !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
#md-content > :first-child:is(h1, h2, h3),
|
||||||
|
.md-typeset__content > :first-child:is(h1, h2, h3) {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social,
|
||||||
|
.social__link {
|
||||||
|
display: inline-flex !important;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 0.75em !important;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social svg,
|
||||||
|
.social__link svg {
|
||||||
|
width: 24px !important;
|
||||||
|
height: 24px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#social,
|
||||||
|
.social-container,
|
||||||
|
.md-social-list {
|
||||||
|
display: flex !important;
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
gap: 0.75em !important;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social,
|
||||||
|
[data-md-color-scheme="slate"] .md-typeset a[href*="social"],
|
||||||
|
.md-social__link {
|
||||||
|
display: inline-flex !important;
|
||||||
|
flex-direction: row;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social span,
|
||||||
|
.social__link span {
|
||||||
|
max-width: 120px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#social > :is(a[href], .md-icon),
|
||||||
|
.social__link > :is(a[href], .md-icon) {
|
||||||
|
display: inline-flex !important;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social-list,
|
||||||
|
.social-container {
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body .social,
|
||||||
|
body .md-footer__social {
|
||||||
|
display: inline-flex !important;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social::before,
|
||||||
|
.social::after {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 60em) {
|
||||||
|
.social {
|
||||||
|
margin-right: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.social svg,
|
||||||
|
.social__link svg {
|
||||||
|
width: 20px !important;
|
||||||
|
height: 20px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-contrast: high) {
|
||||||
|
#social {
|
||||||
|
gap: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.md-footer h4,
|
||||||
|
.md-footer p {
|
||||||
|
animation: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social {
|
||||||
|
display: inline-flex !important;
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
gap: 0.75em !important;
|
||||||
|
align-items: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social__link {
|
||||||
|
display: inline-flex !important;
|
||||||
|
flex-direction: row !important;
|
||||||
|
align-items: center !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social__link span {
|
||||||
|
font-size: 0.9rem !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
text-overflow: ellipsis !important;
|
||||||
|
vertical-align: middle !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social__link svg {
|
||||||
|
display: inline-flex !important;
|
||||||
|
width: 24px !important;
|
||||||
|
height: 24px !important;
|
||||||
|
flex-shrink: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-footer-meta__inner {
|
||||||
|
display: flex !important;
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
align-items: center !important;
|
||||||
|
justify-content: space-between !important;
|
||||||
|
background-color: var(--bg-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 60em) {
|
||||||
|
.md-social {
|
||||||
|
gap: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social__link svg {
|
||||||
|
width: 20px !important;
|
||||||
|
height: 20px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-social__link span {
|
||||||
|
font-size: 0.8rem !important;
|
||||||
|
max-width: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
:root {
|
||||||
|
--md-primary-fg-color:#4052b500;
|
||||||
|
--bg-color: #020307;
|
||||||
|
--text-primary: #c5c5c5;
|
||||||
|
--text-secondary: #a0a0a0;
|
||||||
|
--accent-color: #039634;
|
||||||
|
--border-color: #0b85005d;
|
||||||
|
--font-main: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-js .md-sidebar {
|
||||||
|
align-self: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: var(--font-main);
|
||||||
|
line-height: 1.6;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: var(--crt-green);
|
||||||
|
font-weight: 700;
|
||||||
|
margin-top: 1.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3, h4, h5, h6 {
|
||||||
|
color: var(--crt-green);
|
||||||
|
font-weight: 600;
|
||||||
|
margin-top: 1.25em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--crt-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 40px auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin: 20px 0;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 12px;
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:last-child td {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
margin: 20px 0;
|
||||||
|
filter: brightness(1.1);
|
||||||
|
animation: none !important;
|
||||||
|
background: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
@page {
|
||||||
|
size: A4;
|
||||||
|
margin: 20mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: var(--bg-color) !important;
|
||||||
|
color: var(--text-primary) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card, table th {
|
||||||
|
-webkit-print-color-adjust: exact !important;
|
||||||
|
print-color-adjust: exact !important;
|
||||||
|
background-color: var(--bg-card) !important;
|
||||||
|
color: var(--text-primary) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav, footer, button {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,344 @@
|
|||||||
|
.command-palette {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.75rem;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-muted);
|
||||||
|
padding: 0.5em;
|
||||||
|
border-top: 1px dashed var(--terminal-line-color);
|
||||||
|
border-bottom: 1px dashed var(--terminal-line-color);
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(0, 255, 0, 0.03) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.command-palette::before,
|
||||||
|
.command-palette::after {
|
||||||
|
content: "|";
|
||||||
|
color: var(--accent-green);
|
||||||
|
animation: cursorBlink 1s step-end infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cursorBlink {
|
||||||
|
0%, 49% { opacity: 1; }
|
||||||
|
50%, 100% { opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.headerlink {
|
||||||
|
color: var(--crt-green);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-session {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
text-align: center;
|
||||||
|
padding: 0.25em 0;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-status {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 60px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
background: var(--bg-card);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
padding: 0.4em 1em;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
z-index: 100;
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 255, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-status .status-dot {
|
||||||
|
display: inline-block;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--status-success);
|
||||||
|
margin-right: 0.5em;
|
||||||
|
box-shadow: 0 0 4px var(--status-success);
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-corner {
|
||||||
|
position: fixed;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-left {
|
||||||
|
top: 20px;
|
||||||
|
left: 20px;
|
||||||
|
border-top: 2px solid var(--accent-green);
|
||||||
|
border-left: 2px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-right {
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
border-top: 2px solid var(--accent-green);
|
||||||
|
border-right: 2px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-left {
|
||||||
|
bottom: 60px;
|
||||||
|
left: 20px;
|
||||||
|
border-bottom: 2px solid var(--accent-green);
|
||||||
|
border-left: 2px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hud-line {
|
||||||
|
position: fixed;
|
||||||
|
left: 5%;
|
||||||
|
top: 30%;
|
||||||
|
right: 5%;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(0, 255, 0, 0.1) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hud-coordinate {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 60px;
|
||||||
|
left: 20px;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.65rem;
|
||||||
|
color: var(--bg-color);
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hud-coordinate::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: -20px;
|
||||||
|
top: 50%;
|
||||||
|
width: 20px;
|
||||||
|
height: 1px;
|
||||||
|
background: var(--terminal-line-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-stream {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 60px;
|
||||||
|
right: 20px;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.6rem;
|
||||||
|
color: var(--status-success);
|
||||||
|
opacity: 0.5;
|
||||||
|
z-index: 9999;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-nav__link.nav-primary,
|
||||||
|
.md-nav__link.nav-secondary {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-terminal {
|
||||||
|
border-left: 4px solid var(--accent-green);
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(0, 255, 0, 0.05) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-terminal .admonition-title {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
background: var(--terminal-green-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.file-tree {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
padding-left: 1em;
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-metadata {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.65rem;
|
||||||
|
text-align: right;
|
||||||
|
color: var(--text-muted);
|
||||||
|
padding-right: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.highlight {
|
||||||
|
box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.highlight .hll {
|
||||||
|
background-color: rgba(0, 255, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes matrixFall {
|
||||||
|
0% { transform: translateY(-100vh); opacity: 0; }
|
||||||
|
10% { opacity: 0.5; }
|
||||||
|
90% { opacity: 0.5; }
|
||||||
|
100% { transform: translateY(100vh); opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.matrix-char {
|
||||||
|
position: fixed;
|
||||||
|
color: var(--accent-green);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 1rem;
|
||||||
|
user-select: none;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9998;
|
||||||
|
animation: matrixFall 15s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-section {
|
||||||
|
margin-top: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-item {
|
||||||
|
background: var(--bg-card);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 1.5em;
|
||||||
|
text-align: center;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-item:hover {
|
||||||
|
border-color: var(--accent-green);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 255, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-item .icon-label {
|
||||||
|
font-size: 2rem;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette-item a {
|
||||||
|
color: var(--text-primary);
|
||||||
|
text-decoration: none;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-viz {
|
||||||
|
position: fixed;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-viz::before,
|
||||||
|
.network-viz::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 1px solid var(--accent-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-viz::before {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
animation: networkSpin 20s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-viz::after {
|
||||||
|
width: 70%;
|
||||||
|
height: 70%;
|
||||||
|
animation: networkSpin 15s linear infinite reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes networkSpin {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-decorator {
|
||||||
|
position: fixed;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.6rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
z-index: 9999;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-notification {
|
||||||
|
position: fixed;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
background: var(--bg-color);
|
||||||
|
border-left: 4px solid var(--accent-green);
|
||||||
|
padding: 1em 1.5em;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 255, 0, 0.15);
|
||||||
|
z-index: 10000;
|
||||||
|
min-width: 300px;
|
||||||
|
animation: slideInRight 0.3s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideInRight {
|
||||||
|
from {
|
||||||
|
transform: translateX(100%);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: translateX(0);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
body::before,
|
||||||
|
body::after,
|
||||||
|
.command-palette::before,
|
||||||
|
.command-palette::after,
|
||||||
|
.matrix-char,
|
||||||
|
.network-viz::before,
|
||||||
|
.network-viz::after {
|
||||||
|
animation: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 76.25em) {
|
||||||
|
.md-main__inner {
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen {
|
||||||
|
[data-md-color-scheme="slate"] {
|
||||||
|
--md-default-bg-color: var(--bg-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,433 @@
|
|||||||
|
:root {
|
||||||
|
--crt-amber: #e7d9a3;
|
||||||
|
--crt-blue: #00d9ff;
|
||||||
|
--crt-green: #00f080;
|
||||||
|
--crt-red: #ff4c4c;
|
||||||
|
--phosphor-dim: #1a3a1a;
|
||||||
|
--status-success: #4ade80;
|
||||||
|
--status-warning: #fbbf24;
|
||||||
|
--status-error: #ef4444;
|
||||||
|
--status-info: #60a5fa;
|
||||||
|
--terminal-green-glow: rgba(0, 255, 0, 0.15);
|
||||||
|
--terminal-line-color: rgba(0, 255, 0, 0.3);
|
||||||
|
--terminal-border-faint: rgba(0, 255, 0, 0.08);
|
||||||
|
--md-default-bg-color: rgba(0, 255, 0, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
body::before {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9999;
|
||||||
|
|
||||||
|
background: linear-gradient(
|
||||||
|
rgba(18, 32, 12, 0) 50%,
|
||||||
|
rgba(0, 20, 0, 0.1) 50%
|
||||||
|
),
|
||||||
|
linear-gradient(
|
||||||
|
90deg,
|
||||||
|
rgba(12, 36, 18, 0) 50%,
|
||||||
|
rgba(0, 16, 0, 0.08) 50%
|
||||||
|
);
|
||||||
|
|
||||||
|
background-size: 100% 4px, 6px 100%;
|
||||||
|
animation: scanline 4ms linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes scanline {
|
||||||
|
0% { background-position: 0 0, 0 0; }
|
||||||
|
100% { background-position: 0 4px, 6px 100%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
body::after {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9998;
|
||||||
|
background: radial-gradient(
|
||||||
|
ellipse at center,
|
||||||
|
transparent 50%,
|
||||||
|
rgba(0, 0, 0, 0.3) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cursorBlink {
|
||||||
|
0%, 49% { opacity: 1; }
|
||||||
|
50%, 100% { opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-header__topic::before,
|
||||||
|
body > *:first-child::before {
|
||||||
|
content: "λ ";
|
||||||
|
animation: cursorBlink 1s step-end infinite;
|
||||||
|
color: var(--crt-amber);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
margin-right: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-window {
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
var(--bg-primary) 0%,
|
||||||
|
var(--bg-card) 100%
|
||||||
|
);
|
||||||
|
border: 2px solid var(--border-color);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1.5em;
|
||||||
|
position: relative;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 255, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-window::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: -2px;
|
||||||
|
right: -2px;
|
||||||
|
height: 3px;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent,
|
||||||
|
var(--accent-green),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
text-shadow: 0 0 1px var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2 {
|
||||||
|
color: var(--crt-amber);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 0.02em;}
|
||||||
|
|
||||||
|
h3, h4, h5, h6 {
|
||||||
|
color: var(--crt-amber);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
p strong,
|
||||||
|
strong {
|
||||||
|
text-shadow: 0 0 1px var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
var(--bg-color) 0%,
|
||||||
|
#0d150d 100%
|
||||||
|
);
|
||||||
|
border-left: 3px solid var(--accent-green);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[role="presentation"] [data-line] {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
user-select: none;
|
||||||
|
min-width: 3em;
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre code .token-keyword {
|
||||||
|
color: var(--crt-blue);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre code .token-string {
|
||||||
|
color: var(--status-success);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre code .token-comment {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kbd,
|
||||||
|
kbd,
|
||||||
|
[data-type="kbd"] {
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-bottom: 2px solid var(--border-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: var(--accent-green);
|
||||||
|
text-shadow: 0 1px 2px rgba(0, 255, 0, 0.1);
|
||||||
|
transition: all 0.1s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbd:hover {
|
||||||
|
border-color: var(--accent-green);
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 255, 0, 0.2);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-indicator {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5em;
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.85em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
padding: 0.25em 0.5em;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-success {
|
||||||
|
color: var(--status-success);
|
||||||
|
background: rgba(74, 222, 128, 0.1);
|
||||||
|
border: 1px solid rgba(74, 222, 128, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-warning {
|
||||||
|
color: var(--status-warning);
|
||||||
|
background: rgba(251, 191, 36, 0.1);
|
||||||
|
border: 1px solid rgba(251, 191, 36, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-error {
|
||||||
|
color: var(--status-error);
|
||||||
|
background: rgba(239, 68, 68, 0.1);
|
||||||
|
border: 1px solid rgba(239, 68, 68, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-info {
|
||||||
|
color: var(--status-info);
|
||||||
|
background: rgba(96, 165, 250, 0.1);
|
||||||
|
border: 1px solid rgba(96, 165, 250, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition {
|
||||||
|
border-left: 4px solid var(--accent-green);
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(0, 255, 0, 0.03) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition-title {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: var(--accent-green);
|
||||||
|
background: var(--terminal-green-glow);
|
||||||
|
padding: 0.4em 0.8em;
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset details.admonition {
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
background: var(--bg-primary);
|
||||||
|
border-radius: 6px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset table:not([class]) {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset__table th {
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
var(--bg-secondary) 0%,
|
||||||
|
var(--bg-card) 100%
|
||||||
|
);
|
||||||
|
border-bottom: 2px solid var(--accent-green);
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset__table tr:hover {
|
||||||
|
background-color: var(--bg-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote, .admonition-blockquote {
|
||||||
|
border-left: 3px solid var(--accent-green);
|
||||||
|
margin: 1.5em 0;
|
||||||
|
padding-left: 1.5em;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
rgba(0, 255, 0, 0.05) 0%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote p:first-of-type::before {
|
||||||
|
content: "› ";
|
||||||
|
color: var(--accent-green);
|
||||||
|
font-family: var(--code-font);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset a::after,
|
||||||
|
a:not(.btn)::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: var(--bg-card);
|
||||||
|
transition: width 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset a:hover::after,
|
||||||
|
a:not(.btn):hover::after {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
font-size: 0.85em;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset .admonition-title,
|
||||||
|
div.admonition > div:first-of-type::before {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset mark,
|
||||||
|
.highlight-mark {
|
||||||
|
background-color: rgba(255, 235, 0, 0.3);
|
||||||
|
color: inherit;
|
||||||
|
padding: 0.1em;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background: var(--bg-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--terminal-green-glow);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: var(--accent-green-dim);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
body::before {
|
||||||
|
background-size: 100% 2px, 3px 100%;
|
||||||
|
animation-duration: 6s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-contrast: high) {
|
||||||
|
:root {
|
||||||
|
--accent-green: #fff;
|
||||||
|
--bg-primary: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
body::before {
|
||||||
|
background-size: 100% 3px, 4px 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes terminalLoad {
|
||||||
|
0% { opacity: 0; transform: translateY(25px); }
|
||||||
|
100% { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h1,
|
||||||
|
.md-content {
|
||||||
|
animation: terminalLoad 200ms ease-out forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
body::after {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9997;
|
||||||
|
background: radial-gradient(
|
||||||
|
circle at center,
|
||||||
|
rgba(0, 255, 0, 0.03) 0%,
|
||||||
|
transparent 60%
|
||||||
|
);
|
||||||
|
animation: phosphorDecay 8s ease-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes phosphorDecay {
|
||||||
|
0%, 100% { opacity: 0.4; }
|
||||||
|
50% { opacity: 0.2; }
|
||||||
|
}
|
||||||
|
|
||||||
|
body::after::before {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 9998;
|
||||||
|
background: radial-gradient(
|
||||||
|
circle at center,
|
||||||
|
transparent 40%,
|
||||||
|
rgba(0, 0, 0, 0.6) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-banner {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.75em;
|
||||||
|
letter-spacing: 0.2em;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-muted);
|
||||||
|
padding: 1em 0;
|
||||||
|
border-top: 1px dashed var(--terminal-line-color);
|
||||||
|
border-bottom: 1px dashed var(--terminal-line-color);
|
||||||
|
margin: 3em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.holographic-grid {
|
||||||
|
background-image:
|
||||||
|
linear-gradient(var(--terminal-border-faint) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, var(--terminal-border-faint) 1px, transparent 1px);
|
||||||
|
background-size: 20px 20px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.holographic-grid::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
background:
|
||||||
|
linear-gradient(
|
||||||
|
rgba(0, 255, 0, 0.03) 10px,
|
||||||
|
transparent 10px
|
||||||
|
),
|
||||||
|
linear-gradient(
|
||||||
|
90deg,
|
||||||
|
rgba(0, 255, 0, 0.03) 10px,
|
||||||
|
transparent 10px
|
||||||
|
);
|
||||||
|
background-size: 10px 10px;
|
||||||
|
}
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/* ================================
|
|
||||||
NAVIGATION BRANDING - Terminal Prompt Style
|
|
||||||
Matches anonymousplanet.net header
|
|
||||||
================================ */
|
|
||||||
|
|
||||||
/* Top-left terminal prompt branding */
|
|
||||||
.md-header__topic {
|
|
||||||
font-family: 'JetBrains Mono', monospace;
|
|
||||||
font-size: 0.75rem;
|
|
||||||
letter-spacing: -0.02em;
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Terminal prompt styling */
|
|
||||||
.md-typeset h1::before,
|
|
||||||
div[data-md-component="content"] > h1::before {
|
|
||||||
content: '>_ ';
|
|
||||||
color: var(--accent-green);
|
|
||||||
font-family: 'JetBrains Mono', monospace;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clean navigation bar */
|
|
||||||
.md-header__button.md-icon {
|
|
||||||
padding: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Top navigation bar - terminal style */
|
|
||||||
nav[data-md-level="1"] .md-nav__link,
|
|
||||||
nav[data-md-level="2"] .md-nav__link {
|
|
||||||
font-family: var(--code-font);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.05em;
|
|
||||||
color: var(--text-secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
nav[data-md-level="1"] .md-nav__link:hover,
|
|
||||||
nav[data-md-level="2"] .md-nav__link--active {
|
|
||||||
color: var(--accent-green);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clean up page margins */
|
|
||||||
.md-typeset {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Subtle card-like containers for content sections */
|
|
||||||
.md-typeset > :not(table) > :not(hr) > :first-of-type {
|
|
||||||
margin-top: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Quick Access Section - mimicking reference site */
|
|
||||||
.quick-access,
|
|
||||||
div[data-md-include]:has(h3:contains("Quick Access")) {
|
|
||||||
border-top: 1px solid var(--border-color);
|
|
||||||
margin-top: 3em;
|
|
||||||
padding-top: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Card grid for download sections */
|
|
||||||
.md-typeset .md-typeset__grid,
|
|
||||||
div[data-md-type="grid"] {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
||||||
gap: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Card-style download boxes */
|
|
||||||
.quick-access-card,
|
|
||||||
.md-typeset__section:not(:last-child) {
|
|
||||||
background: var(--bg-secondary);
|
|
||||||
border: 1px solid var(--border-color);
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 1.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.quick-access-card h3 {
|
|
||||||
font-family: var(--code-font);
|
|
||||||
margin-top: 0.5em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
color: var(--text-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.quick-access-card > p {
|
|
||||||
color: var(--text-secondary);
|
|
||||||
font-size: 0.9rem;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Icons for download cards */
|
|
||||||
.quick-access-card .md-icon,
|
|
||||||
.quick-access-card svg {
|
|
||||||
width: 2.5em;
|
|
||||||
height: 2.5em;
|
|
||||||
color: var(--accent-green);
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Link styling for download cards */
|
|
||||||
.quick-access-card a:hover {
|
|
||||||
text-decoration-color: var(--accent-green);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer branding */
|
|
||||||
.md-typeset .md-footer-meta {
|
|
||||||
background-color: var(--bg-secondary);
|
|
||||||
border-top: 1px solid var(--border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Terminal-style code blocks with line numbers */
|
|
||||||
pre[role="presentation"] [data-line] {
|
|
||||||
padding-left: calc(var(--per-page) * 0.75em + 1.25em);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Smooth fade-in for page transitions */
|
|
||||||
.md-typeset h1,
|
|
||||||
.md-typeset h2,
|
|
||||||
.md-typeset h3 {
|
|
||||||
animation: fadeIn 0.4s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fadeIn {
|
|
||||||
from { opacity: 0; transform: translateY(-10px); }
|
|
||||||
to { opacity: 1; transform: translateY(0); }
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
.md-sidebar {
|
||||||
|
background-color: var(--bg-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar__scrollwrap {
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-header__topic {
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h1::before,
|
||||||
|
div[data-md-component="content"] > h1::before {
|
||||||
|
content: 'λ ';
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h2::before,
|
||||||
|
div[data-md-component="content"] > h2::before {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h3::before,
|
||||||
|
div[data-md-component="content"] > h3::before {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-family: 'JetBrains Mono';
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-header__button.md-icon {
|
||||||
|
padding: 0.5em;
|
||||||
|
animation: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav[data-md-level="1"] .md-nav__link,
|
||||||
|
nav[data-md-level="2"] .md-nav__link {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: 0.01em;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar.nav-primary > nav > .md-nav__list > li > .md-nav__link {
|
||||||
|
font-weight: 600;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar.nav-primary > nav > .md-nav__list > li.is-parent > .md-nav__nested > li > a {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar.nav-primary > nav > .md-nav__list > li.is-parent > .md-nav__nested > li > a:hover,
|
||||||
|
.md-sidebar.nav-primary > nav > .md-nav__list > li.is-parent > .md-nav__nested > li > a.md-nav--opened {
|
||||||
|
color: var(--crt-red);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar__section.md-nav__inner > .md-nav__title {
|
||||||
|
font-family: var(--text-primary);
|
||||||
|
font-size: 0.75rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
color: var(--text-muted);
|
||||||
|
padding: 0.75em 1.5em 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar__inner > .md-nav__title {
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--crt-red);
|
||||||
|
padding: 1em 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-sidebar__inner > .md-nav__title::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access,
|
||||||
|
div[data-md-include]:has(h3:contains("Quick Access")) {
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
margin-top: 3em;
|
||||||
|
padding-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset .md-typeset__grid,
|
||||||
|
div[data-md-type="grid"] {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||||
|
gap: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access-card,
|
||||||
|
.md-typeset__section:not(:last-child) {
|
||||||
|
background: var(--bg-color);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access-card h3 {
|
||||||
|
font-family: var(--code-font);
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
color: var(--crt-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access-card > p {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access-card .md-icon,
|
||||||
|
.quick-access-card svg {
|
||||||
|
width: 2.5em;
|
||||||
|
height: 2.5em;
|
||||||
|
color: var(--crt-green);
|
||||||
|
margin-bottom: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-access-card a:hover {
|
||||||
|
text-decoration-color: var(--crt-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-footer-meta {
|
||||||
|
background-color: var(--bg-primary) !important;
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[role="presentation"] [data-line] {
|
||||||
|
padding-left: calc(var(--per-page) * 0.75em + 1.25em);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset a {
|
||||||
|
color:var(--crt-green);
|
||||||
|
word-break:break-word
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset h1,
|
||||||
|
.md-typeset h2,
|
||||||
|
.md-typeset h3 {
|
||||||
|
animation: fadeIn 0.4s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; transform: translateY(-10px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: Notice
|
|
||||||
---
|
|
||||||
# Anonymous Planet has left Twitter
|
|
||||||
|
|
||||||
Anonymous Planet has moved to Mastodon. This was largely due to Twitter being owned by Elon Musk, the $8 fees, and recent security issues that have come to light. We do not regret this decision, as it has only gotten worse for Twitter users since.
|
|
||||||
|
|
||||||
- [Twitter $8 Fee Exploited by Cybercriminals](https://heimdalsecurity.com/blog/twitter-8-fee-exploited-by-cybercriminals/)
|
|
||||||
|
|
||||||
Our mastodon can be found at [@anonymousplanet@mastodon.social](https://mastodon.social/@anonymousplanet)
|
|
||||||
+17
-23
@@ -1,12 +1,18 @@
|
|||||||
---
|
---
|
||||||
title: "Verify"
|
title: "Verifying authenticity"
|
||||||
description: How to verify the authenticity of our files and check virus scans
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Verify Files
|
<div style="font-family: var(--code-font); color: var(--crt-red); font-size: 0.9rem; margin-bottom: 2em;">
|
||||||
|
Never blindly trust the information you see online.
|
||||||
|
</div>
|
||||||
|
|
||||||
<div style="font-family: var(--code-font); color: var(--accent-green); font-size: 0.9rem; margin-bottom: 2em;">
|
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; max-width: 1000px; margin: 0 auto;">
|
||||||
> <span style="color: var(--text-primary);">>_</span> Integrity first. Always verify before trusting.
|
|
||||||
|
<div class="quick-access-card">
|
||||||
|
<h4 style="font-family: var(--code-font); font-size: 1.1rem; margin: 0;">Get our keyring</h4>
|
||||||
|
<p style="margin: 0 0 1em;">The Anonymous Planet MSK and other keys in our keyring can be found here.</p>
|
||||||
|
<a href="../../pgp/" style="font-family: var(--code-font); font-size: 0.85rem; color: var(--crt-amber);">Access our public keyring <span style="font-size: 0.7em;"></span></a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Files Provided
|
## Files Provided
|
||||||
@@ -23,7 +29,7 @@ For each release, you'll receive:
|
|||||||
|
|
||||||
### Using Python Script (Recommended)
|
### Using Python Script (Recommended)
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
# Verify everything (hashes, signatures, and optionally VirusTotal)
|
# Verify everything (hashes, signatures, and optionally VirusTotal)
|
||||||
python scripts/verify_pdf.py --all
|
python scripts/verify_pdf.py --all
|
||||||
|
|
||||||
@@ -43,7 +49,7 @@ python scripts/verify_pdf.py --vt
|
|||||||
|
|
||||||
**Linux/macOS:**
|
**Linux/macOS:**
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
cd /path/to/repo
|
cd /path/to/repo
|
||||||
sha256sum -c sha256sum-light.txt
|
sha256sum -c sha256sum-light.txt
|
||||||
```
|
```
|
||||||
@@ -59,18 +65,18 @@ Get-FileHash -Algorithm SHA256 export\thgtoa.pdf | Select-Object Hash
|
|||||||
|
|
||||||
First, import the public key:
|
First, import the public key:
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
gpg --import pgp/anonymousplanet.asc
|
gpg --import pgp/anonymousplanet.asc
|
||||||
```
|
```
|
||||||
|
|
||||||
Then verify the signature:
|
Then verify the signature:
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
gpg --verify export/thgtoa.pdf.sig export/thgtoa.pdf
|
gpg --verify export/thgtoa.pdf.sig export/thgtoa.pdf
|
||||||
gpg --verify export/thgtoa-dark.pdf.sig export/thgtoa-dark.pdf
|
gpg --verify export/thgtoa-dark.pdf.sig export/thgtoa-dark.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
**Expected output for successful verification:**
|
**Example output for successful verification:**
|
||||||
|
|
||||||
```text
|
```text
|
||||||
gpg: Signature made Mon 20 Apr 2026 01:46:40 AM EDT
|
gpg: Signature made Mon 20 Apr 2026 01:46:40 AM EDT
|
||||||
@@ -91,7 +97,7 @@ Visit the VirusTotal report links (automatically generated in release notes):
|
|||||||
|
|
||||||
Or use the Python script with API key:
|
Or use the Python script with API key:
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
export VT_API_KEY=your_vt_api_key
|
export VT_API_KEY=your_vt_api_key
|
||||||
python scripts/verify_pdf.py --vt
|
python scripts/verify_pdf.py --vt
|
||||||
```
|
```
|
||||||
@@ -133,15 +139,3 @@ The GitHub Actions workflows automatically:
|
|||||||
- **Linux/RHEL/CentOS:** `sudo yum install gnupg2` or `sudo dnf install gnupg2`
|
- **Linux/RHEL/CentOS:** `sudo yum install gnupg2` or `sudo dnf install gnupg2`
|
||||||
- **macOS:** `brew install gnupg` or use Homebrew Casks: `brew install --cask gnupg`
|
- **macOS:** `brew install gnupg` or use Homebrew Casks: `brew install --cask gnupg`
|
||||||
- **Windows:** Use [Gpg4win](https://www.gpg4win.org/)
|
- **Windows:** Use [Gpg4win](https://www.gpg4win.org/)
|
||||||
|
|
||||||
## Key Information
|
|
||||||
|
|
||||||
| Item | Value |
|
|
||||||
|------|-------|
|
|
||||||
| **Signing Key** | Anonymous Planet Master Signing Key ("MSK") |
|
|
||||||
| **Key ID** | See [`pgp/anonymousplanet.asc`](../pgp/anonymousplanet.asc) for details |
|
|
||||||
| **Fingerprint** | `9FA5436D0EE360985157382517ECA05F768DEFDA` |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
_For questions or issues with verification, please open an issue on [GitHub](https://github.com/Anon-Planet/thgtoa/issues)._
|
|
||||||
|
|||||||
+29
-30
@@ -1,8 +1,8 @@
|
|||||||
site_name: The Hitchhiker's Guide
|
site_name: The Hitchhiker's Guide
|
||||||
site_author: Anonymous Planet
|
site_author: Anonymous Planet
|
||||||
site_description: "The comprehensive guide for online #anonymity and #opsec."
|
site_description: "The comprehensive guide for online #anonymity and #opsec."
|
||||||
site_dir: '/site/'
|
site_dir: "site"
|
||||||
docs_dir: 'docs/'
|
docs_dir: "docs"
|
||||||
site_url: "https://anonymousplanet.net/"
|
site_url: "https://anonymousplanet.net/"
|
||||||
repo_url: "https://github.com/Anon-Planet/thgtoa"
|
repo_url: "https://github.com/Anon-Planet/thgtoa"
|
||||||
repo_name: ""
|
repo_name: ""
|
||||||
@@ -22,6 +22,7 @@ theme:
|
|||||||
- navigation.instant.prefetch
|
- navigation.instant.prefetch
|
||||||
- navigation.tabs
|
- navigation.tabs
|
||||||
- navigation.sections
|
- navigation.sections
|
||||||
|
- navigation.path
|
||||||
- toc.integrate
|
- toc.integrate
|
||||||
- navigation.top
|
- navigation.top
|
||||||
- search.suggest
|
- search.suggest
|
||||||
@@ -32,28 +33,29 @@ theme:
|
|||||||
language: en
|
language: en
|
||||||
palette:
|
palette:
|
||||||
- scheme: slate
|
- scheme: slate
|
||||||
primary: black
|
primary: hacker
|
||||||
accent: green
|
accent: green
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- social: {}
|
- social: {}
|
||||||
# - include-markdown: {}
|
|
||||||
# - with-pdf:
|
|
||||||
- search:
|
- search:
|
||||||
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
|
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'
|
||||||
# - macros: {}
|
# - meta: {}
|
||||||
# - meta: {}
|
|
||||||
# - git-latest-tag: {}
|
|
||||||
# - git-authors: {}
|
|
||||||
# - git-latest-release: {}
|
|
||||||
|
|
||||||
|
# Soon this will all be minified (It's a personal WIP)
|
||||||
extra_css:
|
extra_css:
|
||||||
- stylesheets/hacker-theme.css
|
- stylesheets/hacker.css
|
||||||
# - stylesheets/search-extra.css
|
- stylesheets/hacker-extra.css
|
||||||
- stylesheets/accessibility-fixes.css
|
- stylesheets/going-dark.css
|
||||||
- stylesheets/nav-extra.css
|
- stylesheets/navigation.css
|
||||||
- stylesheets/dark-extra.css
|
- stylesheets/footer.css
|
||||||
- stylesheets/footer-fix.css
|
- stylesheets/accessibility.css
|
||||||
|
|
||||||
|
# extra_css:
|
||||||
|
# - stylesheets/hacker-core.css
|
||||||
|
# - stylesheets/components.css
|
||||||
|
# - stylesheets/accessibility.css
|
||||||
|
# - stylesheets/print-and-utilities.css
|
||||||
|
|
||||||
extra:
|
extra:
|
||||||
social:
|
social:
|
||||||
@@ -118,20 +120,17 @@ markdown_extensions:
|
|||||||
- tables: {}
|
- tables: {}
|
||||||
- footnotes: {}
|
- footnotes: {}
|
||||||
- toc:
|
- toc:
|
||||||
permalink: true
|
permalink: "λ"
|
||||||
toc_depth: 3
|
toc_depth: 3
|
||||||
|
|
||||||
nav:
|
nav:
|
||||||
- Home: index.md
|
- "Home": index.md
|
||||||
- About: about/index.md
|
- "Verify": verify/index.md
|
||||||
- Verify: verify/index.md
|
- "Guide": guide/index.md
|
||||||
- Guide: guide/index.md
|
- "Code": code/index.md
|
||||||
- Code: code/index.md
|
- "Donations": contribute/index.md
|
||||||
- Donations: contribute/index.md
|
- "A Constitution": constitution/index.md
|
||||||
- Constitution: constitution/index.md
|
- "Mirrors": mirrors/index.md
|
||||||
- Mirrors: mirrors/index.md
|
- "Changelog": changelog/index.md
|
||||||
- Twitter: twitter/index.md
|
- "About": about/index.md
|
||||||
- Releases: changelog/index.md
|
- "PGP": pgp/index.md
|
||||||
|
|
||||||
# copyright: |
|
|
||||||
# <a href="https://anonymousplanet.net/">The Hitchhiker's Guide</a> ©2026 by <a href="https://psa.anonymousplanet.net/">Anonymous Planet</a> is licensed under <a href="https://creativecommons.org/licenses/by-nc/4.0/">CC BY-NC 4.0</a><img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/nc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"></a>
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
# Import
|
# Import
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
$ gpg --import pgp/core-devs/*
|
$ gpg --import pgp/core-devs/*
|
||||||
```
|
```
|
||||||
|
|
||||||
# Verify
|
# Verify
|
||||||
|
|
||||||
```bash
|
```sh
|
||||||
$ gpg --verify pgp/core-devs/than/than-crypto.txt
|
$ gpg --verify pgp/core-devs/than/than-crypto.txt
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Remove memory/ directory from git history completely
|
||||||
|
# This rewrites ALL commits to exclude memory/* files
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd /mnt/e/git/thgtoa
|
||||||
|
|
||||||
|
echo "=== Removing memory/ from git history ==="
|
||||||
|
echo "This will rewrite ALL commit history. Back up first if needed!"
|
||||||
|
|
||||||
|
# Backup current HEAD state
|
||||||
|
export GIT_REPLACE_PREFIX="refs/original/"
|
||||||
|
git filter-branch --prune-empty --index-filter \
|
||||||
|
'git rm -rf --cached --ignore-unmatch memory/' \
|
||||||
|
"$(git rev-parse HEAD)"
|
||||||
|
|
||||||
|
echo "=== History rewritten ==="
|
||||||
|
echo "=== Cleaning up refs ==="
|
||||||
|
# Remove the backup ref
|
||||||
|
rm -f .git/refs/original/refs/stash 2>/dev/null || true
|
||||||
|
rmdir .git/refs/original 2>/dev/null || true
|
||||||
|
|
||||||
|
# Clean packed-refs
|
||||||
|
grep -v refs/original .git/packed-refs > .git/packed-refs.tmp || true
|
||||||
|
mv .git/packed-refs.tmp .git/packed-refs 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "=== Verifying memory/ is removed ==="
|
||||||
|
git log --oneline | tail -5
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Done! Memory/ directory has been completely removed from history."
|
||||||
|
echo "Run: git reflog expire --expire=now --all && git gc --aggressive --prune=now"
|
||||||
|
echo "Then force push to remote to remove traces from others' clones:"
|
||||||
|
echo " git push --force-with-lease origin main"
|
||||||
Reference in New Issue
Block a user