diff options
Diffstat (limited to 'src/content')
33 files changed, 372 insertions, 204 deletions
diff --git a/src/content/docs/advanced/key-package.mdx b/src/content/docs/advanced/key-package.mdx index 12817e3..7b47fdf 100644 --- a/src/content/docs/advanced/key-package.mdx +++ b/src/content/docs/advanced/key-package.mdx @@ -50,7 +50,7 @@ KeyPackage is useless. That is by design. Someone who steals just the 2. Choose the option to export as a **KeyPackage**. A dialog opens. -  + ![][img-1] 3. Fill in the three fields: @@ -63,7 +63,7 @@ KeyPackage is useless. That is by design. Someone who steals just the key file. You will be asked to set a **PIN**. Pick a strong one and keep it to yourself. -  + ![][img-2] 4. Check the optional settings: @@ -98,7 +98,7 @@ On the target device: 2. From the dropdown menu, select **Key Package**. -  + ![][img-3] 3. In the file dialog, choose the `.gfpack` file you transferred. @@ -157,3 +157,7 @@ protection has improved over time: The PIN you set does not encrypt the KeyPackage directly. Instead, it protects the key file, which in turn holds the actual encryption key. This is why the import needs both files and the PIN. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/28/b0e9d21290681e6f61415b80ee51b90b47b1c04b.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/28/0c304b476b436063970398593a82116029bc0e95.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/28/aec995410df49d0b532329a611ef68f10cd1885f.webp diff --git a/src/content/docs/advanced/key-revocation.mdx b/src/content/docs/advanced/key-revocation.mdx index b690711..2b82176 100644 --- a/src/content/docs/advanced/key-revocation.mdx +++ b/src/content/docs/advanced/key-revocation.mdx @@ -61,7 +61,7 @@ here in full. 1. Open the Key Details Window: open Key Details Dialog, then switch to the Operations tab. -  + ![][img-1] 2. Select `Generate Revocation Certificate`: At the bottom dropdown labeled `Revoke Certificate Operation`, choose Generate Revocation Certificate. @@ -70,7 +70,7 @@ here in full. Optionally provide free-form text for a more detailed explanation (e.g., lost, compromised). -  + ![][img-2] 4. Confirm and Save: Click OK, then in the file-save dialog, you can choose a secure local or private location to store the .rev file. @@ -96,7 +96,7 @@ here in full. 4. Verify Revocation: After import, the local key interface will mark the key as revoked. It can no longer be used for signing or decryption. -  + ![][img-3] 5. Publish to a Public Key Server ```shell @@ -112,4 +112,8 @@ here in full. - Secure Storage: Keep the revocation `.rev` file offline or in encrypted media to prevent unauthorized revocation. - Notify & Synchronize: After publishing revocation, inform peers or document - the change so everyone refreshes the key status promptly.
\ No newline at end of file + the change so everyone refreshes the key status promptly. + +[img-1]: https://image.cdn.bktus.com/i/2025/07/06/8698a865162985cacd7d38b218226888fac27b9a.webp +[img-2]: https://image.cdn.bktus.com/i/2025/07/06/84bbe89bf023c2855e19e96d63a85f2f08c94006.webp +[img-3]: https://image.cdn.bktus.com/i/2025/07/06/a287f7d66fe6850fca4031502d448b7524886099.webp diff --git a/src/content/docs/advanced/module-controller.md b/src/content/docs/advanced/module-controller.md index 093b9d6..7843e83 100644 --- a/src/content/docs/advanced/module-controller.md +++ b/src/content/docs/advanced/module-controller.md @@ -102,4 +102,6 @@ Modules are plain shared libraries with a C interface, linked against missing, please get in touch. For the source and examples, see the -[GpgFrontend Modules repository](https://github.com/saturneric/GpgFrontend-Modules/blob/main/README.md). +[GpgFrontend Modules repository][modules-readme]. + +[modules-readme]: https://github.com/saturneric/GpgFrontend-Modules/blob/main/README.md diff --git a/src/content/docs/advanced/sync-public-keys.md b/src/content/docs/advanced/sync-public-keys.md index fd89429..7823a6e 100644 --- a/src/content/docs/advanced/sync-public-keys.md +++ b/src/content/docs/advanced/sync-public-keys.md @@ -42,7 +42,7 @@ every now and then in between. 4. GpgFrontend checks each key against the key server. If the server has a newer version, the updates are imported into your local keyring. - +![][img-1] ## Which Key Server Is Used @@ -60,7 +60,7 @@ The **default key server** you set in Settings applies only to key 2. To use a different one for searches and imports, add your preferred key server and set it as the default. - +![][img-2] ## Tips @@ -70,3 +70,6 @@ The **default key server** you set in Settings applies only to key the changes make sense. - **Use a trusted network**: Sync over a network you trust, not open public Wi-Fi you know nothing about. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/28/38eefac3220f864b5e4a1fe98681f8cef817ef21.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/28/86bc996c90eb449dee681a86be15797015128f5c.webp diff --git a/src/content/docs/appendix/ai-policy.md b/src/content/docs/appendix/ai-policy.md index 220cd06..188b207 100644 --- a/src/content/docs/appendix/ai-policy.md +++ b/src/content/docs/appendix/ai-policy.md @@ -40,10 +40,10 @@ that keep the app safe were designed and written by hand: That work came from years of reading and studying, as described in the maintainer's article ["The Past and Present of -GpgFrontend"](https://blog.bktus.com/en/archives/u8hywl/). +GpgFrontend"][blog-history]. GpgFrontend is also not the biggest system its -[maintainer](https://blog.bktus.com/en/about-me/) has worked on. Behind it are +[maintainer][blog-about-me] has worked on. Behind it are years of backend engineering on far larger systems, and graduate study in cryptography, security and computer systems. @@ -135,7 +135,7 @@ GpgFrontend](/appendix/contribute/). ## The Wiki and This Manual The project links to an [AI-assisted -Wiki](https://deepwiki.com/saturneric/GpgFrontend), generated automatically from +Wiki][deepwiki-gpgfrontend], generated automatically from the source code by an outside service. It is useful for finding your way around, but it is not written by the maintainer and it can be wrong about details. Use it to get oriented, and check anything important against the source code. @@ -163,3 +163,7 @@ better basis for trust than silence. Being open about using these tools is not the same as being built by them. The design, the security decisions, and the responsibility for this app stay with the person who has been maintaining it since 2021. + +[blog-history]: https://blog.bktus.com/en/archives/u8hywl/ +[blog-about-me]: https://blog.bktus.com/en/about-me/ +[deepwiki-gpgfrontend]: https://deepwiki.com/saturneric/GpgFrontend diff --git a/src/content/docs/appendix/code-binary-verify.md b/src/content/docs/appendix/code-binary-verify.md index e83fd9d..3e5ef1c 100644 --- a/src/content/docs/appendix/code-binary-verify.md +++ b/src/content/docs/appendix/code-binary-verify.md @@ -34,11 +34,11 @@ Each system also adds its own check on top: ### Windows All programs and installers are signed with a -[Certum](https://www.certum.eu/en/certum-by-asseco/) code signing certificate. +[Certum][certum] code signing certificate. Windows checks this itself. You can also look at it yourself: right-click the file, open Properties, and look at Digital Signatures. - +![][img-1] ### macOS @@ -46,7 +46,7 @@ The app is signed with an Apple developer certificate and passes Apple's notarization check. macOS verifies both automatically the first time you open the app. If the app had been changed, macOS would refuse to start it. - +![][img-2] ### Linux @@ -54,7 +54,7 @@ The AppImage comes with a `.sig` file, like the other packages. Check it with GPG before you run the app. Flatpak and other formats bring their own signature and sandbox systems on top. - +![][img-3] ## Check Inside the App @@ -63,13 +63,13 @@ and the exact branch and commit hash of the source code this copy was built from. That lets you match your running app to a specific point in the public code history. - +![][img-4] ## The Signing Key All commits and release packages are signed with the maintainer's OpenPGP key. The key and its fingerprint are published at -[bktus.com/openpgp](https://bktus.com/openpgp/). Get the key there, check the +[bktus.com/openpgp][bktus-openpgp]. Get the key there, check the fingerprint, and use it to verify the `.sig` file that comes with each release. ## When the Stakes Are Very High @@ -86,7 +86,7 @@ If you are in that situation, this is the path: 1. **Get the source, not a binary.** Clone the repository and check out an official release tag. Verify the tag's GPG signature with the maintainer's - key from [bktus.com/openpgp](https://bktus.com/openpgp/). + key from [bktus.com/openpgp][bktus-openpgp]. 2. **Read before you build.** Review the code yourself, or have someone you trust review it. Pay attention to the build scripts too, not only the app code. @@ -102,3 +102,10 @@ Build instructions are in the costs real time and skill. That is the honest price of not having to trust anyone else's build. + +[certum]: https://www.certum.eu/en/certum-by-asseco/ +[img-1]: https://image.cdn.bktus.com/i/2025/06/25/2eb0e5a1ff970b6d97ed38f18b45476c9aad6ee7.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/cbc3a2ec86515bf5882d1249179e5e06053ada5f.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/690c6b534ab54130dfa100f85a8cc299a0223ff5.webp +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/fe75a2c041c9e5a7823d0c4d8820bf35501117cd.webp +[bktus-openpgp]: https://bktus.com/openpgp/ diff --git a/src/content/docs/appendix/contribute.md b/src/content/docs/appendix/contribute.md index fbc52ab..27266d0 100644 --- a/src/content/docs/appendix/contribute.md +++ b/src/content/docs/appendix/contribute.md @@ -16,7 +16,7 @@ every line you send, and you must have built and run it yourself. ## Wiki -An [AI-generated Wiki](https://deepwiki.com/saturneric/GpgFrontend) is built +An [AI-generated Wiki][deepwiki-gpgfrontend] is built automatically from the source code. It gives a good overview of the architecture, the design ideas, and the main components. @@ -32,7 +32,7 @@ All contributions should follow these rules: - **C Standard:** C code must follow the C99 standard. - **Rust Standard:** Since v2.2, GpgFrontend includes a Rust component (the rPGP engine), located under the `rust/` directory and built into the project - via [Corrosion](https://github.com/corrosion-rs/corrosion). Rust code must + via [Corrosion][github-corrosion]. Rust code must build with the Rust 2024 edition (Rust 1.85 or newer) and should be formatted with `rustfmt` and pass `clippy` using their default configurations. - **Compilers:** Your C/C++ code should compile with both GCC (8.0 or newer) @@ -63,7 +63,7 @@ local build behaves the same way as the official builds. - **Compilers:** GCC 8+ or Clang 9+ (on Windows, the MinGW toolchain from MSYS2). - **Rust toolchain:** Rust 1.85 or newer. Install it through - [rustup](https://rustup.rs/) on Linux and macOS. On Windows with MSYS2, the + [rustup][rustup] on Linux and macOS. On Windows with MSYS2, the `mingw-w64-x86_64-rust` package from the list below is used instead. The build expects `cargo` on your `PATH`. @@ -76,7 +76,7 @@ git clone https://github.com/saturneric/GpgFrontend.git cd GpgFrontend ``` -[BKTUS](https://bktus.com): +[BKTUS][bktus]: ```bash git clone https://git.bktus.com/GpgFrontend/GpgFrontend.git @@ -134,7 +134,7 @@ brew install cmake ninja automake texinfo libarchive googletest libsodium ``` - **For Windows (via MSYS2):** Set up MSYS2 according to [its - documentation](https://www.msys2.org/), open the MINGW64 shell, and install + documentation][msys2], open the MINGW64 shell, and install the necessary packages: ```bash @@ -164,7 +164,7 @@ Any Qt 6.x release works; CI currently builds against Qt 6.10.3. The required modules are Core, Widgets, PrintSupport, Network, LinguistTools, Xml, and Sql, plus Concurrent for the modules sub-project. -- On Linux, use the [Qt online installer](https://www.qt.io/download-qt-installer) +- On Linux, use the [Qt online installer][qt-installer] or your package manager (on Ubuntu: `qt6-base-dev qt6-tools-dev` and related packages). - On macOS, use the Qt online installer or `brew install qt`. @@ -215,7 +215,7 @@ implement your changes while following the technical requirements above, and run the tests before submitting. Commit messages follow the [Conventional -Commits](https://www.conventionalcommits.org/) style used throughout the +Commits][conventionalcommits] style used throughout the project history: `type(scope): subject`, for example `fix(ui): correct key list refresh`. @@ -237,3 +237,11 @@ changes and the reasons for them in your email. Stuck, or unsure how to start? Ask. The maintainer's email address is on the [Contact](/overview/contact/) page, and a question early is better than a lot of work in the wrong direction. + +[deepwiki-gpgfrontend]: https://deepwiki.com/saturneric/GpgFrontend +[github-corrosion]: https://github.com/corrosion-rs/corrosion +[rustup]: https://rustup.rs/ +[bktus]: https://bktus.com +[msys2]: https://www.msys2.org/ +[qt-installer]: https://www.qt.io/download-qt-installer +[conventionalcommits]: https://www.conventionalcommits.org/ diff --git a/src/content/docs/appendix/free-no-donation.md b/src/content/docs/appendix/free-no-donation.md index c77959f..c27f9d3 100644 --- a/src/content/docs/appendix/free-no-donation.md +++ b/src/content/docs/appendix/free-no-donation.md @@ -71,7 +71,7 @@ is real with [Code & Binary Verify](/appendix/code-binary-verify/). These things help more than money would: -- **Star it on [GitHub](https://github.com/saturneric/GpgFrontend).** That is +- **Star it on [GitHub][github-gpgfrontend].** That is the official donation button. :) - **Report bugs.** A clear bug report, with the steps to repeat it, is a real gift. @@ -79,3 +79,5 @@ These things help more than money would: - **[Contribute](/appendix/contribute/)** code, or fix a page in this manual. - **Tell someone.** The project grows when the people who need it hear about it. + +[github-gpgfrontend]: https://github.com/saturneric/GpgFrontend diff --git a/src/content/docs/appendix/translate-interface.md b/src/content/docs/appendix/translate-interface.md index 909b202..e3c0dd9 100644 --- a/src/content/docs/appendix/translate-interface.md +++ b/src/content/docs/appendix/translate-interface.md @@ -6,33 +6,28 @@ sidebar: label: Translate --- -GpgFrontend is designed to support multiple languages, and community -translation is an important part of making the application accessible to more -users. +GpgFrontend speaks many languages, and the translations come from the +community. -Translation work does not require deep technical knowledge of cryptography or -GpgFrontend internals. If you are familiar with both English and another -language, you can help improve the interface, documentation, and user -experience. +You do not need to know anything about cryptography or the code to help. If +you know English and one other language well, you can translate. ## What You Need to Know -Since v2.1.2, GpgFrontend has used Qt's translation system through -[Qt Linguist](https://doc.qt.io/qt-6/qtlinguist-index.html). +GpgFrontend uses Qt's translation system (since v2.1.2). Translations are +edited with [Qt Linguist][qt-linguist], a graphical tool. The basics: -Before starting, it is helpful to understand the basic Qt Linguist workflow: - -- `.ts` files store source strings and translations. -- Qt Linguist can be used to edit translations with a graphical interface. -- Unfinished or outdated translations can be updated gradually. -- Placeholders such as `%1`, `%2`, `%n`, and HTML-like tags should be preserved. +- `.ts` files store the English source strings and their translations. +- Qt Linguist opens these files and lets you translate string by string. +- You do not have to finish everything at once; partial work is fine. +- Keep placeholders such as `%1`, `%2`, `%n`, and HTML-like tags as they are. ## About Translation Files 1. Download or clone the source code from - [GitHub](https://github.com/saturneric/GpgFrontend). + [GitHub][github-gpgfrontend]. 2. The application's translation files are located in - [`resource/lfs/locale/ts`](https://github.com/saturneric/GpgFrontend/tree/main/resource/lfs/locale/ts), + [`resource/lfs/locale/ts`][locale-ts-dir], named `GpgFrontend.<locale>.ts` (for example `GpgFrontend.de_DE.ts`). Integrated modules keep their own translations under `modules/src/<module>/ts/`, so the application and every module always share @@ -44,51 +39,47 @@ Before starting, it is helpful to understand the basic Qt Linguist workflow: The `.ts` files are no longer hand-created. The set of supported languages is defined in one place, `GPGFRONTEND_SUPPORTED_LOCALES` in -[`cmake/Translations.cmake`](https://github.com/saturneric/GpgFrontend/blob/main/cmake/Translations.cmake), +[`cmake/Translations.cmake`][github-translations-cmake], and both the application and the modules derive their `.ts` file set from it. A helper script, -[`scripts/update_translations.sh`](https://github.com/saturneric/GpgFrontend/blob/main/scripts/update_translations.sh), -runs Qt's `lupdate` to create any missing `.ts` files and to sync newly added or -changed `tr()` strings into every locale (marking them as -`type="unfinished"`), for the application and all modules at once. It works -offline and only updates source strings; it does not translate anything. +[`scripts/update_translations.sh`][github-update-translations-sh], +keeps them in sync. It creates any missing `.ts` files and pulls new or +changed interface strings into every language file, marking them as +`type="unfinished"`. It covers the application and all modules at once, works +offline, and does not translate anything itself. -To **add a brand-new language**, you therefore add its locale code to -`GPGFRONTEND_SUPPORTED_LOCALES` and run `scripts/update_translations.sh`, which -generates the matching `.ts` files everywhere. See this -[locale code list](https://saimana.com/list-of-country-locale-code/) for -reference. If you would rather not touch the build files, you can instead ask -the maintainer to register the new locale for you, then translate the generated -`.ts` file. +To **add a brand-new language**, add its locale code to +`GPGFRONTEND_SUPPORTED_LOCALES` and run `scripts/update_translations.sh`, +which generates the matching `.ts` files everywhere. See this +[locale code list][locale-codes] for reference. If you would rather not touch +the build files, ask the maintainer to register the new locale for you, then +translate the generated `.ts` file. ## Translation Lifecycle -Once a translation file is created and added to GpgFrontend, the language will -continue to be supported in later releases unless it is intentionally removed. +Once a language is added, it stays supported in later releases unless it is +removed on purpose. -However, interface strings change over time. New features, renamed options, and -updated dialogs may introduce untranslated or outdated strings. Before a -release, I may use AI-assisted translation tools to fill missing translations -in languages that I cannot confidently review myself, so that supported -languages remain reasonably complete. +But the interface keeps changing. New features and renamed options bring new +strings that are not translated yet. Before a release, the maintainer may fill +those gaps with AI translation tools, in languages the maintainer cannot check +personally, so every language stays reasonably complete. -AI-assisted translations are only a fallback. They may be inaccurate, unnatural, -too literal, or inconsistent with established terminology. Human review is still -preferred, especially for security-related terms, OpenPGP concepts, and user -interface wording. +Those AI translations are only a stopgap. They can be clumsy, too literal, or +inconsistent with the usual terms. A human translation is always better, +especially for security terms, OpenPGP concepts, and interface wording. -Contributors are welcome to improve existing translations at any time. If you -notice awkward, incorrect, or incomplete translations, you can edit the -corresponding `.ts` file and submit the updated version again. +So if you see an awkward or wrong translation in your language, that is your +invitation: edit the `.ts` file and send in the improved version. ## Submitting Your Work -You can submit translation updates in either of the following ways: +There are two ways to send in your work: 1. Open a pull request with the changed `.ts` file or files. 2. Send the updated `.ts` file by email to - [[email protected]](mailto:[email protected]). + [[email protected]][eric]. When opening a pull request, keep the diff focused on your actual translation changes: @@ -104,3 +95,11 @@ changes: in the pull request description so the build change is easy to spot. Both new languages and corrections to existing translations are welcome. + +[qt-linguist]: https://doc.qt.io/qt-6/qtlinguist-index.html +[github-gpgfrontend]: https://github.com/saturneric/GpgFrontend +[locale-ts-dir]: https://github.com/saturneric/GpgFrontend/tree/main/resource/lfs/locale/ts +[github-translations-cmake]: https://github.com/saturneric/GpgFrontend/blob/main/cmake/Translations.cmake +[github-update-translations-sh]: https://github.com/saturneric/GpgFrontend/blob/main/scripts/update_translations.sh +[locale-codes]: https://saimana.com/list-of-country-locale-code/ +[eric]: mailto:[email protected] diff --git a/src/content/docs/appendix/version-policy.md b/src/content/docs/appendix/version-policy.md index 4dba9e1..eb58f4a 100644 --- a/src/content/docs/appendix/version-policy.md +++ b/src/content/docs/appendix/version-policy.md @@ -41,7 +41,7 @@ Instant Messaging tokens, a new key list, and a rebuilt settings window. :::note[How to tell how big a release is] Do not judge it by the number. Read the release notes on the -[releases page](https://github.com/saturneric/GpgFrontend/releases). They say what +[releases page][github-releases]. They say what actually changed. ::: @@ -102,7 +102,7 @@ like progress. This project does not. The number moves when the app really changes, and stays put when it does not. That is a deliberate choice, described in the maintainer's article -["The Past and Present of GpgFrontend"](https://blog.bktus.com/en/archives/u8hywl/): +["The Past and Present of GpgFrontend"][blog-history]: > "I firmly believe that **steady progress is more valuable than blind > innovation**." @@ -138,3 +138,6 @@ The app's built-in update check only offers you newer versions **from your own series**. It will not move you to a different one on its own. Moving to a new series is something you choose to do yourself, by downloading it from the [Downloads](/overview/downloads/) page. + +[github-releases]: https://github.com/saturneric/GpgFrontend/releases +[blog-history]: https://blog.bktus.com/en/archives/u8hywl/ diff --git a/src/content/docs/extra/algorithms-comparison.md b/src/content/docs/extra/algorithms-comparison.md index 78c6dd3..e8689ee 100644 --- a/src/content/docs/extra/algorithms-comparison.md +++ b/src/content/docs/extra/algorithms-comparison.md @@ -35,18 +35,18 @@ older systems, while Curve25519 stays fast for everyday work. ## At a Glance -| Algorithm | Group | Used for | Engines | Notes | -| ------------------------ | ----------- | ---------------- | --------------- | -------------------------------------- | -| RSA | Classical | Sign + Encrypt | GnuPG, rPGP | Best compatibility; slower | -| ElGamal (ELG-E) | Classical | Encrypt only | GnuPG | Rarely needed today | -| ECDSA (NIST curves) | Elliptic | Sign | GnuPG, rPGP | Standardized by NIST | -| EdDSA (Ed25519 / Ed448) | Elliptic | Sign | GnuPG, rPGP | Modern default for signing | -| ECDH (Curve25519 / X448) | Elliptic | Encrypt | GnuPG, rPGP | Modern default for encryption | -| Brainpool curves | Elliptic | Sign + Encrypt | GnuPG 2.3+ | Non-NIST alternative | -| secp256k1 | Elliptic | Sign | GnuPG 2.3+, rPGP| Used in blockchain | -| ML-DSA | Post-Quantum| Sign | rPGP only | Experimental, OpenPGP v6 | -| SLH-DSA | Post-Quantum| Sign | rPGP only | Experimental; large signatures | -| Kyber / ML-KEM | Post-Quantum| Encrypt | GnuPG 2.5+, rPGP| Experimental; always hybrid | +| Algorithm | Group | Used for | Engines | Notes | +| ------------------------ | ------------ | -------------- | ---------------- | ------------------------------ | +| RSA | Classical | Sign + Encrypt | GnuPG, rPGP | Best compatibility; slower | +| ElGamal (ELG-E) | Classical | Encrypt only | GnuPG | Rarely needed today | +| ECDSA (NIST curves) | Elliptic | Sign | GnuPG, rPGP | Standardized by NIST | +| EdDSA (Ed25519 / Ed448) | Elliptic | Sign | GnuPG, rPGP | Modern default for signing | +| ECDH (Curve25519 / X448) | Elliptic | Encrypt | GnuPG, rPGP | Modern default for encryption | +| Brainpool curves | Elliptic | Sign + Encrypt | GnuPG 2.3+ | Non-NIST alternative | +| secp256k1 | Elliptic | Sign | GnuPG 2.3+, rPGP | Used in blockchain | +| ML-DSA | Post-Quantum | Sign | rPGP only | Experimental, OpenPGP v6 | +| SLH-DSA | Post-Quantum | Sign | rPGP only | Experimental; large signatures | +| Kyber / ML-KEM | Post-Quantum | Encrypt | GnuPG 2.5+, rPGP | Experimental; always hybrid | The exact choices you see depend on the engine, its version, and the key format. @@ -56,7 +56,7 @@ The exact choices you see depend on the engine, its version, and the key format. - **What it is**: one of the most widely used public key algorithms. Introduced in 1977, it relies on the difficulty of factoring large prime numbers. - ([more](https://en.wikipedia.org/wiki/RSA_cryptosystem)) + ([more][wiki-rsa]) - **Key sizes**: usually 2048 bits or larger; 4096 bits for higher security. - **Used for**: both encryption and signing. The standard for SSL/TLS certificates and well supported on legacy systems. @@ -86,7 +86,7 @@ engine still offers the smaller sizes. - **What it is**: an encryption-only algorithm based on the Diffie-Hellman problem. In OpenPGP it is used for encryption, not signing. - ([more](https://en.wikipedia.org/wiki/ElGamal_encryption)) + ([more][wiki-elgamal]) - **Key sizes**: usually 2048 bits or more. - **Strength**: it produces a different ciphertext each time, even for the same message, which gives semantic security. @@ -95,34 +95,34 @@ engine still offers the smaller sizes. ## Elliptic Curve Cryptography (ECC) -[Elliptic Curve Cryptography](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) +[Elliptic Curve Cryptography][wiki-ecc] gives strong security with much smaller keys than RSA, which makes it a good fit when computing power or storage is limited. OpenPGP uses ECC in a few forms. -- [**ECDH**](https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman) +- [**ECDH**][wiki-ecdh] (key exchange): lets two sides agree on a shared secret over an open channel, which is then used for encryption. It does not sign. -- [**ECDSA**](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) +- [**ECDSA**][wiki-ecdsa] (signing): creates and checks digital signatures, so a reader can confirm a message came from you and wasn't changed. - **EdDSA** (signing): a newer signature scheme, covered below. ### Common Curves -- [**NIST curves (P-256, P-384, P-521)**](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf): +- [**NIST curves (P-256, P-384, P-521)**][fips-186-5]: standardized by NIST and widely used in secure communication. P-256 gives about 128-bit security (enough for most uses); P-384 and P-521 raise this, with P-521 giving around 256-bit security for high-security needs. -- [**Brainpool curves (P-256, P-384, P-512)**](https://www.rfc-editor.org/rfc/rfc5639): +- [**Brainpool curves (P-256, P-384, P-512)**][rfc5639]: an alternative to the NIST curves with similar strength but independently chosen parameters. Often used where non-NIST curves are preferred for compliance. - **Curve25519 and X448**: optimized for speed and common in modern apps. - - [**Curve25519**](https://en.wikipedia.org/wiki/Curve25519): used for key - exchange (the partner of [Ed25519](https://en.wikipedia.org/wiki/EdDSA#Ed25519)), + - [**Curve25519**][wiki-curve25519]: used for key + exchange (the partner of [Ed25519][wiki-eddsa]), with about 128-bit security. Very efficient. - - [**X448**](https://en.wikipedia.org/wiki/Curve448): a higher-security option + - [**X448**][wiki-curve448]: a higher-security option (about 224-bit), at a small cost in speed. -- [**secp256k1**](https://www.secg.org/sec2-v2.pdf): a non-NIST curve best known +- [**secp256k1**][sec2-v2]: a non-NIST curve best known for its use in Bitcoin and other blockchains, where fast signature checking matters. @@ -134,10 +134,10 @@ be faster, safer, and harder to misuse than older schemes like DSA or ECDSA. - **Deterministic**: unlike ECDSA and DSA, it doesn't need a fresh random number for each signature, which avoids a common source of bugs and weak signatures. - **Curves**: - - [**Ed25519**](https://en.wikipedia.org/wiki/EdDSA#Ed25519): about 128-bit + - [**Ed25519**][wiki-eddsa]: about 128-bit security, fast, with small keys. Great for secure messaging, blockchain, and most modern uses. - - [**Ed448**](https://en.wikipedia.org/wiki/Curve448): about 224-bit security for + - [**Ed448**][wiki-curve448]: about 224-bit security for cases that need stronger or longer-term protection, at some cost in speed. ### Why ECDH Can't Be a Primary Key @@ -150,7 +150,7 @@ encryption subkeys. ### OpenPGP v6 and the 25519 Compatibility Catch -OpenPGP v6 ([RFC 9580](https://www.rfc-editor.org/rfc/rfc9580)) adds new algorithm +OpenPGP v6 ([RFC 9580][rfc9580]) adds new algorithm identifiers and formats for modern curves like **Ed25519**, **Ed448**, **X25519**, and **X448**. These are encoded differently from the older 25519 keys that GnuPG usually makes (EdDSA over Ed25519 and ECDH over Curve25519). @@ -235,3 +235,16 @@ Under rPGP, Kyber-768 pairs with Curve25519 and Kyber-1024 pairs with X448. Hybrid KEM keys are more sensitive to compatibility than classic RSA or Curve25519 keys, and the two engines don't encode them the same way. If you need the widest compatibility, prefer classic RSA or Curve25519 keys for now. + +[wiki-rsa]: https://en.wikipedia.org/wiki/RSA_cryptosystem +[wiki-elgamal]: https://en.wikipedia.org/wiki/ElGamal_encryption +[wiki-ecc]: https://en.wikipedia.org/wiki/Elliptic-curve_cryptography +[wiki-ecdh]: https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman +[wiki-ecdsa]: https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm +[fips-186-5]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf +[rfc5639]: https://www.rfc-editor.org/rfc/rfc5639 +[wiki-curve25519]: https://en.wikipedia.org/wiki/Curve25519 +[wiki-eddsa]: https://en.wikipedia.org/wiki/EdDSA#Ed25519 +[wiki-curve448]: https://en.wikipedia.org/wiki/Curve448 +[sec2-v2]: https://www.secg.org/sec2-v2.pdf +[rfc9580]: https://www.rfc-editor.org/rfc/rfc9580 diff --git a/src/content/docs/extra/dependencies.md b/src/content/docs/extra/dependencies.md index 55062b4..660ade7 100644 --- a/src/content/docs/extra/dependencies.md +++ b/src/content/docs/extra/dependencies.md @@ -25,31 +25,45 @@ change does not mean OpenSSL is completely absent from all runtime environments. ### Common -- **Qt (Open Source)**: [https://www.qt.io](https://www.qt.io) -- **GnuPG**: [https://gnupg.org](https://gnupg.org) -- **GpgME**: [https://gnupg.org/software/gpgme/index.html](https://gnupg.org/software/gpgme/index.html) -- **OpenSSL**: [https://openssl-library.org](https://openssl-library.org) -- **libarchive**: [https://www.libarchive.org](https://www.libarchive.org) -- **libsodium**: [https://libsodium.gitbook.io/doc](https://libsodium.gitbook.io/doc) +- **Qt (Open Source)**: [https://www.qt.io][qt] +- **GnuPG**: [https://gnupg.org][gnupg] +- **GpgME**: [https://gnupg.org/software/gpgme/index.html][gnupg-gpgme] +- **OpenSSL**: [https://openssl-library.org][openssl-library] +- **libarchive**: [https://www.libarchive.org][libarchive] +- **libsodium**: [https://libsodium.gitbook.io/doc][libsodium] ### Windows -- **MSYS2**: [https://www.msys2.org](https://www.msys2.org) -- **mingw-w64**: [https://www.mingw-w64.org](https://www.mingw-w64.org) +- **MSYS2**: [https://www.msys2.org][msys2] +- **mingw-w64**: [https://www.mingw-w64.org][mingw-w64] ### Linux -- **AppImage**: [https://appimage.org](https://appimage.org) -- **libsecret**: [https://gitlab.gnome.org/GNOME/libsecret](https://gitlab.gnome.org/GNOME/libsecret) +- **AppImage**: [https://appimage.org][appimage] +- **libsecret**: [https://gitlab.gnome.org/GNOME/libsecret][gnome-gitlab-libsecret] ### macOS -- **macOS Application Bundles**: [Link](https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html) -- **Xcode Command Line Tools**: [https://developer.apple.com/xcode/](https://developer.apple.com/xcode/) +- **macOS Application Bundles**: [Link][apple-aboutbundles] +- **Xcode Command Line Tools**: [https://developer.apple.com/xcode/][apple-xcode] ## Icons The icons utilized in this software are sourced from [Alibaba -Iconfont](https://www.iconfont.cn/). This vector icon library is free of use, +Iconfont][iconfont]. This vector icon library is free of use, isn't registered as a trademark, has no copyright issues, and can be commercially utilized. + +[qt]: https://www.qt.io +[gnupg]: https://gnupg.org +[gnupg-gpgme]: https://gnupg.org/software/gpgme/index.html +[openssl-library]: https://openssl-library.org +[libarchive]: https://www.libarchive.org +[libsodium]: https://libsodium.gitbook.io/doc +[msys2]: https://www.msys2.org +[mingw-w64]: https://www.mingw-w64.org +[appimage]: https://appimage.org +[gnome-gitlab-libsecret]: https://gitlab.gnome.org/GNOME/libsecret +[apple-aboutbundles]: https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html +[apple-xcode]: https://developer.apple.com/xcode/ +[iconfont]: https://www.iconfont.cn/ diff --git a/src/content/docs/guides/email-operations.md b/src/content/docs/guides/email-operations.md index 61203fd..280c8a7 100644 --- a/src/content/docs/guides/email-operations.md +++ b/src/content/docs/guides/email-operations.md @@ -66,13 +66,13 @@ Each address must be a plain address (`[email protected]`) or the ::: - +![][img-1] - +![][img-2] - +![][img-3] - +![][img-4] ### Step 2: Encrypt (Optional) @@ -84,7 +84,7 @@ To hide the content so only the recipient can read it: You can sign and encrypt together for a message that is both private and proven to be from you. - +![][img-5] ### Step 3: Save and Send @@ -107,7 +107,7 @@ Remember, GpgFrontend doesn't send the email. Your email app does. A signed email shows a **Good Digital Signature** message. An encrypted email is shown decrypted. - +![][img-6] ### Understand the Results @@ -165,3 +165,10 @@ tools. encryption. - **Offline by design**: every operation runs on your computer. Your private keys and message contents are never sent to outside servers. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/84f732220b3a967aa5d3986f79475bdfcf53454e.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/610ba60f2cd8eeddbcfbbc57aa602cff61197065.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/fea933e12bf46516d6a1385698b6afa94e7543a0.webp +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/ee90e5bb25c7accdccf70f17c1986e53e0b4e81f.webp +[img-5]: https://image.cdn.bktus.com/i/2025/06/24/f8fe32d6e3502a1ba3503189fa40e4348bd4cc81.webp +[img-6]: https://image.cdn.bktus.com/i/2025/06/24/64b84451fd044cfd0c081161dad3057c5fde25a4.webp diff --git a/src/content/docs/guides/file-operations.md b/src/content/docs/guides/file-operations.md index 8b8febc..e0003b3 100644 --- a/src/content/docs/guides/file-operations.md +++ b/src/content/docs/guides/file-operations.md @@ -22,7 +22,7 @@ The File Panel is where you work on files. There are two ways to open it. 3. The File Panel opens. If you picked a file, it is highlighted and ready. If you picked a folder, you see its contents and can choose files inside. - +![][img-1] **Using the File Panel button:** @@ -30,7 +30,7 @@ The File Panel is where you work on files. There are two ways to open it. 2. Choose a folder in the dialog. 3. A new **File Panel** tab opens showing that folder. Click the file you want. - +![][img-2] ## Getting Around the File Panel @@ -67,9 +67,9 @@ Toolbox** and click the matching toolbar button: - **Verify**: make sure the sender's **public key** is in your keyring, then click **Verify**. - +![][img-3] - +![][img-4] ## Drag and Drop Files @@ -126,9 +126,9 @@ handle several at once. Batch Mode is handy when you have many files to process at once. - +![][img-5] - +![][img-6] ## Encrypt or Decrypt a Whole Folder @@ -181,7 +181,7 @@ text-friendly output, for example to paste into an email. 2. Find the option **Use Binary Mode for File Operations**. 3. Check it for binary (`.gpg` / `.sig`), or uncheck it for ASCII (`.asc`). - +![][img-7] **Or toggle it from the File Panel:** @@ -191,7 +191,7 @@ text-friendly output, for example to paste into an email. This is a faster way to switch output modes without opening the main settings. - +![][img-8] ## If an Operation Is Interrupted @@ -201,3 +201,12 @@ only puts it in place once it is complete. If an operation fails or is interrupted, you get no output file at all, rather than a half-written one sitting next to your original. Your input file is never touched either way. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/2365c709356b1339898043390a1ff7ac232e05f4.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/acb0e681d8f383589727d0012c3842c487033fa1.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/5ed085a7ac16c34a1e6ba46707597e91a93b6ecc.gif +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/3dceea13ad31f488a347f3b0d4b1fb998487f223.gif +[img-5]: https://image.cdn.bktus.com/i/2025/04/09/24a8b950-ff08-2133-0ee2-5003095f1ff7.webp +[img-6]: https://image.cdn.bktus.com/i/2025/06/24/41efb25fd3a691a57c04a0a2ec4b0e651ceb556c.gif +[img-7]: https://image.cdn.bktus.com/i/2025/06/24/40365f1a7b1ac8d24ac8c11c45e77476a465eab7.webp +[img-8]: https://image.cdn.bktus.com/i/2025/04/09/ea2c8b52-2a49-ee18-5897-5cf3d72115a5.webp diff --git a/src/content/docs/guides/generate-key.md b/src/content/docs/guides/generate-key.md index 1d0f61e..c3e1fe9 100644 --- a/src/content/docs/guides/generate-key.md +++ b/src/content/docs/guides/generate-key.md @@ -16,7 +16,7 @@ everything else. You can change those defaults later if you want (see In the **Main Window**, click **New Keypair**. This opens the **Generate Key** window, where you set your identity and key options. - +![][img-1] ## Step 2: Enter Your Information @@ -158,3 +158,5 @@ If you need your key to work with as many tools as possible, check what format your engine and version actually produce before you share the key. ::: + +[img-1]: https://image.cdn.bktus.com/i/2026/06/30/398635c90c069535c343216224f5fa4d881dd605.webp diff --git a/src/content/docs/guides/generate-use-subkey.md b/src/content/docs/guides/generate-use-subkey.md index 8d3ac7b..fe16697 100644 --- a/src/content/docs/guides/generate-use-subkey.md +++ b/src/content/docs/guides/generate-use-subkey.md @@ -19,7 +19,7 @@ and the more advanced setups come later, so you can skip them until you need the 2. Open the **Keychain** tab. 3. Click **Generate A New Subkey**. - +![][img-1] ### Step 1: Choose What the Subkey Is For @@ -62,7 +62,7 @@ keep your primary key offline. - When asked, enter your key's **passphrase** to confirm. - The new subkey appears under the **Keychain** tab. - +![][img-2] That's all you need to add a subkey. @@ -140,25 +140,25 @@ current OpenPGP backend." Use a GnuPG-backed key database for this. primary key, the button is labeled **Export Primary Key** instead.) 5. **Save the file**: choose a secure folder and save the subkey as its own file. - +![][img-3] ### Step 2: Import the Subkey into Another Database 1. **Pick the key database**: choose the right key database in the **Key Toolbox**. - +![Switch Key Database][img-4] 2. **Import the file**: click **Import Key** in the top toolbar and choose **File**. Browse to the exported subkey file. -  + ![Import the Subkey][img-5] 3. **Select the file**: pick the subkey file and click **Open** to import it into the chosen key database. 4. **Check it**: find the subkey in the **Key Toolbox**, then click it to open its **Key Details** (Key ID, Algorithm, Key Size, Usage). -  + ![Verify Imported Subkey][img-6] ### Step 3: Use a Key Without Its Primary Key @@ -170,12 +170,12 @@ In the **Key Toolbox**, a `#` next to the **Type** (for example, **pub/sec#**) means the primary key isn't in this key database. This is expected when you have removed the primary key on purpose and kept the subkeys for daily use. - +![Meaning of '#' Symbol][img-7] To confirm, open the subkey's **Key Details**. The **Primary Key Existence** section should say **Not Exists**. - +![Primary Key Not Exists][img-8] **What still works** with only subkeys present: @@ -183,7 +183,7 @@ section should say **Not Exists**. - You can **sign**, but only if you kept a signing subkey. So make a signing subkey when you first create the key, if you'll need one later. - +![Use Subkey to Encrypt][img-9] **What you can't do** without the primary key: @@ -303,3 +303,13 @@ Keep these points in mind before you share a key made with the rPGP engine: version. The current rPGP engine supports only some hybrid pairings, such as **Kyber-768 + Curve25519** and **Kyber-1024 + X448**. Other pairings may need GnuPG 2.5+ or may not be available. + +[img-1]: https://image.cdn.bktus.com/i/2026/06/30/3d94fa5ca42185abee5dfdfc1530961902fbe680.webp +[img-2]: https://image.cdn.bktus.com/i/2026/06/30/66dbd8460933ec7cd6bfece33daa84e2d622d90f.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/b4f1dc5e6eb6f683300564a4ba998e48d22b75b4.webp +[img-4]: https://image.cdn.bktus.com/i/2024/11/29/0e8ff19e-4189-65db-5732-1a2e79d9b8a6.webp +[img-5]: https://image.cdn.bktus.com/i/2024/11/29/8f3456ba-6275-4ef9-8e41-49b9b6bc0dfa.webp +[img-6]: https://image.cdn.bktus.com/i/2024/11/29/ac01142d-1ffa-ba32-daac-36ddf0729ff1.webp +[img-7]: https://image.cdn.bktus.com/i/2024/11/29/78d9bc07-8b96-302b-25d1-cbb88815f16a.webp +[img-8]: https://image.cdn.bktus.com/i/2024/11/29/05594a4b-cdad-7ad4-070b-58e24701cce3.webp +[img-9]: https://image.cdn.bktus.com/i/2024/11/29/20047766-48ab-f4a3-175c-241c7d5c0dbf.webp diff --git a/src/content/docs/guides/import-export-key-pair.md b/src/content/docs/guides/import-export-key-pair.md index 53474bc..63a1832 100644 --- a/src/content/docs/guides/import-export-key-pair.md +++ b/src/content/docs/guides/import-export-key-pair.md @@ -15,9 +15,9 @@ page covers each method. You can import a public or private key in a few ways. Find them on the toolbar, or open the action menu in the key management section for more options. - +![][img-1] - +![][img-2] ### From a File @@ -80,7 +80,7 @@ wherever you need. Use the key pair's **Operations** tab to save the public key to a file, as shown below. Pick a folder for the file first. - +![][img-3] #### Export Several at Once @@ -88,7 +88,7 @@ To export the public keys of several key pairs together, select them in the key management view and click **Export to Clipboard**. This copies the data to your clipboard, ready to paste into any app or file. - +![][img-4] #### Export for SSH @@ -105,7 +105,7 @@ You can also find private key options on the detail page of a key that holds a private part (the primary key or a subkey). Pick a destination, and GpgFrontend exports the private key there. - +![][img-5] :::caution[Never share your private key] @@ -141,3 +141,9 @@ Back up your revocation certificates in the same place. See [Key Revocation](/advanced/key-revocation/). ::: + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/65a0c1fce233c2fc15afd362b432eb53f684c73d.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/0f9c76d074dd6c364603baea3c565e66c9a8d62d.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/b9ea951b5c94e8f18cc22e6e415778b97818718f.webp +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/0ce7919189489923f38e3871e407dad96b788174.webp +[img-5]: https://image.cdn.bktus.com/i/2025/06/24/9dbc57b795542a5f9c2f78875d5be1f9c692ed0d.webp diff --git a/src/content/docs/guides/key-categories.mdx b/src/content/docs/guides/key-categories.mdx index 80fc6bb..325d883 100644 --- a/src/content/docs/guides/key-categories.mdx +++ b/src/content/docs/guides/key-categories.mdx @@ -36,7 +36,7 @@ Categories appear in two places: Clicking a category shows only the keys in it. - +![Key Management window with categories][img-1] ## The Ready-Made Ones @@ -114,3 +114,5 @@ it. - Categories belong to one key database. If you use more than one, each has its own set. See [Multi-Key Database](/advanced/key-database/). - The search box searches inside the category you are looking at. + +[img-1]: https://image.cdn.bktus.com/i/2026/08/15/1061813234b452f77ee3c011d2ef2d229630e591.webp diff --git a/src/content/docs/guides/key-group.md b/src/content/docs/guides/key-group.md index 2bea9b7..9bc7d0a 100644 --- a/src/content/docs/guides/key-group.md +++ b/src/content/docs/guides/key-group.md @@ -49,9 +49,9 @@ group, you pick the group once and you are done. 4. **Done.** Your new group shows up in the key list with the Type set to "group". You can now use it just like a single public key. - +![][img-1] - +![][img-2] ## Edit a group @@ -59,7 +59,7 @@ You can change a group whenever you want. Double-click the group in the list (or use the group management menu) to open the Key Group Management window. From there you can add keys, remove keys, or put other groups inside the group. - +![][img-3] ## When to use Key Groups @@ -106,3 +106,7 @@ or to certify. Key Groups live only inside GpgFrontend. They are not the same as GnuPG's "keygroup" feature and they are not saved in the `gpg.conf` file. Other OpenPGP tools will not see your groups. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/c70891d9ad74b21074be03c7a1d0aabf77d9ea3a.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/bf35548136bc176635dc0fd1175795597701e1dc.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/4c4c9e18c0c850b4d1bbbf8e0861e7f24fa72269.webp diff --git a/src/content/docs/guides/key-management.mdx b/src/content/docs/guides/key-management.mdx index acd18ac..0bb268f 100644 --- a/src/content/docs/guides/key-management.mdx +++ b/src/content/docs/guides/key-management.mdx @@ -15,7 +15,7 @@ The Key Toolbox in the main window and this window show the same keys, but they are for different jobs. The Toolbox is for **picking** a key for a task. This window is for **doing something to** a key. - +![Key Management window][img-1] ## What You Are Looking At @@ -150,3 +150,5 @@ The usual reasons are simple: Actions your OpenPGP engine cannot do at all are hidden rather than greyed out, so a short menu usually means you are on the rPGP engine. See [Multi-Key Database](/advanced/key-database/). + +[img-1]: https://image.cdn.bktus.com/i/2026/08/15/e371229f31bb56c3d735fe6644a7317b87ed5cf5.webp diff --git a/src/content/docs/guides/key-server-operations.md b/src/content/docs/guides/key-server-operations.md index 5e6dc63..b41e165 100644 --- a/src/content/docs/guides/key-server-operations.md +++ b/src/content/docs/guides/key-server-operations.md @@ -25,7 +25,7 @@ sync keys. You do not need to type any commands. click the Import Key button (the one with a downward arrow). 2. **Pick "Keyserver".** In the drop-down menu, choose Keyserver as the source. - +![][img-1] ### Steps to import @@ -34,7 +34,7 @@ sync keys. You do not need to type any commands. 3. Click **Search**. 4. When you see a result, double-click it to import the key. - +![][img-2] > GpgFrontend already lists a few key servers for you, such as: > @@ -61,7 +61,7 @@ You can then check: - The UID and key ID - Whether the key is expired or revoked (use the Key Manager filters) - +![][img-3] ## Send your public key to a key server @@ -69,7 +69,7 @@ You can upload your public key so other people can find it and send you encrypte messages. Since v2.1.6, GpgFrontend uploads keys to -[https://keys.openpgp.org](https://keys.openpgp.org) by default. This server uses +[https://keys.openpgp.org][keys-openpgp] by default. This server uses the **Verifying Keyserver (VKS) Interface**, which gives extra protection against spam and fake keys. @@ -87,7 +87,7 @@ To upload: 2. Go to the **Operations** tab. 3. Click **"Upload key pair to key server"**. - +![][img-4] ## Sync a public key @@ -123,7 +123,7 @@ you are the owner, so you should **publish** your updates instead of pulling the ## Check if your key is published GpgFrontend v2.1.6 can check on its own whether your public key is published on -[keys.openpgp.org](https://keys.openpgp.org). This helps you know if people can +[keys.openpgp.org][keys-openpgp]. This helps you know if people can find your key. ### What it does @@ -132,7 +132,7 @@ find your key. - If your key is found on `keys.openpgp.org`, you see a message in the **Key Details** tab, like this: - +![][img-5] ### How to turn it on @@ -141,7 +141,7 @@ find your key. status from key server`. 3. Restart GpgFrontend to apply the change. - +![][img-6] ### Notes @@ -156,3 +156,11 @@ status from key server`. - Always check a key before you trust it. - Keep your keys clean: revoke and update them if they are stolen. - Never upload a private key to any server. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/3660f65893c4e79954486f1b3cfb5cb6b09a13d0.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/0dc8821cc3c83c7bb3266f3a1059ce59fabc4a8f.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/4efe7862bc47b95387a8ee247d4b767dbbfa36b6.webp +[keys-openpgp]: https://keys.openpgp.org +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/34505c6435d485dc2f8ce680a8c8f630fbb18b2a.webp +[img-5]: https://image.cdn.bktus.com/i/2025/06/24/e52d18a85267987f8202ba6ede39068b3c6e140b.webp +[img-6]: https://image.cdn.bktus.com/i/2025/06/24/b2daf0876b29278e703f4721f7f68c22ffa1752b.webp diff --git a/src/content/docs/guides/openpgp-trust-manage.md b/src/content/docs/guides/openpgp-trust-manage.md index 88673e3..e29089e 100644 --- a/src/content/docs/guides/openpgp-trust-manage.md +++ b/src/content/docs/guides/openpgp-trust-manage.md @@ -37,7 +37,7 @@ Owner Trust is **not** about whether the key itself is real. It is about how muc you trust the owner to vouch for others. This is what lets you build your own Web of Trust without depending on a central authority. - +![][img-1] The trust levels are: @@ -60,7 +60,7 @@ constant updates from key servers. A window opens where you pick the level (Unknown, None, Marginal, Full, or Ultimate). - +![][img-2] :::tip[Several keys at once] @@ -120,7 +120,7 @@ so. When GpgFrontend was first designed, sending these signatures to key servers was not fully planned for. - +![][img-3] ### What happens now @@ -166,3 +166,7 @@ users want it. - A clear warning about key bloat when uploading third-party signatures. - Support for organization trust models, such as CA-based signing and certificates. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/38399d86fb330ca20eab85c33c03331797d32679.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/4b7624b599a5f310d059843c872cf81e6b089ba4.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/d974152f4b2b850d228408b99d37ea487a3cf914.webp diff --git a/src/content/docs/guides/post-quantum.md b/src/content/docs/guides/post-quantum.md index e25d161..eb1d12e 100644 --- a/src/content/docs/guides/post-quantum.md +++ b/src/content/docs/guides/post-quantum.md @@ -115,4 +115,6 @@ key (such as Ed25519) alongside your post-quantum experiments. ## Further Reading - [Comparison of Cryptographic Algorithms](/extra/algorithms-comparison/) -- [NIST Post-Quantum Cryptography](https://csrc.nist.gov/projects/post-quantum-cryptography) +- [NIST Post-Quantum Cryptography][nist-pqc] + +[nist-pqc]: https://csrc.nist.gov/projects/post-quantum-cryptography diff --git a/src/content/docs/guides/symmetric-encrypt-decrypt.mdx b/src/content/docs/guides/symmetric-encrypt-decrypt.mdx index 9f6cb91..c564e70 100644 --- a/src/content/docs/guides/symmetric-encrypt-decrypt.mdx +++ b/src/content/docs/guides/symmetric-encrypt-decrypt.mdx @@ -41,14 +41,14 @@ To encrypt text using symmetric encryption in GpgFrontend (v2.1.9 and later): 1. Open **Settings** and choose **Appearance**. 2. Under **Toolbar**, in the **Actions** list, tick `Sym. Encrypt`. - +![][img-1] ### Access the Symmetric Encryption Button After enabling, you'll see a dedicated `Sym. Encrypt` button on the main interface. - +![][img-2] ### Enter the Text or Select a File @@ -63,7 +63,7 @@ interface. 4. The text or file will be encrypted into ciphertext. 5. You can save or share the encrypted result. - +![][img-3] > The recipient will need the **exact same password** to decrypt the message. @@ -147,3 +147,7 @@ exchange is difficult. - Consider using symmetric encryption as a supplement to public-key encryption e.g., encrypt a file symmetrically, then encrypt the password with the recipient's public key. + +[img-1]: https://image.cdn.bktus.com/i/2025/07/06/aa24d040771ba182e78b503cf5e0a6f9f4ffc8c5.webp +[img-2]: https://image.cdn.bktus.com/i/2025/07/06/9b9dfde1a024c9637133035a581e0431e1147597.webp +[img-3]: https://image.cdn.bktus.com/i/2025/07/06/89cdd2950b51695afd23ff85f666177f95861292.gif diff --git a/src/content/docs/guides/text-operations.md b/src/content/docs/guides/text-operations.md index 6446373..d396b07 100644 --- a/src/content/docs/guides/text-operations.md +++ b/src/content/docs/guides/text-operations.md @@ -9,7 +9,7 @@ GpgFrontend lets you do four things with text: **encrypt** it (hide it), **decrypt** it (read it), **sign** it (prove it came from you), and **verify** a signature (check it really did). This page walks through each one. - +![][img-1] ## Before You Start @@ -42,7 +42,7 @@ the recipient's public key, or only you will be able to read it. ::: - +![][img-2] ### If You Are Asked to Pick a Subkey @@ -69,7 +69,7 @@ GpgFrontend. The tool then: You don't need to choose a key by hand. GpgFrontend matches it for you. - +![][img-3] ## Sign Text @@ -82,7 +82,7 @@ readable; signing adds proof, not secrecy. Before you sign, look at the key's `Usage` column for an `S`, which means the key can sign. - +![][img-4] ## Verify a Signature @@ -99,7 +99,7 @@ first. ::: - +![][img-5] ## Safety Tips @@ -109,3 +109,9 @@ first. proven. - **Sign only** (no encryption) for public documents that need to be trusted but not hidden. + +[img-1]: https://image.cdn.bktus.com/i/2026/06/30/8a3b4ad29fce3f6969e8cdb2a10f9efcb06f7ba0.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/19483c04524fd94afff85cac502a1030bdb4c477.gif +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/5e16d1a75fb7e7bfb4d14f7fadd57144494b131c.gif +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/8c6db160d26f94e75138134d319c29bd2c3736b7.gif +[img-5]: https://image.cdn.bktus.com/i/2025/06/24/6ccba3133341e6e6ea095a2dc00bf23c63ed8f56.gif diff --git a/src/content/docs/guides/understand-interface.mdx b/src/content/docs/guides/understand-interface.mdx index c92e41e..7f336bf 100644 --- a/src/content/docs/guides/understand-interface.mdx +++ b/src/content/docs/guides/understand-interface.mdx @@ -12,13 +12,13 @@ around and do your tasks with ease. <Tabs> <TabItem label="Windows"> -  + ![][img-1] </TabItem> <TabItem label="macOS"> -  + ![][img-2] </TabItem> <TabItem label="Linux"> -  + ![][img-3] </TabItem> </Tabs> @@ -233,3 +233,7 @@ you are working with. Click any of them for more details. it to see which key database you are in. - **Mode**: whether this is an installed copy or a portable one. See [Portable Mode](/advanced/portable-mode/). + +[img-1]: https://image.cdn.bktus.com/i/2026/06/29/d1db291bcdcb3d324f63ebefb79ddef88a74217f.webp +[img-2]: https://image.cdn.bktus.com/i/2026/06/29/d4edebb69dfc39c8bb7115cc8a6da00cecef096d.webp +[img-3]: https://image.cdn.bktus.com/i/2026/06/29/0846ffe84e7d4879c129676caf09b60c1f2cfdcb.webp diff --git a/src/content/docs/guides/view-keypair-info.md b/src/content/docs/guides/view-keypair-info.md index 1c43e9b..829af95 100644 --- a/src/content/docs/guides/view-keypair-info.md +++ b/src/content/docs/guides/view-keypair-info.md @@ -12,7 +12,7 @@ primary key and subkeys, the signatures on it, and the actions you can take. To open it, right-click a key in the **Key Toolbox** or the **Key Management** window and choose **Show Key Details**. Double-clicking a key also opens this window. - +![][img-1] ## General Info @@ -24,7 +24,7 @@ Who the key belongs to. This isn't fixed: you can change it by creating a new UI in the UID section and setting it as the primary UID. OpenPGP splits this into **Name**, **Email**, and **Comment**. - +![][img-2] ### Primary Key @@ -36,7 +36,7 @@ A "missing" primary key means the _private part_ of the primary key is absent, n that the whole key is gone. Remember: the primary key and every subkey is itself a pair of a public and a private key. - +![][img-3] #### Key ID @@ -55,7 +55,7 @@ security with shorter keys. Shows the key type and length together, and is sometimes more exact than the Algorithm field, naming the specific method such as ED25519 or NISTP256. - +![][img-4] #### Key Size @@ -119,7 +119,7 @@ or subkeys) or use it to sign other keys. ### Fingerprint - +![][img-5] The fingerprint is a unique code people use to quickly check that a key is the one they expect. It is unique for every key in the world. (You can also compare the @@ -132,7 +132,7 @@ keyring. It gives you a rough idea whether a key is the one you expect, but for sure identification you should compare fingerprints or key IDs. A key can have several UIDs, but only one **primary UID**, which is always shown first. - +![View Key Pair Details UID][img-6] Each UID has three parts: **Name**, **Email**, and **Comment**. The name should be at least five characters and the email must be a valid format; comments are @@ -146,7 +146,7 @@ receives your public key, they can sign your UID with their key to vouch for it, then share the signed key on a key server. The more people who do this, the more trustworthy the key looks. - +![][img-7] You can also sign a UID with the primary key of another key pair. A primary UID with many valid signatures is generally seen as more trustworthy. @@ -176,7 +176,7 @@ can feel complex at first, so here are the basics: The Key Details window lists the primary key and all subkeys with their properties (algorithm, size, usage, and so on), so you can manage them at a glance. - +![][img-8] ### Key on a Smart Card @@ -222,7 +222,7 @@ private key too. These are the actions available for a public key. - +![][img-9] #### Export Public Key @@ -254,7 +254,7 @@ hidden. When the key pair includes a private key, you get more actions, covering both the public and private parts. - +![][img-10] #### Export Public Key @@ -290,3 +290,14 @@ A dropdown to create a revocation certificate for the key, or import an existing one. Revoke a key if it is compromised or no longer needed: this marks it invalid so it can't be misused. The revocation is usually uploaded to a key server so others learn the key is revoked. + +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/707eab9708c7cf9af472a5e05295d132d831f223.webp +[img-2]: https://image.cdn.bktus.com/i/2025/06/24/a648820ee997bce65d3b65ebb7c3056b37e1597d.webp +[img-3]: https://image.cdn.bktus.com/i/2025/06/24/8b3235e625749d20effc4a7f334e7dacd2688923.webp +[img-4]: https://image.cdn.bktus.com/i/2025/06/24/1a4c3220e4952de2ba8bbdfc01a42d48dce6337c.webp +[img-5]: https://image.cdn.bktus.com/i/2025/06/24/bc688aa06bc3db294001b429018e5a79e888be44.webp +[img-6]: https://image.cdn.bktus.com/i/2025/06/24/6ba422bf970ce94533b798e9ebb24e2465f3d45e.webp +[img-7]: https://image.cdn.bktus.com/i/2025/06/24/c79c00d20a087f7a123fbbbf65bd1fd5e7c22bee.webp +[img-8]: https://image.cdn.bktus.com/i/2025/06/24/3b87a8d639d8be4cf99d6fc4fc1b5d8c4168be3d.webp +[img-9]: https://image.cdn.bktus.com/i/2025/06/24/56b96c1420da618873ca707c6e7da4ab6e1d7a25.webp +[img-10]: https://image.cdn.bktus.com/i/2025/06/24/55ac60792266c3e13254b53a47fe468cdba93048.webp diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index bb4f3df..07a08cd 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -60,7 +60,7 @@ import { Card, CardGrid, LinkCard } from "@astrojs/starlight/components"; ## See GpgFrontend in Action - +![GpgFrontend main interface][img-1] A clean, focused workspace: no flashy graphics, no clutter. Just the most direct path to encrypting, signing, and managing your keys. @@ -127,3 +127,5 @@ Already know OpenPGP? Jump straight to what makes GpgFrontend different: href="/advanced/portable-mode/" /> </CardGrid> + +[img-1]: https://image.cdn.bktus.com/i/2026/08/15/ec781bf865562ef749aa4b19a9151dc32b6f702c.webp diff --git a/src/content/docs/overview/contact.md b/src/content/docs/overview/contact.md index 1fc5fce..14a85cb 100644 --- a/src/content/docs/overview/contact.md +++ b/src/content/docs/overview/contact.md @@ -11,15 +11,19 @@ I'd like to hear it. ## How to Reach Me -- **Email:** [[email protected]](mailto:[email protected]) +- **Email:** [[email protected]][eric] - **Languages:** English, Chinese, or German - **Format:** Please send plain text, not HTML. For my OpenPGP public key, reply times, and other details, see -[bktus.com/contact](https://bktus.com/contact/). +[bktus.com/contact][bktus-contact]. ## Bugs and Feature Requests For anything about the software itself, an issue on the -[GitHub repository](https://github.com/saturneric/GpgFrontend/issues) is often +[GitHub repository][github-issues] is often faster than email, since it keeps the discussion in one place. + +[eric]: mailto:[email protected] +[bktus-contact]: https://bktus.com/contact/ +[github-issues]: https://github.com/saturneric/GpgFrontend/issues diff --git a/src/content/docs/overview/downloads.mdx b/src/content/docs/overview/downloads.mdx index 3f33a59..47a380b 100644 --- a/src/content/docs/overview/downloads.mdx +++ b/src/content/docs/overview/downloads.mdx @@ -24,9 +24,9 @@ almost everyone. Other options, for special cases only: -- [**Older Version (v2.1.x)**](https://github.com/saturneric/GpgFrontend/releases/tag/v2.1.12): only if you specifically need the GnuPG-only build. -- [**Nightly Builds**](https://github.com/saturneric/GpgFrontend/releases/nightly): early test builds for testers and contributors, not for everyday use. -- [**Mirror Site**](https://ftp.bktus.com/GpgFrontend/): the same files from another source, with no tracking or sign-in. +- [**Older Version (v2.1.x)**][github-v2-1-x]: only if you specifically need the GnuPG-only build. +- [**Nightly Builds**][github-nightly]: early test builds for testers and contributors, not for everyday use. +- [**Mirror Site**][ftp-gpgfrontend]: the same files from another source, with no tracking or sign-in. ### Installed or Portable? @@ -60,7 +60,7 @@ Use this table to find the right file for your system. <Aside type="note" title="Qt5 builds moved to the Mirror Site"> Starting with **v2.2.1**, the Qt5 (`-qt5-`) builds are no longer on the GitHub releases page. They now live only on the [Mirror - Site](https://ftp.bktus.com/GpgFrontend/). These builds are for older systems + Site][ftp-gpgfrontend]. These builds are for older systems only. If your system is current, use the standard build instead. </Aside> @@ -121,3 +121,7 @@ Pick your platform below: </CardGrid> </TabItem> </Tabs> + +[github-v2-1-x]: https://github.com/saturneric/GpgFrontend/releases/tag/v2.1.12 +[github-nightly]: https://github.com/saturneric/GpgFrontend/releases/nightly +[ftp-gpgfrontend]: https://ftp.bktus.com/GpgFrontend/ diff --git a/src/content/docs/overview/faq.mdx b/src/content/docs/overview/faq.mdx index 64ffae9..e4e47b8 100644 --- a/src/content/docs/overview/faq.mdx +++ b/src/content/docs/overview/faq.mdx @@ -48,7 +48,7 @@ yourself; see the [Version Numbering Policy](/appendix/version-policy/). <summary>How do OpenPGP, PGP, and GnuPG (GPG) relate?</summary> - **OpenPGP** is the open standard ([RFC - 4880](https://www.rfc-editor.org/rfc/rfc4880)) for encrypted email, files, and + 4880][rfc4880]) for encrypted email, files, and digital signatures. - **PGP** was the original closed-source software from the 1990s. It is rarely used today, but the name is sometimes used loosely to mean the OpenPGP @@ -158,7 +158,7 @@ encryption, decryption, signing, verification, and local key management. The sandbox-related challenges around bundling and integrating GnuPG in a movable macOS App Bundle have been discussed in the GnuPG development community. -See also: [GnuPG and macOS App Sandbox](https://lists.gnupg.org/pipermail/gnupg-devel/2022-May/035065.html) +See also: [GnuPG and macOS App Sandbox][gnupg-sandbox-mail] </Aside> @@ -247,7 +247,7 @@ use. <summary>Has GnuPG ever been successfully attacked?</summary> According to the official [GnuPG FAQ -11.8](https://gnupg.org/faq/gnupg-faq.html#successful_attacks): +11.8][gnupg-faq]: > "If you mean, "has GnuPG traffic ever been successfully cryptanalyzed?", the > answer is a flat "no". We are unaware of any credible reports of any of the @@ -325,7 +325,7 @@ GnuPG-specific features, please install GnuPG: - **Linux:** Install GnuPG via your package manager, for example `sudo apt install gpg` or `sudo dnf install gnupg`. - **Windows:** Recent regular desktop builds include GnuPG. If needed, you can - also download GnuPG from the [official GnuPG website](https://www.gnupg.org/download/). + also download GnuPG from the [official GnuPG website][gnupg-download]. </details> @@ -563,3 +563,8 @@ started, and the [AI Policy](/appendix/ai-policy/#if-you-contribute) if you use AI tools in your work. </details> + +[rfc4880]: https://www.rfc-editor.org/rfc/rfc4880 +[gnupg-sandbox-mail]: https://lists.gnupg.org/pipermail/gnupg-devel/2022-May/035065.html +[gnupg-faq]: https://gnupg.org/faq/gnupg-faq.html#successful_attacks +[gnupg-download]: https://www.gnupg.org/download/ diff --git a/src/content/docs/overview/getting-started.mdx b/src/content/docs/overview/getting-started.mdx index dcbfb7d..f98924a 100644 --- a/src/content/docs/overview/getting-started.mdx +++ b/src/content/docs/overview/getting-started.mdx @@ -39,7 +39,7 @@ Pick your operating system to see the recommended steps. For other methods <TabItem label="Windows"> ### Installer (Recommended) <Steps> - 1. **Download** the `.msix` installer from [GitHub Releases](https://github.com/saturneric/GpgFrontend/releases/latest). + 1. **Download** the `.msix` installer from [GitHub Releases][github-latest]. 2. **Launch** the file and follow the on-screen prompts. 3. **Open** GpgFrontend from your Start Menu. </Steps> @@ -56,9 +56,9 @@ Pick your operating system to see the recommended steps. For other methods <TabItem label="macOS"> <Steps> 1. **Install GnuPG** via Homebrew: `brew install gnupg`. - 2. **Download** the `.dmg` file from [GitHub Releases](https://github.com/saturneric/GpgFrontend/releases/latest). + 2. **Download** the `.dmg` file from [GitHub Releases][github-latest]. 3. **Mount** the DMG and drag **GpgFrontend** to your **Applications** folder. -  + ![Drag to Applications][img-1] </Steps> @@ -69,7 +69,7 @@ Pick your operating system to see the recommended steps. For other methods 1. **Verify GnuPG**: Ensure `gpg` is installed (`sudo apt install gpg` or `sudo dnf install gnupg`). 2. **Download** the `.AppImage` from [GitHub - Releases](https://github.com/saturneric/GpgFrontend/releases/latest). + Releases][github-latest]. 3. **Set Permissions**: Run `chmod u+x ./GpgFrontend-xxx.AppImage`. 4. **Launch**: Double-click the file or run it via terminal. @@ -77,7 +77,7 @@ Pick your operating system to see the recommended steps. For other methods </TabItem> <TabItem label="BSD"> - Currently, GpgFrontend must be **compiled from source** on BSD systems. Please refer to our [Build Instructions](https://github.com/saturneric/GpgFrontend) on GitHub for a step-by-step guide. + Currently, GpgFrontend must be **compiled from source** on BSD systems. Please refer to our [Build Instructions][github-gpgfrontend] on GitHub for a step-by-step guide. </TabItem> </Tabs> @@ -123,3 +123,7 @@ If you need more than one setup on the same computer, that is what :::tip[Pro Tip] Need to understand the layout? Check the [Interface Understanding](/guides/understand-interface/) guide to familiarize yourself with the workspace. ::: + +[github-latest]: https://github.com/saturneric/GpgFrontend/releases/latest +[img-1]: https://image.cdn.bktus.com/i/2025/06/24/03df3c64a965b9da96c82ddb38c35b74b1796ee0.webp +[github-gpgfrontend]: https://github.com/saturneric/GpgFrontend diff --git a/src/content/docs/overview/glance.mdx b/src/content/docs/overview/glance.mdx index f154794..076bbab 100644 --- a/src/content/docs/overview/glance.mdx +++ b/src/content/docs/overview/glance.mdx @@ -29,18 +29,18 @@ proven **GnuPG** and a modern, memory-safe Rust **rPGP** backend. Everything run - **Memory-safe**: sensitive data is guarded in secure memory while in use. - **Private**: everything runs locally, with no telemetry or tracking. -> If you like GpgFrontend, you can give it a ⭐ on [GitHub](https://github.com/saturneric/GpgFrontend) as a donation. :) +> If you like GpgFrontend, you can give it a ⭐ on [GitHub][github-gpgfrontend] as a donation. :) ## Where It Came From GpgFrontend is inspired by, and shares the core ideas of, the stable, portable, -cross-platform **[gpg4usb](https://git.bktus.com/gpgfrontend/gpg4usb/)** project. +cross-platform **[gpg4usb][git-gpg4usb]** project. Keeping that spirit of true portability, it builds on that foundation to add advanced features, modern cryptographic standards, and a clean, easy-to-use experience. As told in the article _["The Past and Present of GpgFrontend: My Journey with an -Open-Source Encryption Tool"](https://blog.bktus.com/en/archives/u8hywl/)_, the +Open-Source Encryption Tool"][blog-history]_, the project grew from a simple wish: > "What if everyone could have a small, reliable, and secure 'crypto machine'?" @@ -55,5 +55,10 @@ GpgFrontend is licensed under **GPL-3.0** and built by a worldwide community. Ev line of code is open to inspect, and contributions, from issue reports to code patches, are warmly welcome. -- [Application source code](https://github.com/saturneric/GpgFrontend) -- [User manual source code](https://github.com/saturneric/GpgFrontend-Manual) +- [Application source code][github-gpgfrontend] +- [User manual source code][github-gpgfrontend-manual] + +[github-gpgfrontend]: https://github.com/saturneric/GpgFrontend +[git-gpg4usb]: https://git.bktus.com/gpgfrontend/gpg4usb/ +[blog-history]: https://blog.bktus.com/en/archives/u8hywl/ +[github-gpgfrontend-manual]: https://github.com/saturneric/GpgFrontend-Manual |
