diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index de71b2b..245ab68 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ You can add, edit or remove entries by opening a pull request. All data is stored in [`awesome-privacy.yml`](https://github.com/Lissy93/awesome-privacy/blob/main/awesome-privacy.yml). -If you're adding, editing or removing a listing - **this is the only file you need to edit**. +If you're adding, editing or removing a listing - **this is the only file you need to edit**. Don't edit the README directly, as this is auto-generated from the YAML file. ### Process @@ -62,6 +62,10 @@ For software to be included in this list, it must meet the following requirement - A stable (non-alpha/beta) release is required at a minimum - Must be accessible to the general public, and not just a select group of people - If technical knowledge is required to run it, the software must be well documented +- **Mature** + - Software needs to have a proven track record of commitment to maintenance + - Repositories must not be newly created, and the first stable release older than 4 months + - Projects primarily written with AI or vibe coded are not suitable for listing here _There may be some exceptions, but these would need to be fully justified, reviewed by the community, and the drawbacks / anti-features must be clearly listed along-side the software. @@ -74,25 +78,23 @@ Usually these entries go within the "Notable Mentions" section instead._ Your pull request must follow these requirements. Failure to do so, might result in it being closed. -- Do not edit the README directly when adding / editing a listing +- Do not edit the README directly when adding / editing a listing (it's auto-generated!) - Ensure your PR is not a duplicate, search for existing / previous submissions first -- You must respond to any comments or requests for changes in a timely manner, 48-hours maximum +- You must respond to any comments or requests for changes in a timely manner, 14 days maximum - Write short but descriptive git commit messages, under 50 characters. This must be in the format of `Adds [software-name] to [section-name]`. Your PR will be rejected if you name it `Updates README.md` - Only include a single addition / amendment / removal, per pull request -- If your pull request contains multiple commits, you must squash them first -- You must complete each of the sections in the pull request template. Do not delete it! +- You must complete each of the sections in the [pull request template](https://github.com/Lissy93/awesome-privacy/blob/main/.github/PULL_REQUEST_TEMPLATE.md). Do not delete it! - Where applicable, include links to supporting material for your addition: git repo, docs, recent security audits, etc. This will make researching it much easier for reviewers - While adding new software to the list, don't make your entry read like an advert. Be objective, and include drawbacks as well as strengths - Your entry should be added at the bottom of the appropriate category, unless otherwise requested -- If there are other pull requests open, please help review them before submitting yours -- A pull request must receive multiple approval reviews before it can be merged - You must be transparent about your affiliation with a product or service that you are adding. It's totally okay to submit your own projects as additions (providing they meet the requirements), but if you don't declare your association with that project then there becomes a clear conflict of interest -- You must adhere to the Contributor Covenant Code of Conduct +- You must adhere to the [Contributor Covenant Code of Conduct](https://github.com/Lissy93/awesome-privacy?tab=coc-ov-file#contributor-covenant-code-of-conduct) - Don't open a Draft / WIP pull request while you work on the guidelines. A pull request should be 100% ready and should adhere to all the above guidelines when you open it - Your changes must be correctly spelled, and with good grammar -- Your changes must be correctly formatted, in valid markdown -- The addition title must be a link the project, and in bold +- Your changes must be correctly formatted, in valid yaml and markdown - The addition description must be no less than 50, and no more than 250 characters, keep it clear and to the point +- If there are other pull requests open, please help review them before submitting yours +- A pull request must receive multiple approval reviews before it can be merged --- @@ -103,8 +105,6 @@ This file may look a bit daunting to start with, but don't worry - it's pretty s ### Top-Level Structure - - ```mermaid --- title: Class Diagram diff --git a/.github/README.md b/.github/README.md index b986cc9..6cbc235 100644 --- a/.github/README.md +++ b/.github/README.md @@ -22,10 +22,10 @@ corporations, governments, and hackers from logging, storing or selling your per - **Essentials** - [Password Managers](#password-managers) (6) - - [2-Factor Authentication](#2-factor-authentication) (9) + - [2-Factor Authentication](#2-factor-authentication) (11) - [File Encryption](#file-encryption) (4) - [Browsers](#browsers) (5) - - [Search Engines](#search-engines) (5) + - [Search Engines](#search-engines) (6) - **Communication** - [Encrypted Messaging](#encrypted-messaging) (5) - [P2P Messaging](#p2p-messaging) (5) @@ -60,7 +60,7 @@ corporations, governments, and hackers from logging, storing or selling your per - **Productivity** - [Digital Notes](#digital-notes) (8) - [Calendar](#calendar) (0) - - [Backup and Sync](#backup-and-sync) (3) + - [Backup and Sync](#backup-and-sync) (4) - [Cloud Productivity Suites](#cloud-productivity-suites) (5) - [Encrypted Cloud Storage](#encrypted-cloud-storage) (7) - [File Drop](#file-drop) (2) @@ -107,7 +107,7 @@ corporations, governments, and hackers from logging, storing or selling your per - [E-Book Readers](#e-book-readers) (0) - [Podcast Players](#podcast-players) (0) - [Torrent Downloaders](#torrent-downloaders) (0) - - [File Converters](#file-converters) (0) + - [File Converters](#file-converters) (1) - **Creativity** - [Image Editors](#image-editors) (8) - [Video Editors](#video-editors) (7) @@ -125,68 +125,66 @@ corporations, governments, and hackers from logging, storing or selling your per - **[icon Bitwarden](https://bitwarden.com)** - Fully-featured, open source password manager with cloud-sync. Bitwarden is easy-to-use with a clean UI and client apps for desktop, web and mobile. See also [Vaultwarden](https://github.com/dani-garcia/vaultwarden), a self-hosted, -Rust implementation of the Bitwarden server and compatible with [upstream -Bitwarden clients](https://bitwarden.com/download/). -[…](https://awesome-privacy.xyz/essentials/password-managers/bitwarden "View full Bitwarden report") +Rust implementa[…](https://awesome-privacy.xyz/essentials/password-managers/bitwarden "View full Bitwarden report") -
Stats - [![GitHub: bitwarden/server](https://img.shields.io/github/stars/bitwarden/server?style=flat&logo=github&label=server&color=%235f53f4&cacheSeconds=3600)](https://github.com/bitwarden/server) [![Privacy Policy](https://shields.tosdr.org/en_1348.svg)](https://tosdr.org/en/service/1348) [![Bitwarden on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bitwarden)](https://awesome-privacy.xyz/essentials/password-managers/bitwarden) -˙ + [![GitHub: bitwarden/server](https://img.shields.io/github/stars/bitwarden/server?style=flat&logo=github&label=server&color=%235f53f4&cacheSeconds=3600)](https://github.com/bitwarden/server) [![Privacy Policy](https://shields.tosdr.org/en_1348.svg)](https://tosdr.org/en/service/1348) [![Bitwarden on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bitwarden)](https://awesome-privacy.xyz/essentials/password-managers/bitwarden) [![Bitwarden on Google Play](https://img.shields.io/badge/-Bitwarden-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.x8bit.bitwarden) [![Bitwarden on App Store](https://img.shields.io/badge/-Bitwarden-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/bitwarden-password-manager/id1137397744) [![r/Bitwarden on Reddit](https://img.shields.io/badge/-Bitwarden-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Bitwarden)ㅤ
- **[icon KeePass](https://keepass.info)** - Hardened, secure and offline password manager. Does not have cloud-sync baked in, deemed to be [gold standard](https://keepass.info/ratings.html) for secure password managers. KeePass clients: [Strongbox](https://apps.apple.com/us/app/strongbox-keepass-pwsafe/id897283731) *(Mac & iOS)*, [KeePassDX](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free) -*(Android)*, [KeeWeb](https://keeweb.info) *(Web-based/ self-hosted)*, -[KeePassXC](https://keepassxc.org) *(Windows, Mac & Linux)*, see more KeePass -clients and extensions at [awesome-keepass](https://github.com/lgg/awesome-keepass) -by @lgg. -[…](https://awesome-privacy.xyz/essentials/password-managers/keepass "View full KeePass report") -- **[icon LessPass](https://lesspass.com)** - LessPass is a little different, since it generates your passwords using a hash -of the website name, your username and a single main-passphrase that you reuse. -It omits the need for you to ever need to store or sync your passwords. They -have apps for all the common platforms and a CLI, but you can also self-host it. -[…](https://awesome-privacy.xyz/essentials/password-managers/lesspass "View full LessPass report") +*(Android)*,[…](https://awesome-privacy.xyz/essentials/password-managers/keepass "View full KeePass report") -
Stats - [![GitHub: lesspass/lesspass](https://img.shields.io/github/stars/lesspass/lesspass?style=flat&logo=github&label=lesspass&color=%235f53f4&cacheSeconds=3600)](https://github.com/lesspass/lesspass) [![LessPass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LessPass)](https://awesome-privacy.xyz/essentials/password-managers/lesspass) -˙ + [![KeePass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=KeePass)](https://awesome-privacy.xyz/essentials/password-managers/keepass) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://keepass.info) [![r/KeePass on Reddit](https://img.shields.io/badge/-KeePass-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/KeePass)ㅤ + +
+- **[icon LessPass](https://lesspass.com)** - LessPass is a little different, since it generates your passwords using a hash +of the website name, your username and a single main-passphrase that you reuse. +It omits the need for you to ever need to[…](https://awesome-privacy.xyz/essentials/password-managers/lesspass "View full LessPass report") + -
+ Stats + + [![GitHub: lesspass/lesspass](https://img.shields.io/github/stars/lesspass/lesspass?style=flat&logo=github&label=lesspass&color=%235f53f4&cacheSeconds=3600)](https://github.com/lesspass/lesspass) [![LessPass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LessPass)](https://awesome-privacy.xyz/essentials/password-managers/lesspass)ㅤ
- **[icon Padloc](https://padloc.app)** - A modern, open source password manager for individuals and teams. Beautiful, intuitive and dead simple to use. Apps available for all platforms and you can self-host it as well. -[…](https://awesome-privacy.xyz/essentials/password-managers/padloc "View full Padloc report") + -
Stats - [![GitHub: padloc/padloc](https://img.shields.io/github/stars/padloc/padloc?style=flat&logo=github&label=padloc&color=%235f53f4&cacheSeconds=3600)](https://github.com/padloc/padloc) [![Padloc on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Padloc)](https://awesome-privacy.xyz/essentials/password-managers/padloc) -˙ + [![GitHub: padloc/padloc](https://img.shields.io/github/stars/padloc/padloc?style=flat&logo=github&label=padloc&color=%235f53f4&cacheSeconds=3600)](https://github.com/padloc/padloc) [![Padloc on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Padloc)](https://awesome-privacy.xyz/essentials/password-managers/padloc) [![Padloc on Google Play](https://img.shields.io/badge/-Padloc-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=app.padloc) [![Padloc on App Store](https://img.shields.io/badge/-Padloc-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/padloc/id1478877043)ㅤ
- **[icon ProtonPass](https://proton.me/pass)** - From the creators of ProtonMail, ProtonPass is a new addition to their suite of services. They have a full collection of user-friendly native mobile and desktop -apps. ProtonPass is one of the few "trustworthy" providers that also offers a -free plan. -[…](https://awesome-privacy.xyz/essentials/password-managers/protonpass "View full ProtonPass report") +apps. ProtonPass is one of the few "tru[…](https://awesome-privacy.xyz/essentials/password-managers/protonpass "View full ProtonPass report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonPass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonPass)](https://awesome-privacy.xyz/essentials/password-managers/protonpass) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonPass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonPass)](https://awesome-privacy.xyz/essentials/password-managers/protonpass) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://proton.me/pass) [![ProtonPass on Google Play](https://img.shields.io/badge/-ProtonPass-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=proton.android.pass) [![ProtonPass on App Store](https://img.shields.io/badge/-ProtonPass-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/proton-pass-password-manager/id6443490629) [![r/ProtonPass on Reddit](https://img.shields.io/badge/-ProtonPass-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/ProtonPass)ㅤ + +
+- **[icon Pass](https://www.passwordstore.org/)** - The Standard Unix Password Manager + -
+ Stats + + [![Pass on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pass)](https://awesome-privacy.xyz/essentials/password-managers/pass) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.passwordstore.org/)ㅤ
-- **[icon Pass](https://www.passwordstore.org/)** - The Standard Unix Password Manager[…](https://awesome-privacy.xyz/essentials/password-managers/pass "View full Pass report")
✳️ Notable Mentions > - [Password Safe](https://www.pwsafe.org) - An offline, open source password manager designed by [Bruce Schneier](https://www.schneier.com/academic/passsafe/), with native applications for Windows, Linux, MacOS, Android and iOS, and support for YubiKey. The UI is a little dated, and there is no official browser extension, making is slightly less convenient to use compared with other options > - [PassBolt](https://www.passbolt.com) - A good option for teams. It is free, open source, self-hosted, extensible and OpenPGP based. It is specifically good for development and DevOps usage, with integrations for the terminal, browser and chat, and can be easily extended for custom usage, and deployed quickly with Docker -> - [1Password](https://1password.com) - (proprietary) A fully-featured cross-platform password manager with sync. Free for self-hosted data (or $3/ month hosted). Be aware that 1Password is not fully open source, but they do regularly publish results of their independent [security audits](https://support.1password.com/security-assessments), and they have a solid reputation for transparently disclosing and fixing vulnerabilities +> - [1Password](https://1password.com) - (proprietary) A fully-featured cross-platform password manager with sync. Free for self-hosted data (or $3/ month hosted). Be aware that 1Password is not fully open source, but they do regularly publish results of their independent [security audits](https://support.1password.com/security-assessments), and they have a solid reputation for transparently disclosing and fixing vulnerabilities
@@ -203,91 +201,102 @@ free plan. - **[icon 2FAS](https://2fas.com/)** - Free, secure and open source authenticator app for both iOS and Android. Supports creating encrypted backups and syncing between devices without the need for an account. -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/2fas "View full 2FAS report") + -
Stats - [![GitHub: twofas/2fas-server](https://img.shields.io/github/stars/twofas/2fas-server?style=flat&logo=github&label=2fas-server&color=%235f53f4&cacheSeconds=3600)](https://github.com/twofas/2fas-server) [![Privacy Policy](https://shields.tosdr.org/en_8201.svg)](https://tosdr.org/en/service/8201) [![2FAS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=2FAS)](https://awesome-privacy.xyz/essentials/2-factor-authentication/2fas) -˙ + [![GitHub: twofas/2fas-server](https://img.shields.io/github/stars/twofas/2fas-server?style=flat&logo=github&label=2fas-server&color=%235f53f4&cacheSeconds=3600)](https://github.com/twofas/2fas-server) [![Privacy Policy](https://shields.tosdr.org/en_8201.svg)](https://tosdr.org/en/service/8201) [![2FAS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=2FAS)](https://awesome-privacy.xyz/essentials/2-factor-authentication/2fas) [![2FAS on Google Play](https://img.shields.io/badge/-2FAS-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.twofasapp) [![2FAS on App Store](https://img.shields.io/badge/-2FAS-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/2fa-authenticator-2fas/id1217793794) [![2FAS on Discord](https://img.shields.io/badge/-2FAS-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/q4cP6qh2g5)ㅤ
- **[icon Aegis](https://getaegis.app)** - Free, secure and open source authenticator app for Android. Has a backup/ restore feature and a customisable UI with dark mode -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/aegis "View full Aegis report") + -
Stats - [![GitHub: beemdevelopment/Aegis](https://img.shields.io/github/stars/beemdevelopment/Aegis?style=flat&logo=github&label=Aegis&color=%235f53f4&cacheSeconds=3600)](https://github.com/beemdevelopment/Aegis) [![Privacy Policy](https://shields.tosdr.org/en_4076.svg)](https://tosdr.org/en/service/4076) [![Aegis on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aegis)](https://awesome-privacy.xyz/essentials/2-factor-authentication/aegis) -˙ + [![GitHub: beemdevelopment/Aegis](https://img.shields.io/github/stars/beemdevelopment/Aegis?style=flat&logo=github&label=Aegis&color=%235f53f4&cacheSeconds=3600)](https://github.com/beemdevelopment/Aegis) [![Privacy Policy](https://shields.tosdr.org/en_4076.svg)](https://tosdr.org/en/service/4076) [![Aegis on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aegis)](https://awesome-privacy.xyz/essentials/2-factor-authentication/aegis) [![Aegis on Google Play](https://img.shields.io/badge/-Aegis-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis)ㅤ
- **[icon Stratum](https://stratumauth.com/)** - Free and open-source two factor authentication app for Android. It features encrypted backups, icons, categories and a high level of customisation. It also has a Wear OS companion app -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/stratum "View full Stratum report") + -
Stats - [![GitHub: stratumauth/app](https://img.shields.io/github/stars/stratumauth/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/stratumauth/app) [![Stratum on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stratum)](https://awesome-privacy.xyz/essentials/2-factor-authentication/stratum) -˙ + [![GitHub: stratumauth/app](https://img.shields.io/github/stars/stratumauth/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/stratumauth/app) [![Stratum on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stratum)](https://awesome-privacy.xyz/essentials/2-factor-authentication/stratum) [![Stratum on Google Play](https://img.shields.io/badge/-Stratum-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.stratumauth.app)ㅤ
- **[icon Tofu](https://www.tofuauth.com)** - An easy-to-use, open-source two-factor authentication app designed specifically for iOS -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/tofu "View full Tofu report") + -
Stats - [![GitHub: iKenndac/Tofu](https://img.shields.io/github/stars/iKenndac/Tofu?style=flat&logo=github&label=Tofu&color=%235f53f4&cacheSeconds=3600)](https://github.com/iKenndac/Tofu) [![Privacy Policy](https://shields.tosdr.org/en_5414.svg)](https://tosdr.org/en/service/5414) [![Tofu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tofu)](https://awesome-privacy.xyz/essentials/2-factor-authentication/tofu) -˙ + [![GitHub: iKenndac/Tofu](https://img.shields.io/github/stars/iKenndac/Tofu?style=flat&logo=github&label=Tofu&color=%235f53f4&cacheSeconds=3600)](https://github.com/iKenndac/Tofu) [![Privacy Policy](https://shields.tosdr.org/en_5414.svg)](https://tosdr.org/en/service/5414) [![Tofu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tofu)](https://awesome-privacy.xyz/essentials/2-factor-authentication/tofu) [![Tofu on App Store](https://img.shields.io/badge/-Tofu-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/tofu-authenticator/id1082229305)ㅤ
- **[icon Authenticator](https://mattrubin.me/authenticator)** - Simple, native, open source 2-FA Client for iOS, which never connects to the internet - built by @mattrubin.me -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator "View full Authenticator report") + -
Stats - [![GitHub: mattrubin/Authenticator](https://img.shields.io/github/stars/mattrubin/Authenticator?style=flat&logo=github&label=Authenticator&color=%235f53f4&cacheSeconds=3600)](https://github.com/mattrubin/Authenticator) [![Authenticator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Authenticator)](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator) -˙ + [![GitHub: mattrubin/Authenticator](https://img.shields.io/github/stars/mattrubin/Authenticator?style=flat&logo=github&label=Authenticator&color=%235f53f4&cacheSeconds=3600)](https://github.com/mattrubin/Authenticator) [![Authenticator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Authenticator)](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator) [![Authenticator on App Store](https://img.shields.io/badge/-Authenticator-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/authenticator/id766157276)ㅤ
- **[icon WinAuth](https://winauth.github.io/winauth)** - Portable, encrypted desktop authenticator app for Microsoft Windows. With useful features, like hotkeys and some additional security tools, WinAuth is a -great companion authenticator for desktop power-users. It's open source and -well-established (since mid-2010) -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/winauth "View full WinAuth report") +great companion authenticator for desktop power[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/winauth "View full WinAuth report") -
Stats - [![GitHub: winauth/winauth](https://img.shields.io/github/stars/winauth/winauth?style=flat&logo=github&label=winauth&color=%235f53f4&cacheSeconds=3600)](https://github.com/winauth/winauth) [![WinAuth on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WinAuth)](https://awesome-privacy.xyz/essentials/2-factor-authentication/winauth) -˙ + [![GitHub: winauth/winauth](https://img.shields.io/github/stars/winauth/winauth?style=flat&logo=github&label=winauth&color=%235f53f4&cacheSeconds=3600)](https://github.com/winauth/winauth) [![WinAuth on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WinAuth)](https://awesome-privacy.xyz/essentials/2-factor-authentication/winauth)ㅤ
- **[icon Authenticator GNOME](https://gitlab.gnome.org/World/Authenticator)** - Rust-based OTP authenticator. Has native With GNOME Shell integration. Also available through [flathub](https://flathub.org/apps/details/com.belmoussaoui.Authenticator). -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-gnome "View full Authenticator GNOME report") -- **[icon Authenticator CC](https://authenticator.cc)** - Authenticator Extension is an in-browser One-Time Password (OTP) client, -supports both Time-Based One-Time Password (TOTP, specified in [RFC 6238](https://tools.ietf.org/html/rfc6238)) -and HMAC-Based One-Time Password (HOTP, specified in [RFC 4226](https://tools.ietf.org/html/rfc4226)). -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-cc "View full Authenticator CC report") + -
Stats - [![GitHub: Authenticator-Extension/Authenticator](https://img.shields.io/github/stars/Authenticator-Extension/Authenticator?style=flat&logo=github&label=Authenticator&color=%235f53f4&cacheSeconds=3600)](https://github.com/Authenticator-Extension/Authenticator) [![Authenticator CC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Authenticator_CC)](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-cc) -˙ + [![Authenticator GNOME on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Authenticator_GNOME)](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-gnome) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://gitlab.gnome.org/World/Authenticator)ㅤ
-- **[icon Ente Auth](https://ente.io/auth/)** - Ente Auth is a free and open-source app which stores and generates TOTP tokens. -It can be used with an online account to backup and sync your tokens across your -devices (and access them via a web interface) in a secure, end-to-end encrypted -fashion. It can also be used offline on a single device with no account necessary. -[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/ente-auth "View full Ente Auth report") +- **[icon Authenticator CC](https://authenticator.cc)** - Authenticator Extension is an in-browser One-Time Password (OTP) client, +supports both Time-Based One-Time Password (TOTP, specified in [RFC 6238](https://tools.ietf.org/html/rfc6238)) +and HMAC-Based One-Time Password (HOTP, specified in [RFC 4226](https://tools.ietf.org/html/rfc4226)[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-cc "View full Authenticator CC report") -
Stats - [![GitHub: ente-io/ente](https://img.shields.io/github/stars/ente-io/ente?style=flat&logo=github&label=ente&color=%235f53f4&cacheSeconds=3600)](https://github.com/ente-io/ente) [![Privacy Policy](https://shields.tosdr.org/en_5256.svg)](https://tosdr.org/en/service/5256) [![Ente Auth on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ente_Auth)](https://awesome-privacy.xyz/essentials/2-factor-authentication/ente-auth) -📦 Open Source ˙ + [![GitHub: Authenticator-Extension/Authenticator](https://img.shields.io/github/stars/Authenticator-Extension/Authenticator?style=flat&logo=github&label=Authenticator&color=%235f53f4&cacheSeconds=3600)](https://github.com/Authenticator-Extension/Authenticator) [![Authenticator CC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Authenticator_CC)](https://awesome-privacy.xyz/essentials/2-factor-authentication/authenticator-cc)ㅤ + +
+- **[icon Ente Auth](https://ente.io/auth/)** - Ente Auth is a free and open-source app which stores and generates TOTP tokens. +It can be used with an online account to backup and sync your tokens across your +devices (and access them via a web inte[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/ente-auth "View full Ente Auth report") + -
+ Stats + + [![GitHub: ente-io/ente](https://img.shields.io/github/stars/ente-io/ente?style=flat&logo=github&label=ente&color=%235f53f4&cacheSeconds=3600)](https://github.com/ente-io/ente) [![Privacy Policy](https://shields.tosdr.org/en_5256.svg)](https://tosdr.org/en/service/5256) [![Ente Auth on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ente_Auth)](https://awesome-privacy.xyz/essentials/2-factor-authentication/ente-auth) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/ente-io/ente) [![Ente Auth on Google Play](https://img.shields.io/badge/-Ente_Auth-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=io.ente.auth) [![Ente Auth on App Store](https://img.shields.io/badge/-Ente_Auth-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/ente-auth/id6444121398)ㅤ + +
+- **[icon Bitwarden Authenticator](https://bitwarden.com/products/authenticator/)** - Bitwarden Authenticator is a free and open-source app which stores and generates +time-based codes for multi-factor authentication. It can be used with an online +account to backup and sync your tokens[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/bitwarden-authenticator "View full Bitwarden Authenticator report") + -
+ Stats + + [![GitHub: bitwarden/ios](https://img.shields.io/github/stars/bitwarden/ios?style=flat&logo=github&label=ios&color=%235f53f4&cacheSeconds=3600)](https://github.com/bitwarden/ios) [![Privacy Policy](https://shields.tosdr.org/en_5256.svg)](https://tosdr.org/en/service/5256) [![Bitwarden Authenticator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bitwarden_Authenticator)](https://awesome-privacy.xyz/essentials/2-factor-authentication/bitwarden-authenticator) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/bitwarden/ios) [![Bitwarden Authenticator on Google Play](https://img.shields.io/badge/-Bitwarden_Authenticator-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.bitwarden.authenticator) [![Bitwarden Authenticator on App Store](https://img.shields.io/badge/-Bitwarden_Authenticator-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/app/bitwarden-authenticator/id6497335175)ㅤ + +
+- **[icon Proton Authenticator](https://proton.me/authenticator)** - Proton Authenticator is free, open source, and available for both iOS and Android. +A Proton account is required to use Proton Authenticator. +Existing 2FA codes can be imported from other popular apps[…](https://awesome-privacy.xyz/essentials/2-factor-authentication/proton-authenticator "View full Proton Authenticator report") + -
+ Stats + + [![GitHub: protonpass/android-authenticator](https://img.shields.io/github/stars/protonpass/android-authenticator?style=flat&logo=github&label=android-authenticator&color=%235f53f4&cacheSeconds=3600)](https://github.com/protonpass/android-authenticator) [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![Proton Authenticator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Proton_Authenticator)](https://awesome-privacy.xyz/essentials/2-factor-authentication/proton-authenticator) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/protonpass/android-authenticator) [![Proton Authenticator on Google Play](https://img.shields.io/badge/-Proton_Authenticator-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=proton.android.authenticator) [![Proton Authenticator on App Store](https://img.shields.io/badge/-Proton_Authenticator-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/proton-authenticator/id6741758667)ㅤ
@@ -311,50 +320,38 @@ fashion. It can also be used offline on a single device with no account necessar - **[icon VeraCrypt](https://www.veracrypt.fr)** - VeraCrypt is open source cross-platform disk encryption software. You can use it to either encrypt a specific file or directory, or an entire disk or -partition. VeraCrypt is incredibly feature-rich, with comprehensive encryption -options, yet the GUI makes it easy to use. It has a CLI version, and a portable -edition. VeraCrypt is the successor of (the now deprecated) TrueCrypt. -[…](https://awesome-privacy.xyz/essentials/file-encryption/veracrypt "View full VeraCrypt report") +partition. VeraCrypt is incredibly feature-rich, w[…](https://awesome-privacy.xyz/essentials/file-encryption/veracrypt "View full VeraCrypt report") -
Stats - [![GitHub: veracrypt/VeraCrypt](https://img.shields.io/github/stars/veracrypt/VeraCrypt?style=flat&logo=github&label=VeraCrypt&color=%235f53f4&cacheSeconds=3600)](https://github.com/veracrypt/VeraCrypt) [![VeraCrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VeraCrypt)](https://awesome-privacy.xyz/essentials/file-encryption/veracrypt) -˙ + [![GitHub: veracrypt/VeraCrypt](https://img.shields.io/github/stars/veracrypt/VeraCrypt?style=flat&logo=github&label=VeraCrypt&color=%235f53f4&cacheSeconds=3600)](https://github.com/veracrypt/VeraCrypt) [![VeraCrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VeraCrypt)](https://awesome-privacy.xyz/essentials/file-encryption/veracrypt)ㅤ
- **[icon Cryptomator](https://cryptomator.org)** - Open source client-side encryption for cloud files - Cryptomator is geared towards using alongside cloud-backup solutions, and hence preserves individual -file structure, so that they can be uploaded. It too is easy to use, but has -fewer technical customizations for how the data is encrypted, compared with -VeraCrypt. Cryptomator works on Windows, Linux and Mac - but also has excellent -mobile apps. -[…](https://awesome-privacy.xyz/essentials/file-encryption/cryptomator "View full Cryptomator report") +file structure, so that they can be uploaded.[…](https://awesome-privacy.xyz/essentials/file-encryption/cryptomator "View full Cryptomator report") -
Stats - [![GitHub: cryptomator/cryptomator](https://img.shields.io/github/stars/cryptomator/cryptomator?style=flat&logo=github&label=cryptomator&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptomator/cryptomator) [![Privacy Policy](https://shields.tosdr.org/en_4403.svg)](https://tosdr.org/en/service/4403) [![Cryptomator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptomator)](https://awesome-privacy.xyz/essentials/file-encryption/cryptomator) -˙ + [![GitHub: cryptomator/cryptomator](https://img.shields.io/github/stars/cryptomator/cryptomator?style=flat&logo=github&label=cryptomator&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptomator/cryptomator) [![Privacy Policy](https://shields.tosdr.org/en_4403.svg)](https://tosdr.org/en/service/4403) [![Cryptomator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptomator)](https://awesome-privacy.xyz/essentials/file-encryption/cryptomator) [![Cryptomator on Google Play](https://img.shields.io/badge/-Cryptomator-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.cryptomator) [![Cryptomator on App Store](https://img.shields.io/badge/-Cryptomator-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/cryptomator/id1560822163)ㅤ
- **[icon age](https://age-encryption.org)** - `age` is a simple, modern and secure CLI file encryption tool and Go library. It features small explicit keys, no config options, and UNIX-style composability -[…](https://awesome-privacy.xyz/essentials/file-encryption/age "View full age report") + -
Stats - [![GitHub: FiloSottile/age](https://img.shields.io/github/stars/FiloSottile/age?style=flat&logo=github&label=age&color=%235f53f4&cacheSeconds=3600)](https://github.com/FiloSottile/age) [![age on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=age)](https://awesome-privacy.xyz/essentials/file-encryption/age) -˙ + [![GitHub: FiloSottile/age](https://img.shields.io/github/stars/FiloSottile/age?style=flat&logo=github&label=age&color=%235f53f4&cacheSeconds=3600)](https://github.com/FiloSottile/age) [![age on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=age)](https://awesome-privacy.xyz/essentials/file-encryption/age)ㅤ
-- **[icon Picocrypt](None)** - Picocrypt is a very small (hence Pico), very simple, yet very secure encryption tools -that you can use to protect your files. It's designed to be the go-to tool for encryption, -with a focus on security, simplicity, and reliability. -[…](https://awesome-privacy.xyz/essentials/file-encryption/picocrypt "View full Picocrypt report") +- **[icon Picocrypt]()** - Picocrypt is a very small (hence Pico), very simple, yet very secure encryption tools +that you can use to protect your files. It's designed to be the go-to tool for encryption, +with a focus on securit[…](https://awesome-privacy.xyz/essentials/file-encryption/picocrypt "View full Picocrypt report") -
Stats - [![GitHub: Picocrypt/Picocrypt](https://img.shields.io/github/stars/Picocrypt/Picocrypt?style=flat&logo=github&label=Picocrypt&color=%235f53f4&cacheSeconds=3600)](https://github.com/Picocrypt/Picocrypt) [![Picocrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Picocrypt)](https://awesome-privacy.xyz/essentials/file-encryption/picocrypt) -˙ + [![GitHub: Picocrypt/Picocrypt](https://img.shields.io/github/stars/Picocrypt/Picocrypt?style=flat&logo=github&label=Picocrypt&color=%235f53f4&cacheSeconds=3600)](https://github.com/Picocrypt/Picocrypt) [![Picocrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Picocrypt)](https://awesome-privacy.xyz/essentials/file-encryption/picocrypt)ㅤ
@@ -384,64 +381,46 @@ that makes a good alternative to BitLocker. - **[icon LibreWolf](https://librewolf.net)** - LibreWolf is an independent fork of Firefox that aims to provide better default settings to improve on privacy, security and user freedom. Mozilla telemetry is -disabled, ties with Google (Safe Browsing) are severed, the content blocker -[uBlock Origin](https://github.com/gorhill/uBlock) is included and privacy -defaults are guided by research like the -[Arkenfox project](https://github.com/arkenfox/user.js/). -[…](https://awesome-privacy.xyz/essentials/browsers/librewolf "View full LibreWolf report") +disabled, ties with Google (Safe Browsin[…](https://awesome-privacy.xyz/essentials/browsers/librewolf "View full LibreWolf report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_6389.svg)](https://tosdr.org/en/service/6389) [![LibreWolf on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LibreWolf)](https://awesome-privacy.xyz/essentials/browsers/librewolf) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_6389.svg)](https://tosdr.org/en/service/6389) [![LibreWolf on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LibreWolf)](https://awesome-privacy.xyz/essentials/browsers/librewolf) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://librewolf.net)ㅤ
- **[icon Brave Browser](https://brave.com)** - Brave Browser, currently one of the most popular private browsers - it provides speed, security, and privacy by blocking trackers with a clean, yet fully-featured -UI. It also pays you in [BAT tokens](https://basicattentiontoken.org/) for using it. -Brave also has Tor built-in, when you open up a private tab/ window. -[…](https://awesome-privacy.xyz/essentials/browsers/brave-browser "View full Brave Browser report") +UI. It also pays you in [BAT tokens](https://basicattentiontoken.org/) fo[…](https://awesome-privacy.xyz/essentials/browsers/brave-browser "View full Brave Browser report") -
Stats - [![GitHub: brave/brave-browser](https://img.shields.io/github/stars/brave/brave-browser?style=flat&logo=github&label=brave-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/brave/brave-browser) [![Privacy Policy](https://shields.tosdr.org/en_1487.svg)](https://tosdr.org/en/service/1487) [![Brave Browser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Brave_Browser)](https://awesome-privacy.xyz/essentials/browsers/brave-browser) -˙ + [![GitHub: brave/brave-browser](https://img.shields.io/github/stars/brave/brave-browser?style=flat&logo=github&label=brave-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/brave/brave-browser) [![Privacy Policy](https://shields.tosdr.org/en_1487.svg)](https://tosdr.org/en/service/1487) [![Brave Browser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Brave_Browser)](https://awesome-privacy.xyz/essentials/browsers/brave-browser)ㅤ
-- **[icon Firefox](https://www.mozilla.org/firefox)** - Significantly more private, and offers some nifty privacy features than Chrome, +- **[icon Firefox](https://www.firefox.com/)** - Significantly more private, and offers some nifty privacy features than Chrome, Internet Explorer and Safari. After installing, there are a couple of small tweaks -you will need to make, in order to secure Firefox. For a though config, see -[@arkenfox's user.js](https://github.com/arkenfox/user.js/). You can also follow -one of these guides by: [Restore Privacy](https://restoreprivacy.com/firefox-privacy/) -or [12Bytes](https://codeberg.org/12bytes/firefox-config-guide) -[…](https://awesome-privacy.xyz/essentials/browsers/firefox "View full Firefox report") +you will need to make, in order to se[…](https://awesome-privacy.xyz/essentials/browsers/firefox "View full Firefox report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_188.svg)](https://tosdr.org/en/service/188) [![Firefox on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox)](https://awesome-privacy.xyz/essentials/browsers/firefox) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_188.svg)](https://tosdr.org/en/service/188) [![Firefox on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox)](https://awesome-privacy.xyz/essentials/browsers/firefox) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.firefox.com/)ㅤ
- **[icon Tor Browser](https://www.torproject.org/)** - Tor provides an extra layer of anonymity, by encrypting each of your requests, then routing it through several nodes, making it near-impossible for you to be tracked by -your ISP/ provider. It does make every-day browsing a little slower, and some sites -may not work correctly. As with everything there are -[trade-offs](https://github.com/Lissy93/personal-security-checklist/issues/19) -[…](https://awesome-privacy.xyz/essentials/browsers/tor-browser "View full Tor Browser report") +your ISP/ provider. It does mak[…](https://awesome-privacy.xyz/essentials/browsers/tor-browser "View full Tor Browser report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2845.svg)](https://tosdr.org/en/service/2845) [![Tor Browser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tor_Browser)](https://awesome-privacy.xyz/essentials/browsers/tor-browser) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_2845.svg)](https://tosdr.org/en/service/2845) [![Tor Browser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tor_Browser)](https://awesome-privacy.xyz/essentials/browsers/tor-browser) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.torproject.org/) [![Tor Browser on Google Play](https://img.shields.io/badge/-Tor_Browser-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.torproject.torbrowser)ㅤ
- **[icon Cromite](https://www.cromite.org/)** - Cromite is a Chromium fork based on Bromite with built-in support for ad blocking and an eye for privacy. -[…](https://awesome-privacy.xyz/essentials/browsers/cromite "View full Cromite report") + -
Stats - [![GitHub: uazo/cromite](https://img.shields.io/github/stars/uazo/cromite?style=flat&logo=github&label=cromite&color=%235f53f4&cacheSeconds=3600)](https://github.com/uazo/cromite) [![Cromite on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cromite)](https://awesome-privacy.xyz/essentials/browsers/cromite) -˙ + [![GitHub: uazo/cromite](https://img.shields.io/github/stars/uazo/cromite?style=flat&logo=github&label=cromite&color=%235f53f4&cacheSeconds=3600)](https://github.com/uazo/cromite) [![Cromite on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cromite)](https://awesome-privacy.xyz/essentials/browsers/cromite)ㅤ
@@ -467,54 +446,55 @@ may not work correctly. As with everything there are - **[icon DuckDuckGo](https://duckduckgo.com)** - DuckDuckGo is a very user-friendly, fast and secure search engine. It's totally private, with no trackers, cookies or ads. It's also highly customisable, with -dark-mode, many languages and features. They even have a [.onion](https://3g2upl4pq6kufc4m.onion) -URL, for use with Tor and a [no Javascript version](https://duckduckgo.com/html/) -[…](https://awesome-privacy.xyz/essentials/search-engines/duckduckgo "View full DuckDuckGo report") +dark-mode, many languages and features. T[…](https://awesome-privacy.xyz/essentials/search-engines/duckduckgo "View full DuckDuckGo report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_222.svg)](https://tosdr.org/en/service/222) [![DuckDuckGo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DuckDuckGo)](https://awesome-privacy.xyz/essentials/search-engines/duckduckgo) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_222.svg)](https://tosdr.org/en/service/222) [![DuckDuckGo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DuckDuckGo)](https://awesome-privacy.xyz/essentials/search-engines/duckduckgo) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://duckduckgo.com) [![DuckDuckGo on Google Play](https://img.shields.io/badge/-DuckDuckGo-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android) [![DuckDuckGo on App Store](https://img.shields.io/badge/-DuckDuckGo-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/duckduckgo-private-browser/id663592361) [![r/duckduckgo on Reddit](https://img.shields.io/badge/-duckduckgo-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/duckduckgo)ㅤ
- **[icon Qwant](https://www.qwant.com)** - French service that aggregates Bings results, with its own results. Qwant doesn't plant any cookies, nor have any trackers or third-party advertising. It returns -non-biased search results, with no promotions. Qwant has a unique, but nice UI. -[…](https://awesome-privacy.xyz/essentials/search-engines/qwant "View full Qwant report") +non-biased search results, with no pro[…](https://awesome-privacy.xyz/essentials/search-engines/qwant "View full Qwant report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_527.svg)](https://tosdr.org/en/service/527) [![Qwant on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Qwant)](https://awesome-privacy.xyz/essentials/search-engines/qwant) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_527.svg)](https://tosdr.org/en/service/527) [![Qwant on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Qwant)](https://awesome-privacy.xyz/essentials/search-engines/qwant) [![Qwant on Google Play](https://img.shields.io/badge/-Qwant-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.qwant.liberty) [![Qwant on App Store](https://img.shields.io/badge/-Qwant-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/qwant-private-search/id924470452) [![r/Qwant on Reddit](https://img.shields.io/badge/-Qwant-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Qwant)ㅤ
- **[icon Startpage](https://www.startpage.com)** - Dutch search engine that searches on Google and shows the results (slightly rearranged). It has several configurations that improve privacy during use (it is not open source) -[…](https://awesome-privacy.xyz/essentials/search-engines/startpage "View full Startpage report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_418.svg)](https://tosdr.org/en/service/418) [![Startpage on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Startpage)](https://awesome-privacy.xyz/essentials/search-engines/startpage) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_418.svg)](https://tosdr.org/en/service/418) [![Startpage on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Startpage)](https://awesome-privacy.xyz/essentials/search-engines/startpage)ㅤ
-- **[icon Brave Search](https://search.brave.com/)** - Brave Search is a privacy-focused search engine that does not track users or their searches, does not use secret algorithms or user profiling, and is based on its own search index.[…](https://awesome-privacy.xyz/essentials/search-engines/brave-search "View full Brave Search report") +- **[icon Brave Search](https://search.brave.com/)** - Brave Search is a privacy-focused search engine that does not track users or their searches, does not use secret algorithms or user profiling, and is based on its own search index. -
Stats - [![GitHub: brave/brave-browser](https://img.shields.io/github/stars/brave/brave-browser?style=flat&logo=github&label=brave-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/brave/brave-browser) [![Privacy Policy](https://shields.tosdr.org/en_1487.svg)](https://tosdr.org/en/service/1487) [![Brave Search on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Brave_Search)](https://awesome-privacy.xyz/essentials/search-engines/brave-search) -📦 Open Source 🛡️ Security Audited ˙ + [![GitHub: brave/brave-browser](https://img.shields.io/github/stars/brave/brave-browser?style=flat&logo=github&label=brave-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/brave/brave-browser) [![Privacy Policy](https://shields.tosdr.org/en_1487.svg)](https://tosdr.org/en/service/1487) [![Brave Search on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Brave_Search)](https://awesome-privacy.xyz/essentials/search-engines/brave-search) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/brave/brave-browser) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Brave Search on Google Play](https://img.shields.io/badge/-Brave_Search-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.brave.browser) [![Brave Search on App Store](https://img.shields.io/badge/-Brave_Search-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/brave-private-browser-adblock/id1052879175) [![r/brave_browser on Reddit](https://img.shields.io/badge/-brave_browser-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/brave_browser)ㅤ
- **[icon Mojeek](https://mojeek.com)** - British search engine providing independent and unbiased search results using its own crawler. Has a zero tracking policy (it is not open source) -[…](https://awesome-privacy.xyz/essentials/search-engines/mojeek "View full Mojeek report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2432.svg)](https://tosdr.org/en/service/2432) [![Mojeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mojeek)](https://awesome-privacy.xyz/essentials/search-engines/mojeek) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2432.svg)](https://tosdr.org/en/service/2432) [![Mojeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mojeek)](https://awesome-privacy.xyz/essentials/search-engines/mojeek) [![Mojeek on Google Play](https://img.shields.io/badge/-Mojeek-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=mojeek.app) [![Mojeek on App Store](https://img.shields.io/badge/-Mojeek-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/gb/app/mojeek/id1505807785) [![r/mojeek on Reddit](https://img.shields.io/badge/-mojeek-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/mojeek)ㅤ + +
+- **[icon Uruky](https://uruky.com)** - Uruky is an ad-free, private search engine focused on personalization. It uses, +among other providers, Mojeek and Marginalia. It is EU-based and does not keep +or track any personal data (it is not 100[…](https://awesome-privacy.xyz/essentials/search-engines/uruky "View full Uruky report") + -
+ Stats + + [![Uruky on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Uruky)](https://awesome-privacy.xyz/essentials/search-engines/uruky) [![Uruky on App Store](https://img.shields.io/badge/-Uruky-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/uruky-private-ad-free-search/id6758864380)ㅤ
@@ -537,75 +517,47 @@ its own crawler. Has a zero tracking policy (it is not open source) - **[icon Signal](https://signal.org)** - Probably one of the most popular, secure private messaging apps that combines strong encryption (see [Signal Protocol](https://en.wikipedia.org/wiki/Signal_Protocol)) with a simple UI and plenty of features. It's widely used across the world, and -easy-to-use, functioning similar to WhatsApp - with instant messaging, read-receipts, -support for media attachments and allows for high-quality voice and video calls. -It's cross-platform, open-source and totally free. Signal is -[recommended](https://twitter.com/Snowden/status/661313394906161152) -by Edward Snowden, and is a perfect solution for most users. -[…](https://awesome-privacy.xyz/communication/encrypted-messaging/signal "View full Signal report") +ea[…](https://awesome-privacy.xyz/communication/encrypted-messaging/signal "View full Signal report") -
Stats - [![GitHub: signalapp/Signal-Server](https://img.shields.io/github/stars/signalapp/Signal-Server?style=flat&logo=github&label=Signal-Server&color=%235f53f4&cacheSeconds=3600)](https://github.com/signalapp/Signal-Server) [![Privacy Policy](https://shields.tosdr.org/en_528.svg)](https://tosdr.org/en/service/528) [![Signal on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Signal)](https://awesome-privacy.xyz/communication/encrypted-messaging/signal) -📦 Open Source ˙ + [![GitHub: signalapp/Signal-Server](https://img.shields.io/github/stars/signalapp/Signal-Server?style=flat&logo=github&label=Signal-Server&color=%235f53f4&cacheSeconds=3600)](https://github.com/signalapp/Signal-Server) [![Privacy Policy](https://shields.tosdr.org/en_528.svg)](https://tosdr.org/en/service/528) [![Signal on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Signal)](https://awesome-privacy.xyz/communication/encrypted-messaging/signal) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/signalapp/Signal-Server) [![Signal on Google Play](https://img.shields.io/badge/-Signal-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms) [![Signal on App Store](https://img.shields.io/badge/-Signal-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/signal-private-messenger/id874139669) [![r/signal on Reddit](https://img.shields.io/badge/-signal-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/signal)ㅤ
- **[icon Session](https://getsession.org)** - Session is a fork of Signal, however unlike Signal it does not require a mobile number (or any other personal data) to register, instead each user is identified -by a public key. It is also decentralized, with servers being run by the community -though [Loki Net](https://loki.network), messages are encrypted and routed through -several of these nodes. All communications are E2E encrypted, and there is no -meta data. -[…](https://awesome-privacy.xyz/communication/encrypted-messaging/session "View full Session report") +by a public key. It is also decentraliz[…](https://awesome-privacy.xyz/communication/encrypted-messaging/session "View full Session report") -
Stats - [![GitHub: oxen-io/lokinet](https://img.shields.io/github/stars/oxen-io/lokinet?style=flat&logo=github&label=lokinet&color=%235f53f4&cacheSeconds=3600)](https://github.com/oxen-io/lokinet) [![Privacy Policy](https://shields.tosdr.org/en_3015.svg)](https://tosdr.org/en/service/3015) [![Session on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Session)](https://awesome-privacy.xyz/communication/encrypted-messaging/session) -📦 Open Source ˙ + [![GitHub: oxen-io/lokinet](https://img.shields.io/github/stars/oxen-io/lokinet?style=flat&logo=github&label=lokinet&color=%235f53f4&cacheSeconds=3600)](https://github.com/oxen-io/lokinet) [![Privacy Policy](https://shields.tosdr.org/en_3015.svg)](https://tosdr.org/en/service/3015) [![Session on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Session)](https://awesome-privacy.xyz/communication/encrypted-messaging/session) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/oxen-io/lokinet) [![Session on Google Play](https://img.shields.io/badge/-Session-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=network.loki.messenger) [![Session on App Store](https://img.shields.io/badge/-Session-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/session-private-messenger/id1470168868) [![r/Session_Messenger on Reddit](https://img.shields.io/badge/-Session_Messenger-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Session_Messenger)ㅤ
- **[icon SimpleX](https://simplex.chat/)** - Simplex is gaining popularity as a secure and private messaging app renowned -for its robust encryption protocol without user IDs or phone numbers and this improves your privacy. -Simplex offers instant messaging, supports media attachments and voice and video calls. -Additionally, it is cross-platform, open-source, and completely free, aligning with the modern user's -preferences for convenience, security, and accessibility. -Learn more about the [Security Policy](https://simplex.chat/security/). -[…](https://awesome-privacy.xyz/communication/encrypted-messaging/simplex "View full SimpleX report") +for its robust encryption protocol without user IDs or phone numbers and this improves your privacy. +Simplex offers instant[…](https://awesome-privacy.xyz/communication/encrypted-messaging/simplex "View full SimpleX report") -
Stats - [![GitHub: simplex-chat/simplex-chat](https://img.shields.io/github/stars/simplex-chat/simplex-chat?style=flat&logo=github&label=simplex-chat&color=%235f53f4&cacheSeconds=3600)](https://github.com/simplex-chat/simplex-chat) [![Privacy Policy](https://shields.tosdr.org/en_7638.svg)](https://tosdr.org/en/service/7638) [![SimpleX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleX)](https://awesome-privacy.xyz/communication/encrypted-messaging/simplex) -📦 Open Source ˙ + [![GitHub: simplex-chat/simplex-chat](https://img.shields.io/github/stars/simplex-chat/simplex-chat?style=flat&logo=github&label=simplex-chat&color=%235f53f4&cacheSeconds=3600)](https://github.com/simplex-chat/simplex-chat) [![Privacy Policy](https://shields.tosdr.org/en_7638.svg)](https://tosdr.org/en/service/7638) [![SimpleX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleX)](https://awesome-privacy.xyz/communication/encrypted-messaging/simplex) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/simplex-chat/simplex-chat) [![SimpleX on Google Play](https://img.shields.io/badge/-SimpleX-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=chat.simplex.app) [![SimpleX on App Store](https://img.shields.io/badge/-SimpleX-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/simplex-chat-secure-messenger/id1605771084) [![r/SimpleXChat on Reddit](https://img.shields.io/badge/-SimpleXChat-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/SimpleXChat)ㅤ
- **[icon XMPP](https://xmpp.org)** - XMPP, also known as Jabber, is an open standard for decentralized messaging that has been widely used for decades. It has actually been the basis upon which -WhatsApp, Facebook's Chat and Google's Talk were built, but these companies -(eventually) chose to remove the interoperability with other servers. Prominent -XMPP clients support [OMEMO end-to-end encryption](https://en.wikipedia.org/wiki/OMEMO), -which is based on the [Double Ratchet Algorithm](https://en.wikipedia.org/wiki/Double_Ratchet_Algorithm) -that is used in Signal. For more hands-on information and to register an account -you can visit [JoinJabber](https://joinjabber.org). -[…](https://awesome-privacy.xyz/communication/encrypted-messaging/xmpp "View full XMPP report") +WhatsApp, Facebook's Chat and Google's Talk[…](https://awesome-privacy.xyz/communication/encrypted-messaging/xmpp "View full XMPP report") -
Stats - [![GitHub: xsf/xmpp.org](https://img.shields.io/github/stars/xsf/xmpp.org?style=flat&logo=github&label=xmpp.org&color=%235f53f4&cacheSeconds=3600)](https://github.com/xsf/xmpp.org) [![XMPP on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XMPP)](https://awesome-privacy.xyz/communication/encrypted-messaging/xmpp) -📦 Open Source ˙ + [![GitHub: xsf/xmpp.org](https://img.shields.io/github/stars/xsf/xmpp.org?style=flat&logo=github&label=xmpp.org&color=%235f53f4&cacheSeconds=3600)](https://github.com/xsf/xmpp.org) [![XMPP on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XMPP)](https://awesome-privacy.xyz/communication/encrypted-messaging/xmpp) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/xsf/xmpp.org)ㅤ
- **[icon Matrix](https://matrix.org)** - Matrix is a decentralized open network for secure communications, with E2E encryption with Olm and Megolm. Along with the [Element](https://element.io/) -client, it supports VOIP + video calling and IM + group chats. Since Matrix has -an open specification and Simple pragmatic RESTful HTTP/JSON API it makes it easy -to integrates with existing 3rd party IDs to authenticate and discover users, as -well as to build apps on top of it. -[…](https://awesome-privacy.xyz/communication/encrypted-messaging/matrix "View full Matrix report") +client, it supports VOIP + video calling and IM + group chats. Since M[…](https://awesome-privacy.xyz/communication/encrypted-messaging/matrix "View full Matrix report") -
Stats - [![GitHub: matrix-org/dendrite](https://img.shields.io/github/stars/matrix-org/dendrite?style=flat&logo=github&label=dendrite&color=%235f53f4&cacheSeconds=3600)](https://github.com/matrix-org/dendrite) [![Privacy Policy](https://shields.tosdr.org/en_2455.svg)](https://tosdr.org/en/service/2455) [![Matrix on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Matrix)](https://awesome-privacy.xyz/communication/encrypted-messaging/matrix) -📦 Open Source ˙ + [![GitHub: matrix-org/dendrite](https://img.shields.io/github/stars/matrix-org/dendrite?style=flat&logo=github&label=dendrite&color=%235f53f4&cacheSeconds=3600)](https://github.com/matrix-org/dendrite) [![Privacy Policy](https://shields.tosdr.org/en_2455.svg)](https://tosdr.org/en/service/2455) [![Matrix on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Matrix)](https://awesome-privacy.xyz/communication/encrypted-messaging/matrix) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/matrix-org/dendrite)ㅤ
@@ -636,54 +588,49 @@ With [Peer-to-Peer](https://en.wikipedia.org/wiki/Peer-to-peer) networks, there - **[icon Oxen](https://oxen.io/)** - Oxen (previously Loki) is an open source set of tools that allow users to transact and communicate anonymously and privately, through a decentralised, encrypted, onion-based network. -Session is a desktop and mobile app that uses these private routing protocols to -secure messages, media and metadata. -[…](https://awesome-privacy.xyz/communication/p2p-messaging/oxen "View full Oxen report") +Session is a desk[…](https://awesome-privacy.xyz/communication/p2p-messaging/oxen "View full Oxen report") -
Stats - [![GitHub: oxen-io/lokinet](https://img.shields.io/github/stars/oxen-io/lokinet?style=flat&logo=github&label=lokinet&color=%235f53f4&cacheSeconds=3600)](https://github.com/oxen-io/lokinet) [![Privacy Policy](https://shields.tosdr.org/en_6622.svg)](https://tosdr.org/en/service/6622) [![Oxen on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Oxen)](https://awesome-privacy.xyz/communication/p2p-messaging/oxen) -˙ + [![GitHub: oxen-io/lokinet](https://img.shields.io/github/stars/oxen-io/lokinet?style=flat&logo=github&label=lokinet&color=%235f53f4&cacheSeconds=3600)](https://github.com/oxen-io/lokinet) [![Privacy Policy](https://shields.tosdr.org/en_6622.svg)](https://tosdr.org/en/service/6622) [![Oxen on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Oxen)](https://awesome-privacy.xyz/communication/p2p-messaging/oxen)ㅤ
- **[icon Briar](https://briarproject.org)** - Tor-based Android app for P2P encrypted messaging and forums. Where content is stored securely on your device (not in the cloud). It also allows you to connect -directly with nearby contacts, without internet access (using Bluetooth or WiFi). -[…](https://awesome-privacy.xyz/communication/p2p-messaging/briar "View full Briar report") +directly with nearby contacts, without i[…](https://awesome-privacy.xyz/communication/p2p-messaging/briar "View full Briar report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2559.svg)](https://tosdr.org/en/service/2559) [![Briar on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Briar)](https://awesome-privacy.xyz/communication/p2p-messaging/briar) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_2559.svg)](https://tosdr.org/en/service/2559) [![Briar on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Briar)](https://awesome-privacy.xyz/communication/p2p-messaging/briar) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://briarproject.org) [![Briar on Google Play](https://img.shields.io/badge/-Briar-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.briarproject.briar.android)ㅤ
- **[icon Ricochet Refresh](https://www.ricochetrefresh.net)** - Desktop instant messenger, that uses the Tor network to rendezvous with your contacts without revealing your identity, location/ IP or meta data. There are -no servers to monitor, censor, or hack so Ricochet is secure, automatic and easy -to use. -[…](https://awesome-privacy.xyz/communication/p2p-messaging/ricochet-refresh "View full Ricochet Refresh report") +no servers to monitor, censor, or hack so Ri[…](https://awesome-privacy.xyz/communication/p2p-messaging/ricochet-refresh "View full Ricochet Refresh report") -
Stats - [![GitHub: blueprint-freespeech/ricochet-refresh](https://img.shields.io/github/stars/blueprint-freespeech/ricochet-refresh?style=flat&logo=github&label=ricochet-refresh&color=%235f53f4&cacheSeconds=3600)](https://github.com/blueprint-freespeech/ricochet-refresh) [![Ricochet Refresh on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ricochet_Refresh)](https://awesome-privacy.xyz/communication/p2p-messaging/ricochet-refresh) -📦 Open Source ˙ + [![GitHub: blueprint-freespeech/ricochet-refresh](https://img.shields.io/github/stars/blueprint-freespeech/ricochet-refresh?style=flat&logo=github&label=ricochet-refresh&color=%235f53f4&cacheSeconds=3600)](https://github.com/blueprint-freespeech/ricochet-refresh) [![Ricochet Refresh on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ricochet_Refresh)](https://awesome-privacy.xyz/communication/p2p-messaging/ricochet-refresh) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/blueprint-freespeech/ricochet-refresh)ㅤ
- **[icon Jami](https://jami.net)** - P2P encrypted chat network with cross-platform GNU client apps. Jami supports audio and video calls, screen sharing, conference hosting and instant messaging. -[…](https://awesome-privacy.xyz/communication/p2p-messaging/jami "View full Jami report") + -
Stats - [![GitHub: savoirfairelinux/jami-project](https://img.shields.io/github/stars/savoirfairelinux/jami-project?style=flat&logo=github&label=jami-project&color=%235f53f4&cacheSeconds=3600)](https://github.com/savoirfairelinux/jami-project) [![Jami on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jami)](https://awesome-privacy.xyz/communication/p2p-messaging/jami) -˙ + [![GitHub: savoirfairelinux/jami-project](https://img.shields.io/github/stars/savoirfairelinux/jami-project?style=flat&logo=github&label=jami-project&color=%235f53f4&cacheSeconds=3600)](https://github.com/savoirfairelinux/jami-project) [![Jami on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jami)](https://awesome-privacy.xyz/communication/p2p-messaging/jami) [![Jami on Google Play](https://img.shields.io/badge/-Jami-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=cx.ring) [![Jami on App Store](https://img.shields.io/badge/-Jami-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/ca/app/jami/id1306951055)ㅤ
- **[icon Tox & qTox client](https://tox.chat)** - Open source, encrypted, distributed chat network, with clients for desktop and mobile - see [supported clients](https://tox.chat/clients.html). Clearly documented -code and multiple language bindings make it easy for developers to integrate with -Tox. -[…](https://awesome-privacy.xyz/communication/p2p-messaging/tox-and-qtox-client "View full Tox & qTox client report") +code and multiple language bindings make it easy for developers to int[…](https://awesome-privacy.xyz/communication/p2p-messaging/tox-and-qtox-client "View full Tox & qTox client report") + -
+ Stats + + [![Tox & qTox client on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tox_&_qTox_client)](https://awesome-privacy.xyz/communication/p2p-messaging/tox-and-qtox-client) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://tox.chat) [![r/projecttox on Reddit](https://img.shields.io/badge/-projecttox-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/projecttox)ㅤ + +
✳️ Notable Mentions @@ -703,87 +650,48 @@ Email is not secure - your messages can be easily intercepted and read. Corporat - **[icon Forward Email](https://forwardemail.net)** - A 100% open-source, privacy-focused email service with quantum-safe encrypted SQLite mailboxes (sandboxed and portable). Supports IMAP, POP3, SMTP, CalDAV -(calendars), and CardDAV (contacts). Features include -[OpenPGP/MIME and E2EE](https://forwardemail.net/en/faq#do-you-support-openpgpmime-end-to-end-encryption-e2ee-and-web-key-directory-wkd), -[Web Key Directory (WKD)](https://forwardemail.net/en/faq#do-you-support-openpgpmime-end-to-end-encryption-e2ee-and-web-key-directory-wkd), -and [quantum-resistant encryption](https://forwardemail.net/blog/docs/best-quantum-safe-encrypted-email-service) -using ChaCha20-Poly1305. Offers a free plan (forwarding only), Enhanced Protection -at $3/month (10 GB storage, unlimited domains/aliases), Team at $9/month, and -Enterprise at $250/month. Additional storage available. Can be -[self-hosted via Docker](https://forwardemail.net/en/faq#do-you-support-self-hosting). -All code is available on [GitHub](https://github.com/forwardemail). -[…](https://awesome-privacy.xyz/communication/encrypted-email/forward-email "View full Forward Email report") +(calendars), and CardDAV (contacts). Features[…](https://awesome-privacy.xyz/communication/encrypted-email/forward-email "View full Forward Email report") -
Stats - [![GitHub: forwardemail/free-email-forwarding](https://img.shields.io/github/stars/forwardemail/free-email-forwarding?style=flat&logo=github&label=free-email-forwarding&color=%235f53f4&cacheSeconds=3600)](https://github.com/forwardemail/free-email-forwarding) [![Forward Email on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Forward_Email)](https://awesome-privacy.xyz/communication/encrypted-email/forward-email) -📦 Open Source ˙ + [![GitHub: forwardemail/free-email-forwarding](https://img.shields.io/github/stars/forwardemail/free-email-forwarding?style=flat&logo=github&label=free-email-forwarding&color=%235f53f4&cacheSeconds=3600)](https://github.com/forwardemail/free-email-forwarding) [![Forward Email on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Forward_Email)](https://awesome-privacy.xyz/communication/encrypted-email/forward-email) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/forwardemail/free-email-forwarding) [![r/forwardemail on Reddit](https://img.shields.io/badge/-forwardemail-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/forwardemail)ㅤ
- **[icon ProtonMail](https://protonmail.com)** - An end-to-end encrypted anonymous email service. ProtonMail has a modern easy-to-use and customizable UI, as well as fast, secure native mobile -apps. ProtonMail has all the features that you'd expect from a modern email -service and is based on simplicity without sacrificing security. It has a free -plan or a premium option for using custom domains (starting at $5/month). -ProtonMail requires no personally identifiable information for signup, they have -a [.onion](https://protonirockerxow.onion) server, for access via Tor, and they -accept anonymous payment: BTC and cash (as well as the normal credit card and PayPal). -[…](https://awesome-privacy.xyz/communication/encrypted-email/protonmail "View full ProtonMail report") +apps. ProtonMail has all the features that you'd expect[…](https://awesome-privacy.xyz/communication/encrypted-email/protonmail "View full ProtonMail report") -
Stats - [![GitHub: ProtonMail/WebClients](https://img.shields.io/github/stars/ProtonMail/WebClients?style=flat&logo=github&label=WebClients&color=%235f53f4&cacheSeconds=3600)](https://github.com/ProtonMail/WebClients) [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonMail)](https://awesome-privacy.xyz/communication/encrypted-email/protonmail) -˙ + [![GitHub: ProtonMail/WebClients](https://img.shields.io/github/stars/ProtonMail/WebClients?style=flat&logo=github&label=WebClients&color=%235f53f4&cacheSeconds=3600)](https://github.com/ProtonMail/WebClients) [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonMail)](https://awesome-privacy.xyz/communication/encrypted-email/protonmail) [![ProtonMail on Google Play](https://img.shields.io/badge/-ProtonMail-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=ch.protonmail.android) [![ProtonMail on App Store](https://img.shields.io/badge/-ProtonMail-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/proton-mail-encrypted-email/id979659905) [![r/ProtonMail on Reddit](https://img.shields.io/badge/-ProtonMail-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/ProtonMail)ㅤ
- **[icon Tuta](https://tuta.com)** - Free and open source email service based in Germany. It has a basic intuitive UI, secure native mobile apps and desktop email clients, anonymous signup, and an encrypted calendar. Tuta has a -full-featured free plan and premium subscription plans allowing for -custom domains (starting at $3/month). Tuta -[does not use OpenPGP](https://tuta.com/blog/posts/differences-email-encryption/) -like other encrypted mail providers, instead they use a standardized, hybrid method -consisting of symmetrical and asymmetrical algorithms (with AES256, and RSA 2048 -or ECC (x25519) and Kyber-1024). This causes compatibility issues when communicating with contacts -using PGP. But it does allow them to encrypt much more of the header data (body, -attachments, subject lines, and sender names etc) which PGP mail providers cannot do. The recent upgrades -to Tuta's encryption algorithm makes data stored and sent with their service safe against attacks -posed by quantum computers. -[…](https://awesome-privacy.xyz/communication/encrypted-email/tuta "View full Tuta report") +full-feat[…](https://awesome-privacy.xyz/communication/encrypted-email/tuta "View full Tuta report") -
Stats - [![GitHub: tutao/tutanota](https://img.shields.io/github/stars/tutao/tutanota?style=flat&logo=github&label=tutanota&color=%235f53f4&cacheSeconds=3600)](https://github.com/tutao/tutanota) [![Privacy Policy](https://shields.tosdr.org/en_157.svg)](https://tosdr.org/en/service/157) [![Tuta on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tuta)](https://awesome-privacy.xyz/communication/encrypted-email/tuta) -📦 Open Source ˙ + [![GitHub: tutao/tutanota](https://img.shields.io/github/stars/tutao/tutanota?style=flat&logo=github&label=tutanota&color=%235f53f4&cacheSeconds=3600)](https://github.com/tutao/tutanota) [![Privacy Policy](https://shields.tosdr.org/en_157.svg)](https://tosdr.org/en/service/157) [![Tuta on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tuta)](https://awesome-privacy.xyz/communication/encrypted-email/tuta) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/tutao/tutanota) [![Tuta on Google Play](https://img.shields.io/badge/-Tuta-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=de.tutao.tutanota) [![Tuta on App Store](https://img.shields.io/badge/-Tuta-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/encrypted-email-tuta/id922429609) [![r/tutanota on Reddit](https://img.shields.io/badge/-tutanota-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/tutanota)ㅤ
- **[icon Mailfence](https://mailfence.com?src=digitald)** - Mailfence supports OpenPGP so that you can manually exchange encryption keys independently from the Mailfence servers, putting you in full control. Mailfence -has a simple UI, similar to that of Outlook, and it comes with bundled with -calendar, address book, and files. All mail settings are highly customizable, -yet still clear and easy to use. Sign up is not anonymous, since your name, and -prior email address is required. There is a fully-featured free plan, or you can -pay for premium, and use a custom domain ($2.50/ month, or $7.50/ month for 5 -domains), where Bitcoin, LiteCoin or credit card is accepted. -[…](https://awesome-privacy.xyz/communication/encrypted-email/mailfence "View full Mailfence report") +has a simple UI, similar to that of Outloo[…](https://awesome-privacy.xyz/communication/encrypted-email/mailfence "View full Mailfence report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1694.svg)](https://tosdr.org/en/service/1694) [![Mailfence on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mailfence)](https://awesome-privacy.xyz/communication/encrypted-email/mailfence) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1694.svg)](https://tosdr.org/en/service/1694) [![Mailfence on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mailfence)](https://awesome-privacy.xyz/communication/encrypted-email/mailfence) [![Mailfence on Google Play](https://img.shields.io/badge/-Mailfence-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.contactoffice.mailfence) [![Mailfence on App Store](https://img.shields.io/badge/-Mailfence-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/mailfence/id1628808776) [![r/Mailfence on Reddit](https://img.shields.io/badge/-Mailfence-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Mailfence)ㅤ
- **[icon MailBox.org](https://mailbox.org)** - A Berlin-based, eco-friendly secure mail provider. There is no free plan, the standard service costs €12/year. You can use your own domain, with the option of a [catch-all alias](https://kb.mailbox.org/display/MBOKBEN/Using+catch-all+alias+with+own+domain). -They provide good account security and email encryption, with OpenPGP, as well as -encrypted storage. There is no dedicated app, but it works well with any standard -mail client with SSL. There's also currently no anonymous payment option. -[…](https://awesome-privacy.xyz/communication/encrypted-email/mailbox.org "View full MailBox.org report") +They provide good acco[…](https://awesome-privacy.xyz/communication/encrypted-email/mailbox.org "View full MailBox.org report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1517.svg)](https://tosdr.org/en/service/1517) [![MailBox.org on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MailBox.org)](https://awesome-privacy.xyz/communication/encrypted-email/mailbox.org) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1517.svg)](https://tosdr.org/en/service/1517) [![MailBox.org on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MailBox.org)](https://awesome-privacy.xyz/communication/encrypted-email/mailbox.org) [![r/Mailbox_org on Reddit](https://img.shields.io/badge/-Mailbox_org-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Mailbox_org)ㅤ
@@ -821,75 +729,58 @@ Email clients are the programs used to interact with the mail server. For hosted - **[icon Mozilla Thunderbird](https://www.thunderbird.net)** - Free and open source email application developed and backed by Mozilla -it's secure, private easy and customizable. As of V 78.2.1 encryption is built in, and the [TorBirdy](https://trac.torproject.org/projects/tor/wiki/torbirdy) extension routes -all traffic through the Tor network. Forks, such as -[Betterbird](https://github.com/Betterbird/thunderbird-patches) may add additional features. -[…](https://awesome-privacy.xyz/communication/email-clients/mozilla-thunderbird "View full Mozilla Thunderbird report") +all traffic[…](https://awesome-privacy.xyz/communication/email-clients/mozilla-thunderbird "View full Mozilla Thunderbird report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3365.svg)](https://tosdr.org/en/service/3365) [![Mozilla Thunderbird on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mozilla_Thunderbird)](https://awesome-privacy.xyz/communication/email-clients/mozilla-thunderbird) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_3365.svg)](https://tosdr.org/en/service/3365) [![Mozilla Thunderbird on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mozilla_Thunderbird)](https://awesome-privacy.xyz/communication/email-clients/mozilla-thunderbird) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.thunderbird.net) [![r/Thunderbird on Reddit](https://img.shields.io/badge/-Thunderbird-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Thunderbird)ㅤ
- **[icon eM Client](https://www.emclient.com)** - Productivity-based email client, for Windows and MacOS. eM Client has a clean user interface, snappy performance and good compatibility. There is a paid version, with -some handy features, including snoozing incoming emails, watching for replies for a -specific thread, message translation, send later, and built-in Calendar, Tasks, -Contacts and Notes. Note, eM Client is proprietary, and not open source. -[…](https://awesome-privacy.xyz/communication/email-clients/em-client "View full eM Client report") +some handy features, including sn[…](https://awesome-privacy.xyz/communication/email-clients/em-client "View full eM Client report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_432.svg)](https://tosdr.org/en/service/432) [![eM Client on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=eM_Client)](https://awesome-privacy.xyz/communication/email-clients/em-client) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_432.svg)](https://tosdr.org/en/service/432) [![eM Client on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=eM_Client)](https://awesome-privacy.xyz/communication/email-clients/em-client) [![eM Client on Google Play](https://img.shields.io/badge/-eM_Client-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.emclient.mailclient) [![eM Client on App Store](https://img.shields.io/badge/-eM_Client-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/em-client/id1561166404)ㅤ
- **[icon SnappyMail](https://snappymail.eu)** - Simple, modern, fast web-based mail client. This is an IMAP-only fork of [RainLoop](http://www.rainloop.net) that mitigates a severe [RainLoop vulnerability](https://thehackernews.com/2022/04/unpatched-bug-in-rainloop-webmail-could.html) -and adds several new [features](https://snappymail.eu/comparison). -[…](https://awesome-privacy.xyz/communication/email-clients/snappymail "View full SnappyMail report") +and adds several new [features](https://snappymail.eu/comparison).[…](https://awesome-privacy.xyz/communication/email-clients/snappymail "View full SnappyMail report") -
Stats - [![GitHub: the-djmaze/snappymail](https://img.shields.io/github/stars/the-djmaze/snappymail?style=flat&logo=github&label=snappymail&color=%235f53f4&cacheSeconds=3600)](https://github.com/the-djmaze/snappymail) [![SnappyMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SnappyMail)](https://awesome-privacy.xyz/communication/email-clients/snappymail) -˙ + [![GitHub: the-djmaze/snappymail](https://img.shields.io/github/stars/the-djmaze/snappymail?style=flat&logo=github&label=snappymail&color=%235f53f4&cacheSeconds=3600)](https://github.com/the-djmaze/snappymail) [![SnappyMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SnappyMail)](https://awesome-privacy.xyz/communication/email-clients/snappymail)ㅤ
- **[icon RoundCube](https://roundcube.net)** - Browser-based multilingual IMAP client with an application-like user interface. It provides full functionality you expect from an email client, including MIME support, -address book, folder manipulation, message searching and spell checking. -[…](https://awesome-privacy.xyz/communication/email-clients/roundcube "View full RoundCube report") +address book, folder manipulatio[…](https://awesome-privacy.xyz/communication/email-clients/roundcube "View full RoundCube report") -
Stats - [![GitHub: roundcube/roundcubemail](https://img.shields.io/github/stars/roundcube/roundcubemail?style=flat&logo=github&label=roundcubemail&color=%235f53f4&cacheSeconds=3600)](https://github.com/roundcube/roundcubemail) [![RoundCube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RoundCube)](https://awesome-privacy.xyz/communication/email-clients/roundcube) -˙ + [![GitHub: roundcube/roundcubemail](https://img.shields.io/github/stars/roundcube/roundcubemail?style=flat&logo=github&label=roundcubemail&color=%235f53f4&cacheSeconds=3600)](https://github.com/roundcube/roundcubemail) [![RoundCube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RoundCube)](https://awesome-privacy.xyz/communication/email-clients/roundcube)ㅤ
- **[icon FairEmail](https://email.faircode.eu)** - Open source, fully-featured and easy mail client for Android. Supports unlimited accounts and email addresses with the option for a unified inbox. Clean user -interface, with a dark mode option, it is also very lightweight and consumes minimal -data usage. -[…](https://awesome-privacy.xyz/communication/email-clients/fairemail "View full FairEmail report") +interface, with a dark mode option, it is[…](https://awesome-privacy.xyz/communication/email-clients/fairemail "View full FairEmail report") -
Stats - [![GitHub: M66B/FairEmail](https://img.shields.io/github/stars/M66B/FairEmail?style=flat&logo=github&label=FairEmail&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/FairEmail) [![FairEmail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FairEmail)](https://awesome-privacy.xyz/communication/email-clients/fairemail) -˙ + [![GitHub: M66B/FairEmail](https://img.shields.io/github/stars/M66B/FairEmail?style=flat&logo=github&label=FairEmail&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/FairEmail) [![FairEmail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FairEmail)](https://awesome-privacy.xyz/communication/email-clients/fairemail) [![FairEmail on Google Play](https://img.shields.io/badge/-FairEmail-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=eu.faircode.email)ㅤ
- **[icon K-9 Mail](https://k9mail.app)** - K-9 (or Thunderbird for Android) is open source, very well supported and trusted - k9 has been around for nearly as long as Android itself! It supports multiple accounts, search, IMAP push email, -multi-folder sync, flagging, filing, signatures, BCC-self, PGP/MIME & more. Install -OpenKeychain along side it, in order to encrypt/ decrypt emails using OpenPGP. -[…](https://awesome-privacy.xyz/communication/email-clients/k-9-mail "View full K-9 Mail report") +mult[…](https://awesome-privacy.xyz/communication/email-clients/k-9-mail "View full K-9 Mail report") -
Stats - [![GitHub: thunderbird/thunderbird-android](https://img.shields.io/github/stars/thunderbird/thunderbird-android?style=flat&logo=github&label=thunderbird-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/thunderbird/thunderbird-android) [![Privacy Policy](https://shields.tosdr.org/en_3624.svg)](https://tosdr.org/en/service/3624) [![K-9 Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=K-9_Mail)](https://awesome-privacy.xyz/communication/email-clients/k-9-mail) -˙ + [![GitHub: thunderbird/thunderbird-android](https://img.shields.io/github/stars/thunderbird/thunderbird-android?style=flat&logo=github&label=thunderbird-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/thunderbird/thunderbird-android) [![Privacy Policy](https://shields.tosdr.org/en_3624.svg)](https://tosdr.org/en/service/3624) [![K-9 Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=K-9_Mail)](https://awesome-privacy.xyz/communication/email-clients/k-9-mail) [![K-9 Mail on Google Play](https://img.shields.io/badge/-K--9_Mail-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.fsck.k9)ㅤ
@@ -911,68 +802,56 @@ Revealing your real email address online can put you at risk. Email aliasing all - **[icon Addy](https://addy.io)** - An open source anonymous email forwarding service, allowing you to create unlimited email aliases. Has a free plan. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/addy "View full Addy report") + -
Stats - [![GitHub: anonaddy/anonaddy](https://img.shields.io/github/stars/anonaddy/anonaddy?style=flat&logo=github&label=anonaddy&color=%235f53f4&cacheSeconds=3600)](https://github.com/anonaddy/anonaddy) [![Privacy Policy](https://shields.tosdr.org/en_2220.svg)](https://tosdr.org/en/service/2220) [![Addy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Addy)](https://awesome-privacy.xyz/communication/mail-forwarding/addy) -˙ + [![GitHub: anonaddy/anonaddy](https://img.shields.io/github/stars/anonaddy/anonaddy?style=flat&logo=github&label=anonaddy&color=%235f53f4&cacheSeconds=3600)](https://github.com/anonaddy/anonaddy) [![Privacy Policy](https://shields.tosdr.org/en_2220.svg)](https://tosdr.org/en/service/2220) [![Addy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Addy)](https://awesome-privacy.xyz/communication/mail-forwarding/addy) [![Addy on Google Play](https://img.shields.io/badge/-Addy-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.khalidwar.anonaddy) [![Addy on App Store](https://img.shields.io/badge/-Addy-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/addymanager/id1547461270)ㅤ
- **[icon 33Mail](http://33mail.com)** - A long-standing aliasing service. As well as receiving, 33Mail also lets you reply to forwarded addresses anonymously. Free plan, as well as Premium plan ($1/ month) -if you'd like to use a custom domain. Note that 33Mail usese Google Analytics. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/33mail "View full 33Mail report") +if you'd like to use a custom doma[…](https://awesome-privacy.xyz/communication/mail-forwarding/33mail "View full 33Mail report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_8301.svg)](https://tosdr.org/en/service/8301) [![33Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=33Mail)](https://awesome-privacy.xyz/communication/mail-forwarding/33mail) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_8301.svg)](https://tosdr.org/en/service/8301) [![33Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=33Mail)](https://awesome-privacy.xyz/communication/mail-forwarding/33mail)ㅤ
- **[icon SimpleLogin](https://simplelogin.io)** - Fully open source (view on [GitHub](https://github.com/simple-login)) alias service with many additional features. Can be self-hosted, or the managed version has a free -plan, as well as hosted premium option ($2.99/ month) for using custom domains. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/simplelogin "View full SimpleLogin report") +plan, as well as hosted premium option ($2.99/ month) for using cu[…](https://awesome-privacy.xyz/communication/mail-forwarding/simplelogin "View full SimpleLogin report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2552.svg)](https://tosdr.org/en/service/2552) [![SimpleLogin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleLogin)](https://awesome-privacy.xyz/communication/mail-forwarding/simplelogin) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_2552.svg)](https://tosdr.org/en/service/2552) [![SimpleLogin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleLogin)](https://awesome-privacy.xyz/communication/mail-forwarding/simplelogin) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://simplelogin.io) [![SimpleLogin on Google Play](https://img.shields.io/badge/-SimpleLogin-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=io.simplelogin.android) [![SimpleLogin on App Store](https://img.shields.io/badge/-SimpleLogin-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/simplelogin-email-alias/id1494359858)ㅤ
- **[icon Firefox Private Relay](https://relay.firefox.com)** - Developed and managed by Mozilla, Relay is a Firefox addon, that lets you make an email alias with 1 click, and have all messages forwarded onto your personal email. -Relay is totally free to use, and very accessible to less experienced users, but also -[open source](https://github.com/mozilla/fx-private-relay), and able to me self-hosted -for advanced usage. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/firefox-private-relay "View full Firefox Private Relay report") +Relay is totally free to use, and[…](https://awesome-privacy.xyz/communication/mail-forwarding/firefox-private-relay "View full Firefox Private Relay report") -
Stats - [![GitHub: mozilla/fx-private-relay](https://img.shields.io/github/stars/mozilla/fx-private-relay?style=flat&logo=github&label=fx-private-relay&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/fx-private-relay) [![Privacy Policy](https://shields.tosdr.org/en_4158.svg)](https://tosdr.org/en/service/4158) [![Firefox Private Relay on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox_Private_Relay)](https://awesome-privacy.xyz/communication/mail-forwarding/firefox-private-relay) -📦 Open Source ˙ + [![GitHub: mozilla/fx-private-relay](https://img.shields.io/github/stars/mozilla/fx-private-relay?style=flat&logo=github&label=fx-private-relay&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/fx-private-relay) [![Privacy Policy](https://shields.tosdr.org/en_4158.svg)](https://tosdr.org/en/service/4158) [![Firefox Private Relay on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox_Private_Relay)](https://awesome-privacy.xyz/communication/mail-forwarding/firefox-private-relay) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/mozilla/fx-private-relay)ㅤ
- **[icon ForwardEmail](https://forwardemail.net)** - Simple open source catch-all email forwarding service. Easy to self-host (see on [GitHub](https://github.com/forwardemail/free-email-forwarding)), or the hosted version -has a free plan as well as a ($3/month) premium plan. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/forwardemail "View full ForwardEmail report") +has a free plan as well as a ($3/month) premium plan.[…](https://awesome-privacy.xyz/communication/mail-forwarding/forwardemail "View full ForwardEmail report") -
Stats - [![GitHub: forwardemail/free-email-forwarding](https://img.shields.io/github/stars/forwardemail/free-email-forwarding?style=flat&logo=github&label=free-email-forwarding&color=%235f53f4&cacheSeconds=3600)](https://github.com/forwardemail/free-email-forwarding) [![ForwardEmail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ForwardEmail)](https://awesome-privacy.xyz/communication/mail-forwarding/forwardemail) -˙ + [![GitHub: forwardemail/free-email-forwarding](https://img.shields.io/github/stars/forwardemail/free-email-forwarding?style=flat&logo=github&label=free-email-forwarding&color=%235f53f4&cacheSeconds=3600)](https://github.com/forwardemail/free-email-forwarding) [![ForwardEmail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ForwardEmail)](https://awesome-privacy.xyz/communication/mail-forwarding/forwardemail)ㅤ
- **[icon ProtonMail](https://protonmail.com/pricing)** - If you already have ProtonMail's Professional (€8/month) or Visionary (€30/month) package, then an implementation of this feature is available via the Catch-All Email feature. -[…](https://awesome-privacy.xyz/communication/mail-forwarding/protonmail "View full ProtonMail report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonMail)](https://awesome-privacy.xyz/communication/mail-forwarding/protonmail) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_491.svg)](https://tosdr.org/en/service/491) [![ProtonMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonMail)](https://awesome-privacy.xyz/communication/mail-forwarding/protonmail) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://protonmail.com/pricing)ㅤ
@@ -984,32 +863,29 @@ then an implementation of this feature is available via the Catch-All Email feat - **[icon Enigmail](https://www.enigmail.net)** - Mail client add-on, enabling the use of OpenPGP to easily encrypt, decrypt, verify and sign emails. Free and open source, Enigmail is compatible with Interlink -Mail & News and Postbox. Their website contains thorough documentation and -quick-start guides, once set up it is extremely convenient to use. -[…](https://awesome-privacy.xyz/communication/email-security-tools/enigmail "View full Enigmail report") -- **[icon Email Privacy Tester](https://www.emailprivacytester.com/)** - Quick tool, that enables you to test whether your mail client "reads" your emails -before you've opened them, and also checks what analytics, read-receipts or other -tracking data your mail client allows to be sent back to the sender. The system is -open source ([on GitLab](https://gitlab.com/mikecardwell/ept3)), developed by -[Mike Cardwell](https://www.grepular.com/) and trusted, but if you do not want to -use your real email, creating a second account with the same provider, should yield -identical results. -[…](https://awesome-privacy.xyz/communication/email-security-tools/email-privacy-tester "View full Email Privacy Tester report") +Mail & News and Postbox. Their website c[…](https://awesome-privacy.xyz/communication/email-security-tools/enigmail "View full Enigmail report") -
Stats - [![GitHub: mikecardwell/email-privacy-tester](https://img.shields.io/github/stars/mikecardwell/email-privacy-tester?style=flat&logo=github&label=email-privacy-tester&color=%235f53f4&cacheSeconds=3600)](https://github.com/mikecardwell/email-privacy-tester) [![Privacy Policy](https://shields.tosdr.org/en_9837.svg)](https://tosdr.org/en/service/9837) [![Email Privacy Tester on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Email_Privacy_Tester)](https://awesome-privacy.xyz/communication/email-security-tools/email-privacy-tester) -📦 Open Source ˙ + [![Enigmail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Enigmail)](https://awesome-privacy.xyz/communication/email-security-tools/enigmail)ㅤ + +
+- **[icon Email Privacy Tester](https://www.emailprivacytester.com/)** - Quick tool, that enables you to test whether your mail client "reads" your emails +before you've opened them, and also checks what analytics, read-receipts or other +tracking data your mail client allow[…](https://awesome-privacy.xyz/communication/email-security-tools/email-privacy-tester "View full Email Privacy Tester report") + -
+ Stats + + [![GitHub: mikecardwell/email-privacy-tester](https://img.shields.io/github/stars/mikecardwell/email-privacy-tester?style=flat&logo=github&label=email-privacy-tester&color=%235f53f4&cacheSeconds=3600)](https://github.com/mikecardwell/email-privacy-tester) [![Privacy Policy](https://shields.tosdr.org/en_9837.svg)](https://tosdr.org/en/service/9837) [![Email Privacy Tester on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Email_Privacy_Tester)](https://awesome-privacy.xyz/communication/email-security-tools/email-privacy-tester) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/mikecardwell/email-privacy-tester)ㅤ
- **[icon DKIM Verifier](https://addons.thunderbird.net/en-US/thunderbird/addon/dkim-verifier/?collection_id=a5557f08-eafd-7a39-81c6-09127da790f7)** - Verifies DKIM signatures and shows the result in the e-mail header, in order to help spot spoofed emails (which do not come from the domain that they claim to). -[…](https://awesome-privacy.xyz/communication/email-security-tools/dkim-verifier "View full DKIM Verifier report") + -
Stats - [![GitHub: lieser/dkim_verifier](https://img.shields.io/github/stars/lieser/dkim_verifier?style=flat&logo=github&label=dkim_verifier&color=%235f53f4&cacheSeconds=3600)](https://github.com/lieser/dkim_verifier) [![DKIM Verifier on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DKIM_Verifier)](https://awesome-privacy.xyz/communication/email-security-tools/dkim-verifier) -˙ + [![GitHub: lieser/dkim_verifier](https://img.shields.io/github/stars/lieser/dkim_verifier?style=flat&logo=github&label=dkim_verifier&color=%235f53f4&cacheSeconds=3600)](https://github.com/lieser/dkim_verifier) [![DKIM Verifier on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DKIM_Verifier)](https://awesome-privacy.xyz/communication/email-security-tools/dkim-verifier)ㅤ
@@ -1027,25 +903,21 @@ spot spoofed emails (which do not come from the domain that they claim to). - **[icon Mumble](https://www.mumble.info/)** - Open source, low-latency, high quality voice chat software. You can host your own server, or use a hosted instance, there are client applications for Windows, -MacOS and Linux as well as third-party apps for Android and iOS. -[…](https://awesome-privacy.xyz/communication/voip-clients/mumble "View full Mumble report") +MacOS and Linux as well as third-party ap[…](https://awesome-privacy.xyz/communication/voip-clients/mumble "View full Mumble report") -
Stats - [![GitHub: mumble-voip/mumble](https://img.shields.io/github/stars/mumble-voip/mumble?style=flat&logo=github&label=mumble&color=%235f53f4&cacheSeconds=3600)](https://github.com/mumble-voip/mumble) [![Privacy Policy](https://shields.tosdr.org/en_3640.svg)](https://tosdr.org/en/service/3640) [![Mumble on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mumble)](https://awesome-privacy.xyz/communication/voip-clients/mumble) -˙ + [![GitHub: mumble-voip/mumble](https://img.shields.io/github/stars/mumble-voip/mumble?style=flat&logo=github&label=mumble&color=%235f53f4&cacheSeconds=3600)](https://github.com/mumble-voip/mumble) [![Privacy Policy](https://shields.tosdr.org/en_3640.svg)](https://tosdr.org/en/service/3640) [![Mumble on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mumble)](https://awesome-privacy.xyz/communication/voip-clients/mumble) [![Mumble on Google Play](https://img.shields.io/badge/-Mumble-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=se.lublin.mumla) [![Mumble on App Store](https://img.shields.io/badge/-Mumble-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/mumble/id443472808)ㅤ
- **[icon Linphone](https://www.linphone.org)** - Open source audio, video and IM groups with E2E encryption and built-in media server. [SIP](https://en.wikipedia.org/wiki/Session_Initiation_Protocol)-based evolving to [RCS](https://en.wikipedia.org/wiki/Rich_Communication_Services). -Native apps for Android, iOS, Windows, GNU/Linux and MacOS. -[…](https://awesome-privacy.xyz/communication/voip-clients/linphone "View full Linphone report") +Native apps for Android, iOS, Windows, GNU/Linux and MacOS.[…](https://awesome-privacy.xyz/communication/voip-clients/linphone "View full Linphone report") -
Stats - [![GitHub: BelledonneCommunications/linphone-desktop](https://img.shields.io/github/stars/BelledonneCommunications/linphone-desktop?style=flat&logo=github&label=linphone-desktop&color=%235f53f4&cacheSeconds=3600)](https://github.com/BelledonneCommunications/linphone-desktop) [![Linphone on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Linphone)](https://awesome-privacy.xyz/communication/voip-clients/linphone) -📦 Open Source ˙ + [![GitHub: BelledonneCommunications/linphone-desktop](https://img.shields.io/github/stars/BelledonneCommunications/linphone-desktop?style=flat&logo=github&label=linphone-desktop&color=%235f53f4&cacheSeconds=3600)](https://github.com/BelledonneCommunications/linphone-desktop) [![Linphone on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Linphone)](https://awesome-privacy.xyz/communication/voip-clients/linphone) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/BelledonneCommunications/linphone-desktop) [![Linphone on Google Play](https://img.shields.io/badge/-Linphone-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.linphone) [![Linphone on App Store](https://img.shields.io/badge/-Linphone-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/linphone/id360065638)ㅤ
@@ -1061,40 +933,51 @@ Native apps for Android, iOS, Windows, GNU/Linux and MacOS. ### Virtual Phone Numbers -- **[icon SMSPool](https://www.smspool.net)** - Don't feel comfortable giving out your phone number? Protect your online identity by using our one-time-use non-VoIP phone numbers. +- **[icon SMSPool](https://www.smspool.net)** - Don't feel comfortable giving out your phone number? Protect your online identity by using our one-time-use non-VoIP phone numbers. We support over 50+ countries and support over 300+ services. -[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/smspool "View full SMSPool report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_10033.svg)](https://tosdr.org/en/service/10033) [![SMSPool on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SMSPool)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/smspool) -💰 Accepts Anonymous Payment ˙ + [![Privacy Policy](https://shields.tosdr.org/en_10033.svg)](https://tosdr.org/en/service/10033) [![SMSPool on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SMSPool)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/smspool) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white) [![SMSPool on Google Play](https://img.shields.io/badge/-SMSPool-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.smspool.app) [![SMSPool on App Store](https://img.shields.io/badge/-SMSPool-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/app/smspool/id6474617801)ㅤ
- **[icon Silent.link](https://silent.link/)** - Anonymous eSIM for sending / receiving SMS, incoming calls and 4G / 5G internet + world-wide roaming. No data is required at sign-up. Affordable pricing, with -payments and top-ups accepted in BTC. Requires an eSim-compatible device. -[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/silent.link "View full Silent.link report") -- **[icon Crypton.sh](https://crypton.sh/)** - Physical SIM card in the cloud, for sending + receiving SMS messages. Messages -are encrypted using your chosen private key. Includes a web interface, as well -as an API for interacting with it from any device. Pricing is around €7.00/month, -and payment is accepted in BTC, XMR or credit card. -[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/crypton.sh "View full Crypton.sh report") +payments and top-ups accepted in BTC. Req[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/silent.link "View full Silent.link report") -
Stats - [![GitHub: rinzlerch/user-encryption-wrapper](https://img.shields.io/github/stars/rinzlerch/user-encryption-wrapper?style=flat&logo=github&label=user-encryption-wrapper&color=%235f53f4&cacheSeconds=3600)](https://github.com/rinzlerch/user-encryption-wrapper) [![Crypton.sh on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Crypton.sh)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/crypton.sh) -˙ + [![Silent.link on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Silent.link)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/silent.link)ㅤ + +
+- **[icon Crypton.sh](https://crypton.sh/)** - Physical SIM card in the cloud, for sending + receiving SMS messages. Messages +are encrypted using your chosen private key. Includes a web interface, as well +as an API for interacting with it from any[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/crypton.sh "View full Crypton.sh report") + -
+ Stats + + [![GitHub: rinzlerch/user-encryption-wrapper](https://img.shields.io/github/stars/rinzlerch/user-encryption-wrapper?style=flat&logo=github&label=user-encryption-wrapper&color=%235f53f4&cacheSeconds=3600)](https://github.com/rinzlerch/user-encryption-wrapper) [![Crypton.sh on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Crypton.sh)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/crypton.sh)ㅤ
- **[icon Jmp.chat](https://jmp.chat/)** - Phone number for incoming + outgoing calls and messages, provided by Soprani. Works with Jabber, Matrix, Snikket, XMPP or any SIP client. Pricing starts at -$4.99 / month. Only available in the US and Canada (as of 2024). -See alternate instances at [soprani.ca](https://soprani.ca/) -[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/jmp.chat "View full Jmp.chat report") +$4.99 / month. Only available in the US and[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/jmp.chat "View full Jmp.chat report") + -
+ Stats + + [![Jmp.chat on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jmp.chat)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/jmp.chat) [![Jmp.chat on Google Play](https://img.shields.io/badge/-Jmp.chat-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.cheogram.android.playstore)ㅤ + +
- **[icon MoneroSMS](https://monerosms.com)** - Anonymous SMS service able to activate accounts. Accessible over web, CLI, or email. Pricing starts at $3.60 / month. The service is in beta as of 2022. -[…](https://awesome-privacy.xyz/communication/virtual-phone-numbers/monerosms "View full MoneroSMS report") + + -
+ Stats + + [![MoneroSMS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MoneroSMS)](https://awesome-privacy.xyz/communication/virtual-phone-numbers/monerosms)ㅤ + +

⬆️ [Back to Top]

@@ -1106,60 +989,48 @@ Now more than ever we are relying on software to help with team collaboration. U - **[icon Rocket.Chat](https://rocket.chat)** - Easy-to-deploy, self-hosted team collaboration platform with stable, feature-rich cross-platform client apps. The UI is fast, good looking and intuitive, so very -little technical experience is needed for users of the platform. Rocket.Chat's -feature set is similar to Slack's, making it a good replacement for any team -looking to have greater control over their data. -[…](https://awesome-privacy.xyz/communication/team-collaboration/rocket.chat "View full Rocket.Chat report") +little technical experience is needed[…](https://awesome-privacy.xyz/communication/team-collaboration/rocket.chat "View full Rocket.Chat report") -
Stats - [![GitHub: RocketChat/Rocket.Chat](https://img.shields.io/github/stars/RocketChat/Rocket.Chat?style=flat&logo=github&label=Rocket.Chat&color=%235f53f4&cacheSeconds=3600)](https://github.com/RocketChat/Rocket.Chat) [![Privacy Policy](https://shields.tosdr.org/en_6533.svg)](https://tosdr.org/en/service/6533) [![Rocket.Chat on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Rocket.Chat)](https://awesome-privacy.xyz/communication/team-collaboration/rocket.chat) -📦 Open Source ˙ + [![GitHub: RocketChat/Rocket.Chat](https://img.shields.io/github/stars/RocketChat/Rocket.Chat?style=flat&logo=github&label=Rocket.Chat&color=%235f53f4&cacheSeconds=3600)](https://github.com/RocketChat/Rocket.Chat) [![Privacy Policy](https://shields.tosdr.org/en_6533.svg)](https://tosdr.org/en/service/6533) [![Rocket.Chat on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Rocket.Chat)](https://awesome-privacy.xyz/communication/team-collaboration/rocket.chat) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/RocketChat/Rocket.Chat) [![Rocket.Chat on Google Play](https://img.shields.io/badge/-Rocket.Chat-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=chat.rocket.android) [![Rocket.Chat on App Store](https://img.shields.io/badge/-Rocket.Chat-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/rocket-chat/id1148741252)ㅤ
- **[icon RetroShare](https://retroshare.cc/)** - Secure group communications, with the option to be used over Tor or I2P. Fast intuitive group and 1-to-1 chats with text and rich media using decentralized -chat rooms, with a mail feature for delivering messages to offline contacts. -A channels feature makes it possible for members of different teams to stay -up-to-date with each other, and to share files. Also includes built-in forums, -link aggregations, file sharing and voice and video calling. RetroShare is a -bit more complex to use than some alternatives, and the UI is quite *retro*, -so may not be appropriate for a non-technical team. -[…](https://awesome-privacy.xyz/communication/team-collaboration/retroshare "View full RetroShare report") +chat rooms, with a mail feature for deliveri[…](https://awesome-privacy.xyz/communication/team-collaboration/retroshare "View full RetroShare report") -
Stats - [![GitHub: RetroShare/RetroShare](https://img.shields.io/github/stars/RetroShare/RetroShare?style=flat&logo=github&label=RetroShare&color=%235f53f4&cacheSeconds=3600)](https://github.com/RetroShare/RetroShare) [![RetroShare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RetroShare)](https://awesome-privacy.xyz/communication/team-collaboration/retroshare) -📦 Open Source ˙ + [![GitHub: RetroShare/RetroShare](https://img.shields.io/github/stars/RetroShare/RetroShare?style=flat&logo=github&label=RetroShare&color=%235f53f4&cacheSeconds=3600)](https://github.com/RetroShare/RetroShare) [![RetroShare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RetroShare)](https://awesome-privacy.xyz/communication/team-collaboration/retroshare) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/RetroShare/RetroShare)ㅤ
- **[icon Element](https://element.io/)** - Privacy-focused messenger using the Matrix protocol. The Element client allows for group chat rooms, media sharing voice and video group calls. -[…](https://awesome-privacy.xyz/communication/team-collaboration/element "View full Element report") + -
Stats - [![GitHub: element-hq/element-web](https://img.shields.io/github/stars/element-hq/element-web?style=flat&logo=github&label=element-web&color=%235f53f4&cacheSeconds=3600)](https://github.com/element-hq/element-web) [![Privacy Policy](https://shields.tosdr.org/en_2498.svg)](https://tosdr.org/en/service/2498) [![Element on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Element)](https://awesome-privacy.xyz/communication/team-collaboration/element) -˙ + [![GitHub: element-hq/element-web](https://img.shields.io/github/stars/element-hq/element-web?style=flat&logo=github&label=element-web&color=%235f53f4&cacheSeconds=3600)](https://github.com/element-hq/element-web) [![Privacy Policy](https://shields.tosdr.org/en_2498.svg)](https://tosdr.org/en/service/2498) [![Element on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Element)](https://awesome-privacy.xyz/communication/team-collaboration/element) [![Element on Google Play](https://img.shields.io/badge/-Element-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=im.vector.app) [![Element on App Store](https://img.shields.io/badge/-Element-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/element-messenger/id1083446067)ㅤ
- **[icon Internet Relay Chat](https://en.wikipedia.org/wiki/IRC)** - An IRC-based solution is another option, being decentralized there is no point of failure, and it's easy to self-host. However it's important to keep security -in mind while configuring your IRC instance and ensure that channels are properly -encrypted - IRC tends to be better for open communications. There's a variety of -clients to choose from - popular options include: The Longe (Web-based), HexChat -(Linux), Pidgin (Linux), WeeChat (Linux, terminal-based), IceChat (Windows), -XChat Aqua (MacOS), Palaver (iOS) and Revolution (Android). -[…](https://awesome-privacy.xyz/communication/team-collaboration/internet-relay-chat "View full Internet Relay Chat report") -- **[icon Mattermost](https://mattermost.org/)** - Mattermost has an open source edition, which can be self-hosted. It makes a good -Slack alternative, with native desktop, mobile and web apps and a wide variety of -integrations. -[…](https://awesome-privacy.xyz/communication/team-collaboration/mattermost "View full Mattermost report") +in mind while configuring your IRC instan[…](https://awesome-privacy.xyz/communication/team-collaboration/internet-relay-chat "View full Internet Relay Chat report") -
Stats - [![GitHub: mattermost/mattermost](https://img.shields.io/github/stars/mattermost/mattermost?style=flat&logo=github&label=mattermost&color=%235f53f4&cacheSeconds=3600)](https://github.com/mattermost/mattermost) [![Privacy Policy](https://shields.tosdr.org/en_2994.svg)](https://tosdr.org/en/service/2994) [![Mattermost on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mattermost)](https://awesome-privacy.xyz/communication/team-collaboration/mattermost) -˙ + [![Internet Relay Chat on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Internet_Relay_Chat)](https://awesome-privacy.xyz/communication/team-collaboration/internet-relay-chat) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://en.wikipedia.org/wiki/IRC)ㅤ + +
+- **[icon Mattermost](https://mattermost.org/)** - Mattermost has an open source edition, which can be self-hosted. It makes a good +Slack alternative, with native desktop, mobile and web apps and a wide variety of +integrations. + + -
+ Stats + + [![GitHub: mattermost/mattermost](https://img.shields.io/github/stars/mattermost/mattermost?style=flat&logo=github&label=mattermost&color=%235f53f4&cacheSeconds=3600)](https://github.com/mattermost/mattermost) [![Privacy Policy](https://shields.tosdr.org/en_2994.svg)](https://tosdr.org/en/service/2994) [![Mattermost on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mattermost)](https://awesome-privacy.xyz/communication/team-collaboration/mattermost) [![Mattermost on Google Play](https://img.shields.io/badge/-Mattermost-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.mattermost.rn) [![Mattermost on App Store](https://img.shields.io/badge/-Mattermost-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/mattermost/id1257222717)ㅤ
@@ -1182,280 +1053,223 @@ The following browser add-ons give you better control over what content is able - **[icon Privacy Badger](https://privacybadger.org/)** - Blocks invisible trackers, in order to stop advertisers and other third-parties from secretly tracking where you go and what pages you look at. **Download**: [Chrome](https://chrome.google.com/webstore/detail/privacy-badger/pkehgijcmpdhfbdbbnkijodmdjhbjlgp) - -[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/privacy-badger17/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-badger "View full Privacy Badger report") +[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/privacy-badger17/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-badger "View full Privacy Badger report") -
Stats - [![GitHub: EFForg/privacybadger](https://img.shields.io/github/stars/EFForg/privacybadger?style=flat&logo=github&label=privacybadger&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/privacybadger) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![Privacy Badger on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Badger)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-badger) -📦 Open Source ˙ + [![GitHub: EFForg/privacybadger](https://img.shields.io/github/stars/EFForg/privacybadger?style=flat&logo=github&label=privacybadger&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/privacybadger) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![Privacy Badger on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Badger)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-badger) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/EFForg/privacybadger)ㅤ
- **[icon uBlock Origin](https://ublockorigin.com)** - Block ads, trackers and malware sites. **Download**: [Chrome](https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en-GB) - -[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/ublock-origin/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/ublock-origin "View full uBlock Origin report") +[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/ublock-origin/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/ublock-origin "View full uBlock Origin report") -
Stats - [![GitHub: gorhill/uBlock](https://img.shields.io/github/stars/gorhill/uBlock?style=flat&logo=github&label=uBlock&color=%235f53f4&cacheSeconds=3600)](https://github.com/gorhill/uBlock) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![uBlock Origin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=uBlock_Origin)](https://awesome-privacy.xyz/security-tools/browser-extensions/ublock-origin) -˙ + [![GitHub: gorhill/uBlock](https://img.shields.io/github/stars/gorhill/uBlock?style=flat&logo=github&label=uBlock&color=%235f53f4&cacheSeconds=3600)](https://github.com/gorhill/uBlock) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![uBlock Origin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=uBlock_Origin)](https://awesome-privacy.xyz/security-tools/browser-extensions/ublock-origin)ㅤ
- **[icon ScriptSafe](https://www.andryou.com/scriptsafe)** - Allows you to block the execution of certain scripts. **Download**: [Chrome](https://chromewebstore.google.com/detail/scriptsafe/oiigbmnaadbkfbmpbfijlflahbdbdgdf) - -[Opera](https://addons.opera.com/en/extensions/details/scriptsafe-2/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/scriptsafe "View full ScriptSafe report") +[Opera](https://addons.opera.com/en/extensions/details/scriptsafe-2/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/scriptsafe "View full ScriptSafe report") -
Stats - [![GitHub: andryou/scriptsafe](https://img.shields.io/github/stars/andryou/scriptsafe?style=flat&logo=github&label=scriptsafe&color=%235f53f4&cacheSeconds=3600)](https://github.com/andryou/scriptsafe) [![ScriptSafe on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ScriptSafe)](https://awesome-privacy.xyz/security-tools/browser-extensions/scriptsafe) -˙ + [![GitHub: andryou/scriptsafe](https://img.shields.io/github/stars/andryou/scriptsafe?style=flat&logo=github&label=scriptsafe&color=%235f53f4&cacheSeconds=3600)](https://github.com/andryou/scriptsafe) [![ScriptSafe on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ScriptSafe)](https://awesome-privacy.xyz/security-tools/browser-extensions/scriptsafe)ㅤ
- **[icon Firefox Multi-Account Containers](https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/)** - Firefox Multi-Account Containers lets you keep parts of your online life separated into color-coded tabs that preserve your privacy. Cookies are separated by container, allowing -you to use the web with multiple identities or accounts simultaneously. **Download**: -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/firefox-multi-account-containers "View full Firefox Multi-Account Containers report") +you to use the web wit[…](https://awesome-privacy.xyz/security-tools/browser-extensions/firefox-multi-account-containers "View full Firefox Multi-Account Containers report") -
Stats - [![GitHub: mozilla/multi-account-containers](https://img.shields.io/github/stars/mozilla/multi-account-containers?style=flat&logo=github&label=multi-account-containers&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/multi-account-containers) [![Firefox Multi-Account Containers on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox_Multi-Account_Containers)](https://awesome-privacy.xyz/security-tools/browser-extensions/firefox-multi-account-containers) -˙ + [![GitHub: mozilla/multi-account-containers](https://img.shields.io/github/stars/mozilla/multi-account-containers?style=flat&logo=github&label=multi-account-containers&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/multi-account-containers) [![Firefox Multi-Account Containers on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefox_Multi-Account_Containers)](https://awesome-privacy.xyz/security-tools/browser-extensions/firefox-multi-account-containers)ㅤ
- **[icon WebRTC-Leak-Prevent](https://diafygi.github.io/webrtc-ips)** - Provides user control over WebRTC privacy settings in Chromium, in order to prevent WebRTC leaks. **Download**: [Chrome](https://chrome.google.com/webstore/detail/webrtc-leak-prevent/eiadekoaikejlgdbkbdfeijglgfdalml?hl=en-GB). For Firefox users, you can do this through [browser settings](https://www.privacytools.io/browsers/#webrtc). -Test for WebRTC leaks, with [browserleaks.com/webrtc](https://browserleaks.com/webrtc) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/webrtc-leak-prevent "View full WebRTC-Leak-Prevent report") +Test for WebRTC leaks,[…](https://awesome-privacy.xyz/security-tools/browser-extensions/webrtc-leak-prevent "View full WebRTC-Leak-Prevent report") -
Stats - [![GitHub: aghorler/WebRTC-Leak-Prevent](https://img.shields.io/github/stars/aghorler/WebRTC-Leak-Prevent?style=flat&logo=github&label=WebRTC-Leak-Prevent&color=%235f53f4&cacheSeconds=3600)](https://github.com/aghorler/WebRTC-Leak-Prevent) [![WebRTC-Leak-Prevent on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WebRTC-Leak-Prevent)](https://awesome-privacy.xyz/security-tools/browser-extensions/webrtc-leak-prevent) -˙ + [![GitHub: aghorler/WebRTC-Leak-Prevent](https://img.shields.io/github/stars/aghorler/WebRTC-Leak-Prevent?style=flat&logo=github&label=WebRTC-Leak-Prevent&color=%235f53f4&cacheSeconds=3600)](https://github.com/aghorler/WebRTC-Leak-Prevent) [![WebRTC-Leak-Prevent on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WebRTC-Leak-Prevent)](https://awesome-privacy.xyz/security-tools/browser-extensions/webrtc-leak-prevent)ㅤ
- **[icon Canvas Fingerprint Blocker](https://add0n.com/canvas-fingerprint-blocker.html)** - Block fingerprint without removing access to HTML5 Canvas element. Canvas fingerprinting is commonly used for tracking, this extension helps to mitigate this through disallowing the browser -to generate a true unique key **Download**: [Chrome](https://chrome.google.com/webstore/detail/canvas-blocker-fingerprin/nomnklagbgmgghhjidfhnoelnjfndfpd) - -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/canvas-blocker-no-fingerprint/) - -[Edge](https://microsoftedge.microsoft.com/addons/detail/ahiddppepedlomdleppkbljnmkchlmdc) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/canvas-fingerprint-blocker "View full Canvas Fingerprint Blocker report") +to generat[…](https://awesome-privacy.xyz/security-tools/browser-extensions/canvas-fingerprint-blocker "View full Canvas Fingerprint Blocker report") -
Stats - [![GitHub: joue-quroi/canvas-fingerprint-blocker](https://img.shields.io/github/stars/joue-quroi/canvas-fingerprint-blocker?style=flat&logo=github&label=canvas-fingerprint-blocker&color=%235f53f4&cacheSeconds=3600)](https://github.com/joue-quroi/canvas-fingerprint-blocker) [![Canvas Fingerprint Blocker on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Canvas_Fingerprint_Blocker)](https://awesome-privacy.xyz/security-tools/browser-extensions/canvas-fingerprint-blocker) -˙ + [![GitHub: joue-quroi/canvas-fingerprint-blocker](https://img.shields.io/github/stars/joue-quroi/canvas-fingerprint-blocker?style=flat&logo=github&label=canvas-fingerprint-blocker&color=%235f53f4&cacheSeconds=3600)](https://github.com/joue-quroi/canvas-fingerprint-blocker) [![Canvas Fingerprint Blocker on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Canvas_Fingerprint_Blocker)](https://awesome-privacy.xyz/security-tools/browser-extensions/canvas-fingerprint-blocker)ㅤ
- **[icon ClearURLs](https://gitlab.com/KevinRoebert/ClearUrls)** - This extension will automatically remove tracking elements from the GET parameters of URLs to help protect some privacy **Download**: [Chrome](https://chrome.google.com/webstore/detail/clearurls/lckanjgmijmafbedllaakclkaicjfmnk) - -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/clearurls/) / [Source](https://gitlab.com/KevinRoebert/ClearUrls) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/clearurls "View full ClearURLs report") +[Firefox](https://addons.mozilla.org/en-US/firefox/addon/clearurls/) / [Source](https://gitlab.com/KevinRoebert/ClearUrls)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/clearurls "View full ClearURLs report") -
Stats - [![GitHub: ClearURLs/Addon](https://img.shields.io/github/stars/ClearURLs/Addon?style=flat&logo=github&label=Addon&color=%235f53f4&cacheSeconds=3600)](https://github.com/ClearURLs/Addon) [![Privacy Policy](https://shields.tosdr.org/en_7192.svg)](https://tosdr.org/en/service/7192) [![ClearURLs on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ClearURLs)](https://awesome-privacy.xyz/security-tools/browser-extensions/clearurls) -📦 Open Source ˙ + [![GitHub: ClearURLs/Addon](https://img.shields.io/github/stars/ClearURLs/Addon?style=flat&logo=github&label=Addon&color=%235f53f4&cacheSeconds=3600)](https://github.com/ClearURLs/Addon) [![Privacy Policy](https://shields.tosdr.org/en_7192.svg)](https://tosdr.org/en/service/7192) [![ClearURLs on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ClearURLs)](https://awesome-privacy.xyz/security-tools/browser-extensions/clearurls) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/ClearURLs/Addon)ㅤ
- **[icon CSS Exfil Protection](https://www.mike-gualtieri.com/css-exfil-vulnerability-tester)** - Sanitizes and blocks any CSS rules which may be designed to steal data, in order to guard against Exfil attacks **Download**: [Chrome](https://chrome.google.com/webstore/detail/css-exfil-protection/ibeemfhcbbikonfajhamlkdgedmekifo) - -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/css-exfil-protection/) - [Source](https://github.com/mlgualtieri/CSS-Exfil-Protection) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/css-exfil-protection "View full CSS Exfil Protection report") +[Firefox](https://addons.mozilla.org/en-US/firefox/addon/css-exfil-protection/) - [Source](https://github.com/mlgualtieri/CSS-Exfil-Protection)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/css-exfil-protection "View full CSS Exfil Protection report") -
Stats - [![GitHub: mlgualtieri/CSS-Exfil-Protection](https://img.shields.io/github/stars/mlgualtieri/CSS-Exfil-Protection?style=flat&logo=github&label=CSS-Exfil-Protection&color=%235f53f4&cacheSeconds=3600)](https://github.com/mlgualtieri/CSS-Exfil-Protection) [![CSS Exfil Protection on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CSS_Exfil_Protection)](https://awesome-privacy.xyz/security-tools/browser-extensions/css-exfil-protection) -˙ + [![GitHub: mlgualtieri/CSS-Exfil-Protection](https://img.shields.io/github/stars/mlgualtieri/CSS-Exfil-Protection?style=flat&logo=github&label=CSS-Exfil-Protection&color=%235f53f4&cacheSeconds=3600)](https://github.com/mlgualtieri/CSS-Exfil-Protection) [![CSS Exfil Protection on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CSS_Exfil_Protection)](https://awesome-privacy.xyz/security-tools/browser-extensions/css-exfil-protection)ㅤ
- **[icon First Party Isolation](https://github.com/mozfreddyb/webext-firstpartyisolation)** - Enables the First Party isolation preference (Clicking the Fishbowl icon temporarily disables it) **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/first-party-isolation/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/first-party-isolation "View full First Party Isolation report") + -
Stats - [![GitHub: mozfreddyb/webext-firstpartyisolation](https://img.shields.io/github/stars/mozfreddyb/webext-firstpartyisolation?style=flat&logo=github&label=webext-firstpartyisolation&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozfreddyb/webext-firstpartyisolation) [![First Party Isolation on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=First_Party_Isolation)](https://awesome-privacy.xyz/security-tools/browser-extensions/first-party-isolation) -˙ + [![GitHub: mozfreddyb/webext-firstpartyisolation](https://img.shields.io/github/stars/mozfreddyb/webext-firstpartyisolation?style=flat&logo=github&label=webext-firstpartyisolation&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozfreddyb/webext-firstpartyisolation) [![First Party Isolation on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=First_Party_Isolation)](https://awesome-privacy.xyz/security-tools/browser-extensions/first-party-isolation)ㅤ
- **[icon Privacy-Oriented Origin Policy](https://claustromaniac.github.io/poop)** - Prevent Firefox from sending Origin headers when they are least likely to be necessary, to protect your privacy **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/privacy-oriented-origin-policy/) - -[Source](https://github.com/claustromaniac/poop) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-oriented-origin-policy "View full Privacy-Oriented Origin Policy report") +[Source](https://github.com/claustromaniac/poop)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-oriented-origin-policy "View full Privacy-Oriented Origin Policy report") -
Stats - [![GitHub: claustromaniac/poop](https://img.shields.io/github/stars/claustromaniac/poop?style=flat&logo=github&label=poop&color=%235f53f4&cacheSeconds=3600)](https://github.com/claustromaniac/poop) [![Privacy-Oriented Origin Policy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy-Oriented_Origin_Policy)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-oriented-origin-policy) -˙ + [![GitHub: claustromaniac/poop](https://img.shields.io/github/stars/claustromaniac/poop?style=flat&logo=github&label=poop&color=%235f53f4&cacheSeconds=3600)](https://github.com/claustromaniac/poop) [![Privacy-Oriented Origin Policy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy-Oriented_Origin_Policy)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-oriented-origin-policy)ㅤ
- **[icon LocalCDN](https://www.localcdn.org/)** - Emulates remote frameworks (e.g. jQuery, Bootstrap, Angular) and delivers them as local resource. -Prevents unnecessary 3rd party requests to tracking CDNs **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/localcdn-fork-of-decentraleyes/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/localcdn "View full LocalCDN report") -- **[icon Decentraleyes](https://decentraleyes.org)** - Similar to LocalCDN, Serves up local versions of common scripts instead of calling to 3rd-party CDN. -Improves privacy and load times. Works out-of-the-box and plays nicely with regular content blockers. -**Download**: [Chrome](https://chrome.google.com/webstore/detail/decentraleyes/ldpochfccmkkmhdbclfhpagapcfdljkj) - -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/decentraleyes) - -[Opera](https://addons.opera.com/en/extensions/details/decentraleyes) - -[Pale Moon](https://addons.palemoon.org/addon/decentraleyes) - -[Source](https://git.synz.io/Synzvato/decentraleyes) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/decentraleyes "View full Decentraleyes report") -- **[icon Privacy Essentials](https://duckduckgo.com/app)** - Simple extension by DuckDuckGo, which grades the security of each site. **Download**: -[Chrome](https://chrome.google.com/webstore/detail/duckduckgo-privacy-essent/bkdgflcldnnnapblkhphbgpggdiikppg?hl=en-GB) \ -[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/duckduckgo-for-firefox/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-essentials "View full Privacy Essentials report") +Prevents unnecessary 3rd party requests to tracking CDNs **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/localcdn-fork-of-decentraleyes/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/localcdn "View full LocalCDN report") -
Stats - [![GitHub: duckduckgo/duckduckgo-privacy-extension](https://img.shields.io/github/stars/duckduckgo/duckduckgo-privacy-extension?style=flat&logo=github&label=duckduckgo-privacy-extension&color=%235f53f4&cacheSeconds=3600)](https://github.com/duckduckgo/duckduckgo-privacy-extension) [![Privacy Policy](https://shields.tosdr.org/en_222.svg)](https://tosdr.org/en/service/222) [![Privacy Essentials on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Essentials)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-essentials) -📦 Open Source ˙ + [![LocalCDN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LocalCDN)](https://awesome-privacy.xyz/security-tools/browser-extensions/localcdn) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.localcdn.org/)ㅤ + +
+- **[icon Decentraleyes](https://decentraleyes.org)** - Similar to LocalCDN, Serves up local versions of common scripts instead of calling to 3rd-party CDN. +Improves privacy and load times. Works out-of-the-box and plays nicely with regular content blocker[…](https://awesome-privacy.xyz/security-tools/browser-extensions/decentraleyes "View full Decentraleyes report") + -
+ Stats + + [![Decentraleyes on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Decentraleyes)](https://awesome-privacy.xyz/security-tools/browser-extensions/decentraleyes) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://decentraleyes.org)ㅤ + +
+- **[icon Privacy Essentials](https://duckduckgo.com/app)** - Simple extension by DuckDuckGo, which grades the security of each site. **Download**: +[Chrome](https://chrome.google.com/webstore/detail/duckduckgo-privacy-essent/bkdgflcldnnnapblkhphbgpggdiikppg?hl=en-GB) \ +[Firefox](https://addons.mozilla.org/en-GB/firefox/addon/duckduckgo-for-firefox/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-essentials "View full Privacy Essentials report") + -
+ Stats + + [![GitHub: duckduckgo/duckduckgo-privacy-extension](https://img.shields.io/github/stars/duckduckgo/duckduckgo-privacy-extension?style=flat&logo=github&label=duckduckgo-privacy-extension&color=%235f53f4&cacheSeconds=3600)](https://github.com/duckduckgo/duckduckgo-privacy-extension) [![Privacy Policy](https://shields.tosdr.org/en_222.svg)](https://tosdr.org/en/service/222) [![Privacy Essentials on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Essentials)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-essentials) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/duckduckgo/duckduckgo-privacy-extension)ㅤ
- **[icon Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect)** - A simple web extension that redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives -**Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) - [Chrome](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-redirect "View full Privacy Redirect report") +**Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) - [Chrome](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-redirect "View full Privacy Redirect report") -
Stats - [![GitHub: SimonBrazell/privacy-redirect](https://img.shields.io/github/stars/SimonBrazell/privacy-redirect?style=flat&logo=github&label=privacy-redirect&color=%235f53f4&cacheSeconds=3600)](https://github.com/SimonBrazell/privacy-redirect) [![Privacy Redirect on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Redirect)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-redirect) -˙ + [![GitHub: SimonBrazell/privacy-redirect](https://img.shields.io/github/stars/SimonBrazell/privacy-redirect?style=flat&logo=github&label=privacy-redirect&color=%235f53f4&cacheSeconds=3600)](https://github.com/SimonBrazell/privacy-redirect) [![Privacy Redirect on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy_Redirect)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-redirect)ㅤ
- **[icon User Agent Switcher](https://add0n.com/useragent-switcher.html)** - Spoofs browser's User-Agent string, making it appear that you are on a different device, browser and version to -what you are actually using. This alone does very little for privacy, but combined with other tools, can allow you -to keep your fingerprint changing, and feed fake info to sites tracking you. Some websites show different content, -depending on your user agent. **Download**: -[Chrome](https://chrome.google.com/webstore/detail/user-agent-switcher/bhchdcejhohfmigjafbampogmaanbfkg) - -[Firefox](https://addons.mozilla.org/firefox/addon/user-agent-string-switcher/) - -[Edge](https://microsoftedge.microsoft.com/addons/detail/cnjkedgepfdpdbnepgmajmmjdjkjnifa) - -[Opera](https://addons.opera.com/extensions/details/user-agent-switcher-8/) - -[Source](https://github.com/ray-lothian/UserAgent-Switcher/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/user-agent-switcher "View full User Agent Switcher report") +what you are actually using. This alone does very little for privacy, but combined with[…](https://awesome-privacy.xyz/security-tools/browser-extensions/user-agent-switcher "View full User Agent Switcher report") -
Stats - [![GitHub: ray-lothian/UserAgent-Switcher](https://img.shields.io/github/stars/ray-lothian/UserAgent-Switcher?style=flat&logo=github&label=UserAgent-Switcher&color=%235f53f4&cacheSeconds=3600)](https://github.com/ray-lothian/UserAgent-Switcher) [![User Agent Switcher on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=User_Agent_Switcher)](https://awesome-privacy.xyz/security-tools/browser-extensions/user-agent-switcher) -˙ + [![GitHub: ray-lothian/UserAgent-Switcher](https://img.shields.io/github/stars/ray-lothian/UserAgent-Switcher?style=flat&logo=github&label=UserAgent-Switcher&color=%235f53f4&cacheSeconds=3600)](https://github.com/ray-lothian/UserAgent-Switcher) [![User Agent Switcher on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=User_Agent_Switcher)](https://awesome-privacy.xyz/security-tools/browser-extensions/user-agent-switcher)ㅤ
- **[icon PrivacySpy](https://privacyspy.org)** - The companion extension for PrivacySpy.org - an open project that rates, annotates, and archives privacy policies. -The extension shows a score for the privacy policy of the current website. **Download**: -[Chrome](https://chrome.google.com/webstore/detail/privacyspy/ppembnadnhiknioggbglgiciihgmkmnd) - -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/privacyspy/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacyspy "View full PrivacySpy report") +The extension shows a score for the privacy policy of the current website. **Download**:[…](https://awesome-privacy.xyz/security-tools/browser-extensions/privacyspy "View full PrivacySpy report") -
Stats - [![GitHub: politiwatch/privacyspy](https://img.shields.io/github/stars/politiwatch/privacyspy?style=flat&logo=github&label=privacyspy&color=%235f53f4&cacheSeconds=3600)](https://github.com/politiwatch/privacyspy) [![Privacy Policy](https://shields.tosdr.org/en_4346.svg)](https://tosdr.org/en/service/4346) [![PrivacySpy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PrivacySpy)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacyspy) -˙ + [![GitHub: politiwatch/privacyspy](https://img.shields.io/github/stars/politiwatch/privacyspy?style=flat&logo=github&label=privacyspy&color=%235f53f4&cacheSeconds=3600)](https://github.com/politiwatch/privacyspy) [![Privacy Policy](https://shields.tosdr.org/en_4346.svg)](https://tosdr.org/en/service/4346) [![PrivacySpy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PrivacySpy)](https://awesome-privacy.xyz/security-tools/browser-extensions/privacyspy)ㅤ
- **[icon HTTPZ](https://github.com/claustromaniac/httpz)** - Simplified HTTPS upgrades for Firefox (lightweight alternative to HTTPS-Everywhere) **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/httpz/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/httpz "View full HTTPZ report") + -
Stats - [![GitHub: claustromaniac/httpz](https://img.shields.io/github/stars/claustromaniac/httpz?style=flat&logo=github&label=httpz&color=%235f53f4&cacheSeconds=3600)](https://github.com/claustromaniac/httpz) [![HTTPZ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HTTPZ)](https://awesome-privacy.xyz/security-tools/browser-extensions/httpz) -˙ + [![GitHub: claustromaniac/httpz](https://img.shields.io/github/stars/claustromaniac/httpz?style=flat&logo=github&label=httpz&color=%235f53f4&cacheSeconds=3600)](https://github.com/claustromaniac/httpz) [![HTTPZ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HTTPZ)](https://awesome-privacy.xyz/security-tools/browser-extensions/httpz)ㅤ
- **[icon Skip Redirect](https://github.com/sblask/webextension-skip-redirect)** - Some web pages use intermediary pages before redirecting to a final page. This add-on tries to extract the final url from the intermediary url and goes there straight away if successful **Download**: -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/skip-redirect/) - -[Source](https://github.com/sblask/webextension-skip-redirect) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/skip-redirect "View full Skip Redirect report") +[Firefox](https://addons.mozilla.org/en-US/firefox/addon/skip-redirect/)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/skip-redirect "View full Skip Redirect report") -
Stats - [![GitHub: sblask/webextension-skip-redirect](https://img.shields.io/github/stars/sblask/webextension-skip-redirect?style=flat&logo=github&label=webextension-skip-redirect&color=%235f53f4&cacheSeconds=3600)](https://github.com/sblask/webextension-skip-redirect) [![Skip Redirect on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Skip_Redirect)](https://awesome-privacy.xyz/security-tools/browser-extensions/skip-redirect) -˙ + [![GitHub: sblask/webextension-skip-redirect](https://img.shields.io/github/stars/sblask/webextension-skip-redirect?style=flat&logo=github&label=webextension-skip-redirect&color=%235f53f4&cacheSeconds=3600)](https://github.com/sblask/webextension-skip-redirect) [![Skip Redirect on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Skip_Redirect)](https://awesome-privacy.xyz/security-tools/browser-extensions/skip-redirect)ㅤ
- **[icon Web Archives](https://github.com/dessant/web-archives)** - View archived and cached versions of web pages on 10+ search engines, such as the Wayback Machine, Archive.is, Google etc -Useful for checking legitimacy of websites, and viewing change logs **Download**: -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/view-page-archive/) - -[Chrome](https://chrome.google.com/webstore/detail/web-archives/hkligngkgcpcolhcnkgccglchdafcnao) - -[Edge](https://microsoftedge.microsoft.com/addons/detail/apcfghlggldjdjepjnahfdjgdcdekhda) - -[Source](https://github.com/dessant/web-archives) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/web-archives "View full Web Archives report") +Useful for checking legitimacy of websites, and viewing change logs **Download**:[…](https://awesome-privacy.xyz/security-tools/browser-extensions/web-archives "View full Web Archives report") -
Stats - [![GitHub: dessant/web-archives](https://img.shields.io/github/stars/dessant/web-archives?style=flat&logo=github&label=web-archives&color=%235f53f4&cacheSeconds=3600)](https://github.com/dessant/web-archives) [![Web Archives on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Web_Archives)](https://awesome-privacy.xyz/security-tools/browser-extensions/web-archives) -˙ + [![GitHub: dessant/web-archives](https://img.shields.io/github/stars/dessant/web-archives?style=flat&logo=github&label=web-archives&color=%235f53f4&cacheSeconds=3600)](https://github.com/dessant/web-archives) [![Web Archives on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Web_Archives)](https://awesome-privacy.xyz/security-tools/browser-extensions/web-archives)ㅤ
- **[icon Flagfox](https://flagfox.wordpress.com/)** - Displays a country flag depicting the location of the current website's server, which can be useful to know at a glance. -Click icon for more tools such as site safety checks, whois, validation etc **Download**: -[Firefox](https://addons.mozilla.org/en-US/firefox/addon/flagfox/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/flagfox "View full Flagfox report") +Click icon for more tools such as site safety checks, whois, validation etc **Download**[…](https://awesome-privacy.xyz/security-tools/browser-extensions/flagfox "View full Flagfox report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_6150.svg)](https://tosdr.org/en/service/6150) [![Flagfox on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Flagfox)](https://awesome-privacy.xyz/security-tools/browser-extensions/flagfox) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_6150.svg)](https://tosdr.org/en/service/6150) [![Flagfox on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Flagfox)](https://awesome-privacy.xyz/security-tools/browser-extensions/flagfox)ㅤ
-- **[icon Lightbeam](https://mozilla.github.io/lightbeam/)** - Visualize in detail the servers you are contacting when you are surfing on the Internet. Created by Gary Kovacs (former CEO of Mozilla), presented in his [TED Talk](https://www.ted.com/talks/gary_kovacs_tracking_our_online_trackers). **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/lightbeam-3-0/) - [Source](https://github.com/mozilla/lightbeam-we) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/lightbeam "View full Lightbeam report") +- **[icon Lightbeam](https://mozilla.github.io/lightbeam/)** - Visualize in detail the servers you are contacting when you are surfing on the Internet. Created by Gary Kovacs (former CEO of Mozilla), presented in his [TED Talk](https://www.ted.com/talks/gary_kovacs_tracking_our_online_trackers). **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/lightbeam-3-0/) - [Source](https://github.com/mozilla/lightbeam-we)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/lightbeam "View full Lightbeam report") -
Stats - [![GitHub: mozilla/lightbeam-we](https://img.shields.io/github/stars/mozilla/lightbeam-we?style=flat&logo=github&label=lightbeam-we&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/lightbeam-we) [![Lightbeam on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Lightbeam)](https://awesome-privacy.xyz/security-tools/browser-extensions/lightbeam) -˙ + [![GitHub: mozilla/lightbeam-we](https://img.shields.io/github/stars/mozilla/lightbeam-we?style=flat&logo=github&label=lightbeam-we&color=%235f53f4&cacheSeconds=3600)](https://github.com/mozilla/lightbeam-we) [![Lightbeam on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Lightbeam)](https://awesome-privacy.xyz/security-tools/browser-extensions/lightbeam)ㅤ
-- **[icon Track Me Not](http://trackmenot.io)** - Helps protect web searchers from surveillance and data-profiling, through creating meaningless noise and obfuscation, outlined in their [whitepaper](http://trackmenot.io/resources/trackmenot2009.pdf). Controversial whether or not this is a good approach **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/trackmenot/) - [Source](https://github.com/vtoubiana/TrackMeNot) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/track-me-not "View full Track Me Not report") +- **[icon Track Me Not](http://trackmenot.io)** - Helps protect web searchers from surveillance and data-profiling, through creating meaningless noise and obfuscation, outlined in their [whitepaper](http://trackmenot.io/resources/trackmenot2009.pdf). Controversial whether or not this is a good approach[…](https://awesome-privacy.xyz/security-tools/browser-extensions/track-me-not "View full Track Me Not report") -
Stats - [![GitHub: vtoubiana/TrackMeNot](https://img.shields.io/github/stars/vtoubiana/TrackMeNot?style=flat&logo=github&label=TrackMeNot&color=%235f53f4&cacheSeconds=3600)](https://github.com/vtoubiana/TrackMeNot) [![Track Me Not on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Track_Me_Not)](https://awesome-privacy.xyz/security-tools/browser-extensions/track-me-not) -˙ + [![GitHub: vtoubiana/TrackMeNot](https://img.shields.io/github/stars/vtoubiana/TrackMeNot?style=flat&logo=github&label=TrackMeNot&color=%235f53f4&cacheSeconds=3600)](https://github.com/vtoubiana/TrackMeNot) [![Track Me Not on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Track_Me_Not)](https://awesome-privacy.xyz/security-tools/browser-extensions/track-me-not)ㅤ
-- **[icon AmIUnique Timeline](https://amiunique.org/timeline)** - Enables you to better understand the evolution of browser fingerprints (which is what websites use to uniquely identify and track you). **Download**: [Chrome](https://chrome.google.com/webstore/detail/amiunique/pigjfndpomdldkmoaiiigpbncemhjeca) - [Firefox](https://addons.mozilla.org/en-US/firefox/addon/amiunique) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/amiunique-timeline "View full AmIUnique Timeline report") +- **[icon AmIUnique Timeline](https://amiunique.org/timeline)** - Enables you to better understand the evolution of browser fingerprints (which is what websites use to uniquely identify and track you). **Download**: [Chrome](https://chrome.google.com/webstore/detail/amiunique/pigjfndpomdldkmoaiiigpbncemhjeca) - [Firefox](https://addons.mozilla.org/en-US/firefox/addon/amiunique)[…](https://awesome-privacy.xyz/security-tools/browser-extensions/amiunique-timeline "View full AmIUnique Timeline report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_4202.svg)](https://tosdr.org/en/service/4202) [![AmIUnique Timeline on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AmIUnique_Timeline)](https://awesome-privacy.xyz/security-tools/browser-extensions/amiunique-timeline) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_4202.svg)](https://tosdr.org/en/service/4202) [![AmIUnique Timeline on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AmIUnique_Timeline)](https://awesome-privacy.xyz/security-tools/browser-extensions/amiunique-timeline)ㅤ + +
+- **[icon Netcraft Extension](https://www.netcraft.com/apps/browser)** - Notifies you when visiting a known or potential phishing site, and detects suspicious JavaScript (including skimmers and miners). Also provides a simple rating for a given site's legitimacy and securi[…](https://awesome-privacy.xyz/security-tools/browser-extensions/netcraft-extension "View full Netcraft Extension report") + -
+ Stats + + [![Netcraft Extension on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Netcraft_Extension)](https://awesome-privacy.xyz/security-tools/browser-extensions/netcraft-extension)ㅤ
-- **[icon Netcraft Extension](https://www.netcraft.com/apps/browser)** - Notifies you when visiting a known or potential phishing site, and detects suspicious JavaScript (including skimmers and miners). Also provides a simple rating for a given site's legitimacy and security. Great for less technical users. Netcraft also has a handy online tool: [Site Report](https://sitereport.netcraft.com/) for checking what any given website is running. **Download**: [Chrome](https://chrome.google.com/webstore/detail/netcraft-anti-phishing-ex/bmejphbfclcpmpohkggcjeibfilpamia) \ [Firefox](https://addons.mozilla.org/en-us/firefox/addon/netcraft-toolbar?src=external-apps-hero) \ [Opera](https://addons.opera.com/en/extensions/details/netcraft-anti-phishing-extension/) \ [Edge](https://microsoftedge.microsoft.com/addons/detail/netcraft-extension/ngjhgbnmdjjnmejmpamalgnlnmopllkm) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/netcraft-extension "View full Netcraft Extension report") - **[icon HTTPS Everywhere](https://eff.org/https-everywhere)** - **NOTE** On modern browsers, this is [no longer needed](https://www.eff.org/deeplinks/2021/09/https-actually-everywhere) Forces sites to load in HTTPS, in order to encrypt your communications with websites, making your browsing more secure (Similar to [Smart HTTPS](https://mybrowseraddon.com/smart-https.html)). -Note this functionality is now included by default in most modern browsers. **Download**: -[Chrome](https://www.eff.org/https-everywhere) \ -[Firefox](https://www.eff.org/files/https-everywhere-latest.xpi) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/https-everywhere "View full HTTPS Everywhere report") +Note[…](https://awesome-privacy.xyz/security-tools/browser-extensions/https-everywhere "View full HTTPS Everywhere report") -
Stats - [![GitHub: EFForg/https-everywhere](https://img.shields.io/github/stars/EFForg/https-everywhere?style=flat&logo=github&label=https-everywhere&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/https-everywhere) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![HTTPS Everywhere on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HTTPS_Everywhere)](https://awesome-privacy.xyz/security-tools/browser-extensions/https-everywhere) -˙ + [![GitHub: EFForg/https-everywhere](https://img.shields.io/github/stars/EFForg/https-everywhere?style=flat&logo=github&label=https-everywhere&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/https-everywhere) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![HTTPS Everywhere on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HTTPS_Everywhere)](https://awesome-privacy.xyz/security-tools/browser-extensions/https-everywhere)ㅤ
- **[icon Linguist](https://linguister.io)** - Linguist is a privacy‑focused translation solution in-browser that has an embedded offline translator and lets users create [custom translators](https://linguister.io/docs/CustomTranslator) to use any translation API, -even if it's locally deployed. -Full-page translation, selected text translation, dictionary, history, -and other features you may expect of a full-featured translation solution in-browser. **Download**: -[Chrome](https://chrome.google.com/webstore/detail/gbefmodhlophhakmoecijeppjblibmie) / [Firefox](https://addons.mozilla.org/addon/linguist-translator/) -[…](https://awesome-privacy.xyz/security-tools/browser-extensions/linguist "View full Linguist report") +even if it's locally deployed[…](https://awesome-privacy.xyz/security-tools/browser-extensions/linguist "View full Linguist report") -
Stats - [![GitHub: https://github.com/translate-tools/linguist](https://img.shields.io/github/stars/https://github.com/translate-tools/linguist?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/translate-tools/linguist) [![Linguist on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Linguist)](https://awesome-privacy.xyz/security-tools/browser-extensions/linguist) -˙ + [![GitHub: https://github.com/translate-tools/linguist](https://img.shields.io/github/stars/https://github.com/translate-tools/linguist?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/translate-tools/linguist) [![Linguist on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Linguist)](https://awesome-privacy.xyz/security-tools/browser-extensions/linguist)ㅤ
@@ -1474,7 +1288,7 @@ and other features you may expect of a full-featured translation solution in-bro
✳️ Notable Mentions -> - [Extension source viewer](https://addons.mozilla.org/en-US/firefox/addon/crxviewer) - A handy extension for viewing the source code of another browser extension, which is a useful tool for verifying the code does what it says +> - [Extension source viewer](https://addons.mozilla.org/en-US/firefox/addon/crxviewer) - A handy extension for viewing the source code of another browser extension, which is a useful tool for verifying the code does what it says

⬆️ [Back to Top]

@@ -1485,206 +1299,224 @@ and other features you may expect of a full-featured translation solution in-bro - **[icon Orbot](https://support.torproject.org/glossary/orbot/)** - System-wide Tor proxy, which encrypts your connection through multiple nodes. You can also use it alongside Tor Browser to access .onion sites. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/orbot "View full Orbot report") + -
Stats - [![GitHub: guardianproject/orbot](https://img.shields.io/github/stars/guardianproject/orbot?style=flat&logo=github&label=orbot&color=%235f53f4&cacheSeconds=3600)](https://github.com/guardianproject/orbot) [![Orbot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Orbot)](https://awesome-privacy.xyz/security-tools/mobile-apps/orbot) -˙ + [![GitHub: guardianproject/orbot](https://img.shields.io/github/stars/guardianproject/orbot?style=flat&logo=github&label=orbot&color=%235f53f4&cacheSeconds=3600)](https://github.com/guardianproject/orbot) [![Orbot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Orbot)](https://awesome-privacy.xyz/security-tools/mobile-apps/orbot)ㅤ
- **[icon NetGuard](https://netguard.me/)** - A firewall app for Android, which does not require root. NetGuard provides simple and advanced ways to block access to the internet, where applications and addresses -can individually be allowed or denied access to your Wi-Fi and/or mobile connection. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/netguard "View full NetGuard report") +can individually be allowed or den[…](https://awesome-privacy.xyz/security-tools/mobile-apps/netguard "View full NetGuard report") -
Stats - [![GitHub: M66B/NetGuard](https://img.shields.io/github/stars/M66B/NetGuard?style=flat&logo=github&label=NetGuard&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/NetGuard) [![NetGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetGuard)](https://awesome-privacy.xyz/security-tools/mobile-apps/netguard) -˙ + [![GitHub: M66B/NetGuard](https://img.shields.io/github/stars/M66B/NetGuard?style=flat&logo=github&label=NetGuard&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/NetGuard) [![NetGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetGuard)](https://awesome-privacy.xyz/security-tools/mobile-apps/netguard) [![NetGuard on Google Play](https://img.shields.io/badge/-NetGuard-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.torproject.android)ㅤ
- **[icon Island](https://island.oasisfeng.com/)** - A sandbox environment, allowing you to clone selected apps and run them in an isolated box, preventing it from accessing your personal data, or device information. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/island "View full Island report") + -
Stats - [![GitHub: oasisfeng/island](https://img.shields.io/github/stars/oasisfeng/island?style=flat&logo=github&label=island&color=%235f53f4&cacheSeconds=3600)](https://github.com/oasisfeng/island) [![Island on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Island)](https://awesome-privacy.xyz/security-tools/mobile-apps/island) -˙ + [![GitHub: oasisfeng/island](https://img.shields.io/github/stars/oasisfeng/island?style=flat&logo=github&label=island&color=%235f53f4&cacheSeconds=3600)](https://github.com/oasisfeng/island) [![Island on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Island)](https://awesome-privacy.xyz/security-tools/mobile-apps/island) [![Island on Google Play](https://img.shields.io/badge/-Island-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.oasisfeng.island)ㅤ
- **[icon Insular](https://gitlab.com/secure-system/Insular)** - An actively-maintained fork of the Island project with additional enhancements -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/insular "View full Insular report") + -
Stats - [![GitHub: oasisfeng/island](https://img.shields.io/github/stars/oasisfeng/island?style=flat&logo=github&label=island&color=%235f53f4&cacheSeconds=3600)](https://github.com/oasisfeng/island) [![Insular on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Insular)](https://awesome-privacy.xyz/security-tools/mobile-apps/insular) -˙ + [![GitHub: oasisfeng/island](https://img.shields.io/github/stars/oasisfeng/island?style=flat&logo=github&label=island&color=%235f53f4&cacheSeconds=3600)](https://github.com/oasisfeng/island) [![Insular on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Insular)](https://awesome-privacy.xyz/security-tools/mobile-apps/insular)ㅤ
- **[icon Exodus](https://exodus-privacy.eu.org/en/page/what/#android-app)** - Shows which trackers, each of your installed apps is using, so that you can better understand how your data is being collected. Uses data from the Exodus database of scanned APKs. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/exodus "View full Exodus report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3843.svg)](https://tosdr.org/en/service/3843) [![Exodus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Exodus)](https://awesome-privacy.xyz/security-tools/mobile-apps/exodus) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3843.svg)](https://tosdr.org/en/service/3843) [![Exodus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Exodus)](https://awesome-privacy.xyz/security-tools/mobile-apps/exodus) [![Exodus on Google Play](https://img.shields.io/badge/-Exodus-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.eu.exodus_privacy.exodusprivacy)ㅤ
- **[icon Bouncer](https://play.google.com/store/apps/details?id=com.samruston.permission)** - Gives you the ability to grant permissions temporarily, so that you could for example use the camera to take a profile picture, but when you close the given app, those permissions will be revoked. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/bouncer "View full Bouncer report") -- **[icon XPrivacyLua](https://lua.xprivacy.eu/)** - Simple to use privacy manager for Android, that enables you to feed apps fake data when -they request intimate permissions. Solves the problem caused by apps malfunctioning when -you revoke permissions, and protects your real data by only sharing fake information. Enables -you to hide call log, calendar, SMS messages, location, installed apps, photos, clipboard, -network data plus more. And prevents access to camera, microphone, telemetry, GPS and other sensors. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/xprivacylua "View full XPrivacyLua report") + -
Stats - [![GitHub: M66B/XPrivacyLua](https://img.shields.io/github/stars/M66B/XPrivacyLua?style=flat&logo=github&label=XPrivacyLua&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/XPrivacyLua) [![XPrivacyLua on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XPrivacyLua)](https://awesome-privacy.xyz/security-tools/mobile-apps/xprivacylua) -˙ + [![Bouncer on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bouncer)](https://awesome-privacy.xyz/security-tools/mobile-apps/bouncer) [![Bouncer on Google Play](https://img.shields.io/badge/-Bouncer-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.samruston.permission)ㅤ + +
+- **[icon XPrivacyLua](https://lua.xprivacy.eu/)** - Simple to use privacy manager for Android, that enables you to feed apps fake data when +they request intimate permissions. Solves the problem caused by apps malfunctioning when +you revoke permissions,[…](https://awesome-privacy.xyz/security-tools/mobile-apps/xprivacylua "View full XPrivacyLua report") + -
+ Stats + + [![GitHub: M66B/XPrivacyLua](https://img.shields.io/github/stars/M66B/XPrivacyLua?style=flat&logo=github&label=XPrivacyLua&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/XPrivacyLua) [![XPrivacyLua on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XPrivacyLua)](https://awesome-privacy.xyz/security-tools/mobile-apps/xprivacylua)ㅤ
- **[icon SuperFreezZ](https://superfreezz.gitlab.io/)** - Makes it possible to entirely freeze all background activities on a per-app basis. Intended purpose is to speed up your phone, and prolong battery life, but this app is -also a great utility to stop certain apps from collecting data and tracking your actions -while running in the background. See on [F-Droid](https://f-droid.org/en/packages/superfreeze.tool.android) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/superfreezz "View full SuperFreezZ report") -- **[icon Haven](https://guardianproject.github.io/haven/)** - Allows you to protect yourself, your personal space and your possessions - without -compromising on security. Leveraging device sensors to monitor nearby space, Haven was -developed by The Guardian Project, in partnership with Edward Snowden. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/haven "View full Haven report") +also a great utility to stop ce[…](https://awesome-privacy.xyz/security-tools/mobile-apps/superfreezz "View full SuperFreezZ report") -
Stats - [![GitHub: guardianproject/haven](https://img.shields.io/github/stars/guardianproject/haven?style=flat&logo=github&label=haven&color=%235f53f4&cacheSeconds=3600)](https://github.com/guardianproject/haven) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![Haven on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Haven)](https://awesome-privacy.xyz/security-tools/mobile-apps/haven) -˙ + [![SuperFreezZ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SuperFreezZ)](https://awesome-privacy.xyz/security-tools/mobile-apps/superfreezz)ㅤ + +
+- **[icon Haven](https://guardianproject.github.io/haven/)** - Allows you to protect yourself, your personal space and your possessions - without +compromising on security. Leveraging device sensors to monitor nearby space, Haven was +developed by The Guardian Proj[…](https://awesome-privacy.xyz/security-tools/mobile-apps/haven "View full Haven report") + -
+ Stats + + [![GitHub: guardianproject/haven](https://img.shields.io/github/stars/guardianproject/haven?style=flat&logo=github&label=haven&color=%235f53f4&cacheSeconds=3600)](https://github.com/guardianproject/haven) [![Privacy Policy](https://shields.tosdr.org/en_682.svg)](https://tosdr.org/en/service/682) [![Haven on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Haven)](https://awesome-privacy.xyz/security-tools/mobile-apps/haven) [![Haven on Google Play](https://img.shields.io/badge/-Haven-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.havenapp.main)ㅤ
- **[icon Secure Task](https://play.google.com/store/apps/details?id=com.balda.securetask)** - Triggers actions, when certain security conditions are met, such as multiple failed login attempts or monitor settings changed. It does require Tasker, and needs to be set up with -ADB, device does not need to be rooted. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/secure-task "View full Secure Task report") -- **[icon Cryptomator](https://cryptomator.org/android/)** - Encrypts files and folders client-side, before uploading them to cloud storage (such as Google -Drive, One Drive or Dropbox), meaning none of your personal documents leave your device in plain text. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/cryptomator "View full Cryptomator report") +ADB, device does not[…](https://awesome-privacy.xyz/security-tools/mobile-apps/secure-task "View full Secure Task report") -
Stats - [![GitHub: cryptomator/android](https://img.shields.io/github/stars/cryptomator/android?style=flat&logo=github&label=android&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptomator/android) [![Privacy Policy](https://shields.tosdr.org/en_4403.svg)](https://tosdr.org/en/service/4403) [![Cryptomator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptomator)](https://awesome-privacy.xyz/security-tools/mobile-apps/cryptomator) -˙ + [![Secure Task on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Secure_Task)](https://awesome-privacy.xyz/security-tools/mobile-apps/secure-task) [![Secure Task on Google Play](https://img.shields.io/badge/-Secure_Task-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.balda.securetask)ㅤ + +
+- **[icon Cryptomator](https://cryptomator.org/android/)** - Encrypts files and folders client-side, before uploading them to cloud storage (such as Google +Drive, One Drive or Dropbox), meaning none of your personal documents leave your device in plain text. + + -
+ Stats + + [![GitHub: cryptomator/android](https://img.shields.io/github/stars/cryptomator/android?style=flat&logo=github&label=android&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptomator/android) [![Privacy Policy](https://shields.tosdr.org/en_4403.svg)](https://tosdr.org/en/service/4403) [![Cryptomator on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptomator)](https://awesome-privacy.xyz/security-tools/mobile-apps/cryptomator) [![Cryptomator on Google Play](https://img.shields.io/badge/-Cryptomator-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.cryptomator) [![Cryptomator on App Store](https://img.shields.io/badge/-Cryptomator-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/cryptomator/id1560822163)ㅤ
- **[icon 1.1.1.1](https://1.1.1.1/)** - Lets you use CloudFlares fast and secure 1.1.1.1 DNS, with DNS over HTTPS, and also has the option to enable CloudFlares WARP+ VPN. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/1.1.1.1 "View full 1.1.1.1 report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_893.svg)](https://tosdr.org/en/service/893) [![1.1.1.1 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=1.1.1.1)](https://awesome-privacy.xyz/security-tools/mobile-apps/1.1.1.1) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_893.svg)](https://tosdr.org/en/service/893) [![1.1.1.1 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=1.1.1.1)](https://awesome-privacy.xyz/security-tools/mobile-apps/1.1.1.1) [![1.1.1.1 on Google Play](https://img.shields.io/badge/-1.1.1.1-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.cloudflare.onedotonedotonedotone) [![1.1.1.1 on App Store](https://img.shields.io/badge/-1.1.1.1-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/1-1-1-1-faster-internet/id1423538627)ㅤ
- **[icon Fing App](https://www.fing.com/products/fing-app)** - A network scanner to help you monitor and secure your WiFi network. The app is totally free, but to use the advanced controls, you will need a Fing Box. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/fing-app "View full Fing App report") -- **[icon DPI Tunnel](https://f-droid.org/packages/ru.evgeniy.dpitunnelcli/)** - An application for Android that uses various techniques to bypass DPI (Deep Packet Inspection) -systems, which are used to block some sites (not available on Play store). -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/dpi-tunnel "View full DPI Tunnel report") + -
Stats - [![GitHub: nomoresat/DPITunnel-android](https://img.shields.io/github/stars/nomoresat/DPITunnel-android?style=flat&logo=github&label=DPITunnel-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/nomoresat/DPITunnel-android) [![DPI Tunnel on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DPI_Tunnel)](https://awesome-privacy.xyz/security-tools/mobile-apps/dpi-tunnel) -˙ + [![Fing App on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Fing_App)](https://awesome-privacy.xyz/security-tools/mobile-apps/fing-app) [![Fing App on Google Play](https://img.shields.io/badge/-Fing_App-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.overlook.android.fing) [![Fing App on App Store](https://img.shields.io/badge/-Fing_App-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/fing-network-scanner/id430921107)ㅤ + +
+- **[icon DPI Tunnel](https://f-droid.org/packages/ru.evgeniy.dpitunnelcli/)** - An application for Android that uses various techniques to bypass DPI (Deep Packet Inspection) +systems, which are used to block some sites (not available on Play store). + + -
+ Stats + + [![GitHub: nomoresat/DPITunnel-android](https://img.shields.io/github/stars/nomoresat/DPITunnel-android?style=flat&logo=github&label=DPITunnel-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/nomoresat/DPITunnel-android) [![DPI Tunnel on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DPI_Tunnel)](https://awesome-privacy.xyz/security-tools/mobile-apps/dpi-tunnel)ㅤ
- **[icon Blokada](https://blokada.org/)** - This application blocks ads and trackers, doesn't require root and works for all the apps on your Android phone. Check out how it works here. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/blokada "View full Blokada report") + -
Stats - [![GitHub: blokadaorg/blokada](https://img.shields.io/github/stars/blokadaorg/blokada?style=flat&logo=github&label=blokada&color=%235f53f4&cacheSeconds=3600)](https://github.com/blokadaorg/blokada) [![Privacy Policy](https://shields.tosdr.org/en_8557.svg)](https://tosdr.org/en/service/8557) [![Blokada on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blokada)](https://awesome-privacy.xyz/security-tools/mobile-apps/blokada) -˙ + [![GitHub: blokadaorg/blokada](https://img.shields.io/github/stars/blokadaorg/blokada?style=flat&logo=github&label=blokada&color=%235f53f4&cacheSeconds=3600)](https://github.com/blokadaorg/blokada) [![Privacy Policy](https://shields.tosdr.org/en_8557.svg)](https://tosdr.org/en/service/8557) [![Blokada on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blokada)](https://awesome-privacy.xyz/security-tools/mobile-apps/blokada) [![Blokada on Google Play](https://img.shields.io/badge/-Blokada-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.blokada.sex) [![Blokada on App Store](https://img.shields.io/badge/-Blokada-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/blokada/id1508341781)ㅤ
- **[icon SnoopSnitch](https://opensource.srlabs.de/projects/snoopsnitch)** - Collects and analyzes mobile radio data to make you aware of your mobile network security and to -warn you about threats like fake base stations (IMSI catchers), user tracking and over-the-air updates. -Get from [F-Droid](https://f-droid.org/en/packages/de.srlabs.snoopsnitch/) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/snoopsnitch "View full SnoopSnitch report") +warn you about threats like fake base stations (IMSI catchers), user tracking and over-the-air updates.[…](https://awesome-privacy.xyz/security-tools/mobile-apps/snoopsnitch "View full SnoopSnitch report") -
Stats - [![GitHub: srlabs/snoopsnitch](https://img.shields.io/github/stars/srlabs/snoopsnitch?style=flat&logo=github&label=snoopsnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/srlabs/snoopsnitch) [![SnoopSnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SnoopSnitch)](https://awesome-privacy.xyz/security-tools/mobile-apps/snoopsnitch) -˙ + [![GitHub: srlabs/snoopsnitch](https://img.shields.io/github/stars/srlabs/snoopsnitch?style=flat&logo=github&label=snoopsnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/srlabs/snoopsnitch) [![SnoopSnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SnoopSnitch)](https://awesome-privacy.xyz/security-tools/mobile-apps/snoopsnitch) [![SnoopSnitch on Google Play](https://img.shields.io/badge/-SnoopSnitch-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=de.srlabs.snoopsnitch)ㅤ
- **[icon TrackerControl](https://trackercontrol.org/)** - Monitor and control hidden data collection in mobile apps about user behavior/ tracking. Get from [F-Droid](https://f-droid.org/en/packages/net.kollnig.missioncontrol.fdroid/) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/trackercontrol "View full TrackerControl report") + -
Stats - [![GitHub: TrackerControl/tracker-control-android](https://img.shields.io/github/stars/TrackerControl/tracker-control-android?style=flat&logo=github&label=tracker-control-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/TrackerControl/tracker-control-android) [![TrackerControl on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=TrackerControl)](https://awesome-privacy.xyz/security-tools/mobile-apps/trackercontrol) -˙ + [![GitHub: TrackerControl/tracker-control-android](https://img.shields.io/github/stars/TrackerControl/tracker-control-android?style=flat&logo=github&label=tracker-control-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/TrackerControl/tracker-control-android) [![TrackerControl on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=TrackerControl)](https://awesome-privacy.xyz/security-tools/mobile-apps/trackercontrol) [![TrackerControl on Google Play](https://img.shields.io/badge/-TrackerControl-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=net.kollnig.missioncontrol.play)ㅤ
- **[icon Greentooth](https://gitlab.com/nbergman/greentooth)** - Auto-disable Bluetooth, then it is not being used. Saves battery, and prevent some security risks. Get from [F-Droid](https://f-droid.org/en/packages/com.smilla.greentooth/) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/greentooth "View full Greentooth report") -- **[icon PrivateLock](https://github.com/wesaphzt/privatelock)** - Auto lock your phone based on movement force/ acceleration. -Get from [F-Droid](https://f-droid.org/en/packages/com.wesaphzt.privatelock/) -See also [PluckLock](https://github.com/SyntaxBlitz/PluckLock) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/privatelock "View full PrivateLock report") + -
Stats - [![GitHub: wesaphzt/privatelock](https://img.shields.io/github/stars/wesaphzt/privatelock?style=flat&logo=github&label=privatelock&color=%235f53f4&cacheSeconds=3600)](https://github.com/wesaphzt/privatelock) [![PrivateLock on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PrivateLock)](https://awesome-privacy.xyz/security-tools/mobile-apps/privatelock) -˙ + [![Greentooth on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Greentooth)](https://awesome-privacy.xyz/security-tools/mobile-apps/greentooth)ㅤ + +
+- **[icon PrivateLock](https://github.com/wesaphzt/privatelock)** - Auto lock your phone based on movement force/ acceleration. +Get from [F-Droid](https://f-droid.org/en/packages/com.wesaphzt.privatelock/) +See also [PluckLock](https://github.com/SyntaxBlitz/PluckLock)[…](https://awesome-privacy.xyz/security-tools/mobile-apps/privatelock "View full PrivateLock report") + -
+ Stats + + [![GitHub: wesaphzt/privatelock](https://img.shields.io/github/stars/wesaphzt/privatelock?style=flat&logo=github&label=privatelock&color=%235f53f4&cacheSeconds=3600)](https://github.com/wesaphzt/privatelock) [![PrivateLock on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PrivateLock)](https://awesome-privacy.xyz/security-tools/mobile-apps/privatelock)ㅤ
- **[icon CamWings](https://schiffer.tech/camwings-mobile.html)** - Prevent background processes gaining unauthorized access to your devices camera. Better still, use a webcam sticker. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/camwings "View full CamWings report") -- **[icon ScreenWings](https://schiffer.tech/screenwings-mobile.html)** - Prevent background processes taking unauthorized screenshots, which could expose sensitive data. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/screenwings "View full ScreenWings report") -- **[icon AFWall+](https://github.com/ukanth/afwall/)** - Android Firewall+ (AFWall+) is an advanced iptables editor (GUI) for rooted Android devices, -which provides very fine-grained control over which Android apps are allowed to access the network. -Get from [F-Droid](https://f-droid.org/packages/dev.ukanth.ufirewall/) -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/afwalland "View full AFWall+ report") + -
Stats - [![GitHub: ukanth/afwall](https://img.shields.io/github/stars/ukanth/afwall?style=flat&logo=github&label=afwall&color=%235f53f4&cacheSeconds=3600)](https://github.com/ukanth/afwall) [![AFWall+ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFWall+)](https://awesome-privacy.xyz/security-tools/mobile-apps/afwalland) -˙ + [![CamWings on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CamWings)](https://awesome-privacy.xyz/security-tools/mobile-apps/camwings) [![CamWings on Google Play](https://img.shields.io/badge/-CamWings-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.schiffertech.camwings)ㅤ + +
+- **[icon ScreenWings](https://schiffer.tech/screenwings-mobile.html)** - Prevent background processes taking unauthorized screenshots, which could expose sensitive data. + + -
+ Stats + + [![ScreenWings on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ScreenWings)](https://awesome-privacy.xyz/security-tools/mobile-apps/screenwings) [![ScreenWings on Google Play](https://img.shields.io/badge/-ScreenWings-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.schiffertech.screenwings)ㅤ + +
+- **[icon AFWall+](https://github.com/ukanth/afwall/)** - Android Firewall+ (AFWall+) is an advanced iptables editor (GUI) for rooted Android devices, +which provides very fine-grained control over which Android apps are allowed to access the network. +Get fro[…](https://awesome-privacy.xyz/security-tools/mobile-apps/afwalland "View full AFWall+ report") + -
+ Stats + + [![GitHub: ukanth/afwall](https://img.shields.io/github/stars/ukanth/afwall?style=flat&logo=github&label=afwall&color=%235f53f4&cacheSeconds=3600)](https://github.com/ukanth/afwall) [![AFWall+ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFWall+)](https://awesome-privacy.xyz/security-tools/mobile-apps/afwalland) [![AFWall+ on Google Play](https://img.shields.io/badge/-AFWall%2B-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=dev.ukanth.ufirewall)ㅤ
- **[icon Catch the Man-in-the-Middle](https://play.google.com/store/apps/details?id=me.brax.certchecker)** - Simple tool, that compares SHA-1 fingerprints of the the SSL certificates seen from your device, and the certificate seen from an external network. If they do not match, this may indicate a -man-in-the-middle modifying requests. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/catch-the-man-in-the-middle "View full Catch the Man-in-the-Middle report") -- **[icon RethinkDNS & Firewall](https://rethinkdns.com)** - An open-source ad-blocker and firewall app for Android 6+ (does not require root). -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/rethinkdns-and-firewall "View full RethinkDNS & Firewall report") +man-in-the[…](https://awesome-privacy.xyz/security-tools/mobile-apps/catch-the-man-in-the-middle "View full Catch the Man-in-the-Middle report") -
Stats - [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/security-tools/mobile-apps/rethinkdns-and-firewall) -˙ + [![Catch the Man-in-the-Middle on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Catch_the_Man-in-the-Middle)](https://awesome-privacy.xyz/security-tools/mobile-apps/catch-the-man-in-the-middle) [![Catch the Man-in-the-Middle on Google Play](https://img.shields.io/badge/-Catch_the_Man--in--the--Middle-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=me.brax.certchecker)ㅤ + +
+- **[icon RethinkDNS & Firewall](https://rethinkdns.com)** - An open-source ad-blocker and firewall app for Android 6+ (does not require root). + + -
+ Stats + + [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/security-tools/mobile-apps/rethinkdns-and-firewall) [![RethinkDNS & Firewall on Google Play](https://img.shields.io/badge/-RethinkDNS_%26_Firewall-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.celzero.bravedns)ㅤ
- **[icon F-Droid](https://f-droid.org/)** - F-Droid is an installable catalogue of FOSS applications for Android. The client enables you to browse, install, and keep track of updates on your device. -[…](https://awesome-privacy.xyz/security-tools/mobile-apps/f-droid "View full F-Droid report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2182.svg)](https://tosdr.org/en/service/2182) [![F-Droid on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=F-Droid)](https://awesome-privacy.xyz/security-tools/mobile-apps/f-droid) -📦 Open Source ˙ + [![Privacy Policy](https://shields.tosdr.org/en_2182.svg)](https://tosdr.org/en/service/2182) [![F-Droid on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=F-Droid)](https://awesome-privacy.xyz/security-tools/mobile-apps/f-droid) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://f-droid.org/)ㅤ
@@ -1730,113 +1562,155 @@ A selection of free online tools and utilities, to check, test and protect your - **[icon Have i been pwned](https://haveibeenpwned.com)** - Checks if your credentials (Email address or Password) have been compromised in a data breach. See also Firefox Monitor. -[…](https://awesome-privacy.xyz/security-tools/online-tools/have-i-been-pwned "View full Have i been pwned report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3435.svg)](https://tosdr.org/en/service/3435) [![Have i been pwned on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Have_i_been_pwned)](https://awesome-privacy.xyz/security-tools/online-tools/have-i-been-pwned) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3435.svg)](https://tosdr.org/en/service/3435) [![Have i been pwned on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Have_i_been_pwned)](https://awesome-privacy.xyz/security-tools/online-tools/have-i-been-pwned)ㅤ
- **[icon εxodus](https://reports.exodus-privacy.eu.org)** - Checks how many, and which trackers any Android app has. Useful to understand how data is being collected before you install a certain APK, it also shows which permissions the app asks for. -[…](https://awesome-privacy.xyz/security-tools/online-tools/εxodus "View full εxodus report") + -
Stats - [![GitHub: Exodus-Privacy/website](https://img.shields.io/github/stars/Exodus-Privacy/website?style=flat&logo=github&label=website&color=%235f53f4&cacheSeconds=3600)](https://github.com/Exodus-Privacy/website) [![Privacy Policy](https://shields.tosdr.org/en_3843.svg)](https://tosdr.org/en/service/3843) [![εxodus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=εxodus)](https://awesome-privacy.xyz/security-tools/online-tools/εxodus) -˙ + [![GitHub: Exodus-Privacy/website](https://img.shields.io/github/stars/Exodus-Privacy/website?style=flat&logo=github&label=website&color=%235f53f4&cacheSeconds=3600)](https://github.com/Exodus-Privacy/website) [![Privacy Policy](https://shields.tosdr.org/en_3843.svg)](https://tosdr.org/en/service/3843) [![εxodus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=εxodus)](https://awesome-privacy.xyz/security-tools/online-tools/εxodus)ㅤ
- **[icon Am I Unique?](https://amiunique.org/fingerprint)** - Show how identifiable you are on the Internet by generating a fingerprint based on device information. -This is how many websites track you (even without cookies enabled), so the aim is to not be unique. -[…](https://awesome-privacy.xyz/security-tools/online-tools/am-i-unique "View full Am I Unique? report") +This is how many websites track you (even without cookies enabled), so the aim is to not be uniqu[…](https://awesome-privacy.xyz/security-tools/online-tools/am-i-unique "View full Am I Unique? report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_4202.svg)](https://tosdr.org/en/service/4202) [![Am I Unique? on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Am_I_Unique?)](https://awesome-privacy.xyz/security-tools/online-tools/am-i-unique) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_4202.svg)](https://tosdr.org/en/service/4202) [![Am I Unique? on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Am_I_Unique?)](https://awesome-privacy.xyz/security-tools/online-tools/am-i-unique)ㅤ
- **[icon Panopticlick](https://panopticlick.eff.org/)** - Check if your browser safe against tracking. Analyzes how well your browser and add-ons protect you -against online tracking techniques, and if your system is uniquely configured—and thus identifiable. -[…](https://awesome-privacy.xyz/security-tools/online-tools/panopticlick "View full Panopticlick report") +against online tracking techniques, and if your system is uniquely configured—and thus identifiable.[…](https://awesome-privacy.xyz/security-tools/online-tools/panopticlick "View full Panopticlick report") -
Stats - [![GitHub: EFForg/cover-your-tracks](https://img.shields.io/github/stars/EFForg/cover-your-tracks?style=flat&logo=github&label=cover-your-tracks&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/cover-your-tracks) [![Panopticlick on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Panopticlick)](https://awesome-privacy.xyz/security-tools/online-tools/panopticlick) -˙ + [![GitHub: EFForg/cover-your-tracks](https://img.shields.io/github/stars/EFForg/cover-your-tracks?style=flat&logo=github&label=cover-your-tracks&color=%235f53f4&cacheSeconds=3600)](https://github.com/EFForg/cover-your-tracks) [![Panopticlick on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Panopticlick)](https://awesome-privacy.xyz/security-tools/online-tools/panopticlick)ㅤ
- **[icon Phish.ly](https://phish.ly/)** - Analyzes emails, checking the URLs and creating a SHA256 and MD5 hash of attachments, with a link to VirusTotal. -To use the service, just forward a potentially malicious or suspicious email to scan@phish.ly, and an automated -reply will include the results. They claim that all email data is purged after analysis, but it would be wise to -not include any sensitive information, and to use a forwarding address. -[…](https://awesome-privacy.xyz/security-tools/online-tools/phish.ly "View full Phish.ly report") -- **[icon Browser Leak Test](https://browserleaks.com)** - Shows which of personal identity data is being leaked through your browser, so you can better protect yourself -against fingerprinting. -[…](https://awesome-privacy.xyz/security-tools/online-tools/browser-leak-test "View full Browser Leak Test report") +To use the service, just forward a potentially malicious or suspicious email to scan@ph[…](https://awesome-privacy.xyz/security-tools/online-tools/phish.ly "View full Phish.ly report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_7967.svg)](https://tosdr.org/en/service/7967) [![Browser Leak Test on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Browser_Leak_Test)](https://awesome-privacy.xyz/security-tools/online-tools/browser-leak-test) -˙ + [![Phish.ly on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Phish.ly)](https://awesome-privacy.xyz/security-tools/online-tools/phish.ly)ㅤ + +
+- **[icon Browser Leak Test](https://browserleaks.com)** - Shows which of personal identity data is being leaked through your browser, so you can better protect yourself +against fingerprinting. + + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_7967.svg)](https://tosdr.org/en/service/7967) [![Browser Leak Test on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Browser_Leak_Test)](https://awesome-privacy.xyz/security-tools/online-tools/browser-leak-test)ㅤ
- **[icon IP Leak Test](https://ipleak.net)** - Shows your IP address, and other associated details (location, ISP, WebRTC check, DNS, and lots more). -[…](https://awesome-privacy.xyz/security-tools/online-tools/ip-leak-test "View full IP Leak Test report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_7968.svg)](https://tosdr.org/en/service/7968) [![IP Leak Test on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IP_Leak_Test)](https://awesome-privacy.xyz/security-tools/online-tools/ip-leak-test) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_7968.svg)](https://tosdr.org/en/service/7968) [![IP Leak Test on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IP_Leak_Test)](https://awesome-privacy.xyz/security-tools/online-tools/ip-leak-test)ㅤ
- **[icon EXIF Remove](https://www.exifremove.com)** - Displays, and removes Meta and EXIF data from an uploaded photo or document. -[…](https://awesome-privacy.xyz/security-tools/online-tools/exif-remove "View full EXIF Remove report") -- **[icon Redirect Detective](https://redirectdetective.com)** - Check where a suspicious URL redirects to (without having to click it). Lets you avoid being tracked by not being -redirected via adware/tracking sites, or see if a shortened link actually resolves a legitimate site, or see if -link is an affiliate ad. -[…](https://awesome-privacy.xyz/security-tools/online-tools/redirect-detective "View full Redirect Detective report") -- **[icon Blocked.org](https://www.blocked.org.uk)** - Checks if a given website is blocked by filters applied by your mobile and broadband Internet Service Providers (ISP). -[…](https://awesome-privacy.xyz/security-tools/online-tools/blocked.org "View full Blocked.org report") -- **[icon Virus Total](https://www.virustotal.com)** - Analyses a potentially-suspicious web resources (by URL, IP, domain or file hash) to detect types of malware -(*note: files are scanned publicly*). -[…](https://awesome-privacy.xyz/security-tools/online-tools/virus-total "View full Virus Total report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1886.svg)](https://tosdr.org/en/service/1886) [![Virus Total on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Virus_Total)](https://awesome-privacy.xyz/security-tools/online-tools/virus-total) -˙ + [![EXIF Remove on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=EXIF_Remove)](https://awesome-privacy.xyz/security-tools/online-tools/exif-remove)ㅤ + +
+- **[icon Redirect Detective](https://redirectdetective.com)** - Check where a suspicious URL redirects to (without having to click it). Lets you avoid being tracked by not being +redirected via adware/tracking sites, or see if a shortened link actually resolves a l[…](https://awesome-privacy.xyz/security-tools/online-tools/redirect-detective "View full Redirect Detective report") + -
+ Stats + + [![Redirect Detective on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Redirect_Detective)](https://awesome-privacy.xyz/security-tools/online-tools/redirect-detective)ㅤ + +
+- **[icon Blocked.org](https://www.blocked.org.uk)** - Checks if a given website is blocked by filters applied by your mobile and broadband Internet Service Providers (ISP). + + -
+ Stats + + [![Blocked.org on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blocked.org)](https://awesome-privacy.xyz/security-tools/online-tools/blocked.org)ㅤ + +
+- **[icon Virus Total](https://www.virustotal.com)** - Analyses a potentially-suspicious web resources (by URL, IP, domain or file hash) to detect types of malware +(*note: files are scanned publicly*). + + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_1886.svg)](https://tosdr.org/en/service/1886) [![Virus Total on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Virus_Total)](https://awesome-privacy.xyz/security-tools/online-tools/virus-total)ㅤ
- **[icon Hardenize](https://www.hardenize.com/)** - Scan websites and shows a security overview, relating to factors such as HTTPS, domain info, email data, www protocols and so on. -[…](https://awesome-privacy.xyz/security-tools/online-tools/hardenize "View full Hardenize report") -- **[icon Is Legit?](https://www.islegitsite.com/)** - Checks if a website or business is a scam, before buying something from it. -[…](https://awesome-privacy.xyz/security-tools/online-tools/is-legit "View full Is Legit? report") -- **[icon Should I Remove It?](https://www.shouldiremoveit.com)** - Ever been uninstalling programs from your Windows PC and been unsure of what something is? Should I Remove It is a -database of Windows software, detailing whether it is essential, harmless or dangerous. -[…](https://awesome-privacy.xyz/security-tools/online-tools/should-i-remove-it "View full Should I Remove It? report") -- **[icon 10 Minute Mail](https://10minemail.com/)** - Generates temporary disposable email address, to avoid giving your real details. -[…](https://awesome-privacy.xyz/security-tools/online-tools/10-minute-mail "View full 10 Minute Mail report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_838.svg)](https://tosdr.org/en/service/838) [![10 Minute Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=10_Minute_Mail)](https://awesome-privacy.xyz/security-tools/online-tools/10-minute-mail) -˙ + [![Hardenize on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Hardenize)](https://awesome-privacy.xyz/security-tools/online-tools/hardenize)ㅤ + +
+- **[icon Is Legit?](https://www.islegitsite.com/)** - Checks if a website or business is a scam, before buying something from it. + + -
+ Stats + + [![Is Legit? on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Is_Legit?)](https://awesome-privacy.xyz/security-tools/online-tools/is-legit)ㅤ + +
+- **[icon Should I Remove It?](https://www.shouldiremoveit.com)** - Ever been uninstalling programs from your Windows PC and been unsure of what something is? Should I Remove It is a +database of Windows software, detailing whether it is essential, harmless or dangerou[…](https://awesome-privacy.xyz/security-tools/online-tools/should-i-remove-it "View full Should I Remove It? report") + -
+ Stats + + [![Should I Remove It? on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Should_I_Remove_It?)](https://awesome-privacy.xyz/security-tools/online-tools/should-i-remove-it)ㅤ + +
+- **[icon 10 Minute Mail](https://10minemail.com/)** - Generates temporary disposable email address, to avoid giving your real details. + + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_838.svg)](https://tosdr.org/en/service/838) [![10 Minute Mail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=10_Minute_Mail)](https://awesome-privacy.xyz/security-tools/online-tools/10-minute-mail)ㅤ
- **[icon MXToolBox Mail Headers](https://mxtoolbox.com/Public/Tools/EmailHeaders.aspx)** - Tool for analyzing email headers, useful for checking the authenticity of messages, as well as knowing what info you are revealing in your outbound messages. -[…](https://awesome-privacy.xyz/security-tools/online-tools/mxtoolbox-mail-headers "View full MXToolBox Mail Headers report") + + -
+ Stats + + [![MXToolBox Mail Headers on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MXToolBox_Mail_Headers)](https://awesome-privacy.xyz/security-tools/online-tools/mxtoolbox-mail-headers)ㅤ + +
- **[icon Am I FloCed?](https://amifloced.org/)** - Google testing out a new tracking feature called Federated Learning of Cohorts (aka "FLoC"). It currently effects -0.5% of Chrome users, this tool developed by the EFF will detect if you are affected, and provide additional info -on how to stay protected. -[…](https://awesome-privacy.xyz/security-tools/online-tools/am-i-floced "View full Am I FloCed? report") +0.5% of Chrome users, this tool developed by the EFF will detect if you are affected,[…](https://awesome-privacy.xyz/security-tools/online-tools/am-i-floced "View full Am I FloCed? report") + -
+ Stats + + [![Am I FloCed? on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Am_I_FloCed?)](https://awesome-privacy.xyz/security-tools/online-tools/am-i-floced)ㅤ + +
- **[icon Site Report](https://sitereport.netcraft.com/)** - A tool from Netcraft, for analysing what any given website is running, where it's located and information about its host, registrar, IP and SSL certificates. -[…](https://awesome-privacy.xyz/security-tools/online-tools/site-report "View full Site Report report") + + -
+ Stats + + [![Site Report on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Site_Report)](https://awesome-privacy.xyz/security-tools/online-tools/site-report)ㅤ + +
⚠️ Word of Warning @@ -1857,62 +1731,58 @@ host, registrar, IP and SSL certificates. - **[icon Mullvad](http://mullvad.net/en)** - Mullvad is one of the best for privacy, they have a totally anonymous sign up process, you don't need to provide any details at all, you can choose to pay anonymously too (with Monero, BTC or cash). -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/mullvad "View full Mullvad report") + -
Stats - [![GitHub: mullvad/mullvadvpn-app](https://img.shields.io/github/stars/mullvad/mullvadvpn-app?style=flat&logo=github&label=mullvadvpn-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/mullvad/mullvadvpn-app) [![Privacy Policy](https://shields.tosdr.org/en_641.svg)](https://tosdr.org/en/service/641) [![Mullvad on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mullvad)](https://awesome-privacy.xyz/networking/virtual-private-networks/mullvad) -🛡️ Security Audited ˙ + [![GitHub: mullvad/mullvadvpn-app](https://img.shields.io/github/stars/mullvad/mullvadvpn-app?style=flat&logo=github&label=mullvadvpn-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/mullvad/mullvadvpn-app) [![Privacy Policy](https://shields.tosdr.org/en_641.svg)](https://tosdr.org/en/service/641) [![Mullvad on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mullvad)](https://awesome-privacy.xyz/networking/virtual-private-networks/mullvad) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Mullvad on Google Play](https://img.shields.io/badge/-Mullvad-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=net.mullvad.mullvadvpn) [![Mullvad on App Store](https://img.shields.io/badge/-Mullvad-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/mullvad-vpn/id1488466513)ㅤ
- **[icon Azire](https://www.azirevpn.com/)** - Azire is a Swedish VPN provider, who owns their own hardware with physically removed storage and a no logging policy. Pricing starts at €3.25/mo, with crypto (including XMR) -supported. Note that they've not yet been audited, and client applications are not open -source, for more info, see #140. -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/azire "View full Azire report") +supported. Note that they'[…](https://awesome-privacy.xyz/networking/virtual-private-networks/azire "View full Azire report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_6639.svg)](https://tosdr.org/en/service/6639) [![Azire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Azire)](https://awesome-privacy.xyz/networking/virtual-private-networks/azire) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_6639.svg)](https://tosdr.org/en/service/6639) [![Azire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Azire)](https://awesome-privacy.xyz/networking/virtual-private-networks/azire) [![Azire on Google Play](https://img.shields.io/badge/-Azire-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.azirevpn.android) [![Azire on App Store](https://img.shields.io/badge/-Azire-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/azirevpn/id6444623166)ㅤ
- **[icon IVPN](https://www.ivpn.net/)** - Independently Security Audited VPN with anonymous signup, no logs, no cloud or customer data stored, open-source apps and website. Strong ethics: no trackers, no false promises, -no surveillance ads. Accepts various payment methods including cryptocurrencies. -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/ivpn "View full IVPN report") +no surveillance ads. A[…](https://awesome-privacy.xyz/networking/virtual-private-networks/ivpn "View full IVPN report") -
Stats - [![GitHub: ivpn/desktop-app](https://img.shields.io/github/stars/ivpn/desktop-app?style=flat&logo=github&label=desktop-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/ivpn/desktop-app) [![Privacy Policy](https://shields.tosdr.org/en_2748.svg)](https://tosdr.org/en/service/2748) [![IVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/ivpn) -📦 Open Source 🛡️ Security Audited ˙ + [![GitHub: ivpn/desktop-app](https://img.shields.io/github/stars/ivpn/desktop-app?style=flat&logo=github&label=desktop-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/ivpn/desktop-app) [![Privacy Policy](https://shields.tosdr.org/en_2748.svg)](https://tosdr.org/en/service/2748) [![IVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/ivpn) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/ivpn/desktop-app) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![IVPN on Google Play](https://img.shields.io/badge/-IVPN-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=net.ivpn.client) [![IVPN on App Store](https://img.shields.io/badge/-IVPN-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/ivpn-secure-vpn-for-privacy/id1193122683)ㅤ
- **[icon ProtonVPN](https://protonvpn.com)** - From the creators of ProtonMail, ProtonVPN has a solid reputation. They have a full suite of user-friendly native mobile and desktop apps. ProtonVPN is one of the few "trustworthy" -providers that also offer a free plan. -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/protonvpn "View full ProtonVPN report") +providers that also[…](https://awesome-privacy.xyz/networking/virtual-private-networks/protonvpn "View full ProtonVPN report") -
Stats - [![GitHub: ProtonVPN/android-app](https://img.shields.io/github/stars/ProtonVPN/android-app?style=flat&logo=github&label=android-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/ProtonVPN/android-app) [![Privacy Policy](https://shields.tosdr.org/en_1745.svg)](https://tosdr.org/en/service/1745) [![ProtonVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/protonvpn) -🛡️ Security Audited ˙ + [![GitHub: ProtonVPN/android-app](https://img.shields.io/github/stars/ProtonVPN/android-app?style=flat&logo=github&label=android-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/ProtonVPN/android-app) [![Privacy Policy](https://shields.tosdr.org/en_1745.svg)](https://tosdr.org/en/service/1745) [![ProtonVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ProtonVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/protonvpn) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![ProtonVPN on Google Play](https://img.shields.io/badge/-ProtonVPN-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=ch.protonvpn.android) [![ProtonVPN on App Store](https://img.shields.io/badge/-ProtonVPN-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/proton-vpn-fast-secure/id1437005085)ㅤ
- **[icon OVPN](https://www.ovpn.com)** - A court-proven VPN service with support for Wireguard and OpenVPN support, and optional ad-blocking. Running on dedicated hardware, with no hard drives. -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/ovpn "View full OVPN report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2981.svg)](https://tosdr.org/en/service/2981) [![OVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/ovpn) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2981.svg)](https://tosdr.org/en/service/2981) [![OVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OVPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/ovpn) [![OVPN on Google Play](https://img.shields.io/badge/-OVPN-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.ovpn.android) [![OVPN on App Store](https://img.shields.io/badge/-OVPN-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/ovpn-unlimited-vpn-wifi-proxy/id1520543719)ㅤ
- **[icon Party VPN](https://partyvpn.com)** - Crypto-native VPN with pay-as-you-go pricing. Accepts cryptocurrency only, including Monero. WireGuard and AmneziaWG protocols, no-logs policy, REST API for developers. No -subscriptions or credit cards. -[…](https://awesome-privacy.xyz/networking/virtual-private-networks/party-vpn "View full Party VPN report") +subscriptions or credit card[…](https://awesome-privacy.xyz/networking/virtual-private-networks/party-vpn "View full Party VPN report") + -
+ Stats + + [![Party VPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Party_VPN)](https://awesome-privacy.xyz/networking/virtual-private-networks/party-vpn) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white) [![Party VPN on Discord](https://img.shields.io/badge/-Party_VPN-5865F2?style=flat&logo=discord&logoColor=white)](https://discord.gg/6GRddHhW2d)ㅤ + +
⚠️ Word of Warning @@ -1954,86 +1824,71 @@ Fun little projects that you can run on a Raspberry Pi, or other low-powered com - **[icon Pi-Hole](https://pi-hole.net)** - Network-level advertisement and Internet tracker blocking application which acts as a DNS sinkhole. Pi-Hole can significantly speed up your internet, remove ads and block malware. -It comes with a nice web interface and a mobile app with monitoring features, it's open -source, easy to install and very widely used. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/pi-hole "View full Pi-Hole report") +It comes with a nice[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/pi-hole "View full Pi-Hole report") -
Stats - [![GitHub: pi-hole/pi-hole](https://img.shields.io/github/stars/pi-hole/pi-hole?style=flat&logo=github&label=pi-hole&color=%235f53f4&cacheSeconds=3600)](https://github.com/pi-hole/pi-hole) [![Privacy Policy](https://shields.tosdr.org/en_9079.svg)](https://tosdr.org/en/service/9079) [![Pi-Hole on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pi-Hole)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pi-hole) -˙ + [![GitHub: pi-hole/pi-hole](https://img.shields.io/github/stars/pi-hole/pi-hole?style=flat&logo=github&label=pi-hole&color=%235f53f4&cacheSeconds=3600)](https://github.com/pi-hole/pi-hole) [![Privacy Policy](https://shields.tosdr.org/en_9079.svg)](https://tosdr.org/en/service/9079) [![Pi-Hole on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pi-Hole)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pi-hole)ㅤ
- **[icon Technitium](https://technitium.com/dns)** - Another DNS server for blocking privacy-invasive content at its source. Technitium doesn't require much of a setup, and basically works straight out of the box, it supports a wide -range of systems (and can even run as a portable app on Windows). It allows you to do some -additional tasks, such as add local DNS addresses and zones with specific DNS records. -Compared to Pi-Hole, Technitium is very lightweight, but lacks the deep insights that -Pi-Hole provides, and has a significantly smaller community behind it. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/technitium "View full Technitium report") +range of systems (an[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/technitium "View full Technitium report") -
Stats - [![GitHub: TechnitiumSoftware/DnsServer](https://img.shields.io/github/stars/TechnitiumSoftware/DnsServer?style=flat&logo=github&label=DnsServer&color=%235f53f4&cacheSeconds=3600)](https://github.com/TechnitiumSoftware/DnsServer) [![Technitium on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Technitium)](https://awesome-privacy.xyz/networking/self-hosted-network-security/technitium) -˙ + [![GitHub: TechnitiumSoftware/DnsServer](https://img.shields.io/github/stars/TechnitiumSoftware/DnsServer?style=flat&logo=github&label=DnsServer&color=%235f53f4&cacheSeconds=3600)](https://github.com/TechnitiumSoftware/DnsServer) [![Technitium on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Technitium)](https://awesome-privacy.xyz/networking/self-hosted-network-security/technitium)ㅤ
- **[icon IPFire](https://www.ipfire.org)** - A hardened, versatile, state-of-the-art open source firewall based on Linux. Its ease of use, high performance and extensibility make it usable for everyone. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/ipfire "View full IPFire report") + -
Stats - [![GitHub: ipfire/ipfire-2.x](https://img.shields.io/github/stars/ipfire/ipfire-2.x?style=flat&logo=github&label=ipfire-2.x&color=%235f53f4&cacheSeconds=3600)](https://github.com/ipfire/ipfire-2.x) [![IPFire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IPFire)](https://awesome-privacy.xyz/networking/self-hosted-network-security/ipfire) -˙ + [![GitHub: ipfire/ipfire-2.x](https://img.shields.io/github/stars/ipfire/ipfire-2.x?style=flat&logo=github&label=ipfire-2.x&color=%235f53f4&cacheSeconds=3600)](https://github.com/ipfire/ipfire-2.x) [![IPFire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IPFire)](https://awesome-privacy.xyz/networking/self-hosted-network-security/ipfire)ㅤ
- **[icon PiVPN](https://pivpn.io)** - A simple way to set up a home VPN on any Debian server. Supports OpenVPN and WireGuard with elliptic curve encryption keys up to 512 bit. Supports multiple DNS providers and -custom DNS providers - works nicely along-side PiHole. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/pivpn "View full PiVPN report") +custom DNS providers - wor[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/pivpn "View full PiVPN report") -
Stats - [![GitHub: pivpn/pivpn](https://img.shields.io/github/stars/pivpn/pivpn?style=flat&logo=github&label=pivpn&color=%235f53f4&cacheSeconds=3600)](https://github.com/pivpn/pivpn) [![PiVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PiVPN)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pivpn) -˙ + [![GitHub: pivpn/pivpn](https://img.shields.io/github/stars/pivpn/pivpn?style=flat&logo=github&label=pivpn&color=%235f53f4&cacheSeconds=3600)](https://github.com/pivpn/pivpn) [![PiVPN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PiVPN)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pivpn)ㅤ
- **[icon E2guardian](http://e2guardian.org)** - Powerful open source web content filter. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/e2guardian "View full E2guardian report") + -
Stats - [![GitHub: e2guardian/e2guardian](https://img.shields.io/github/stars/e2guardian/e2guardian?style=flat&logo=github&label=e2guardian&color=%235f53f4&cacheSeconds=3600)](https://github.com/e2guardian/e2guardian) [![E2guardian on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=E2guardian)](https://awesome-privacy.xyz/networking/self-hosted-network-security/e2guardian) -˙ + [![GitHub: e2guardian/e2guardian](https://img.shields.io/github/stars/e2guardian/e2guardian?style=flat&logo=github&label=e2guardian&color=%235f53f4&cacheSeconds=3600)](https://github.com/e2guardian/e2guardian) [![E2guardian on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=E2guardian)](https://awesome-privacy.xyz/networking/self-hosted-network-security/e2guardian)ㅤ
- **[icon PF Sense](https://www.pfsense.org)** - Widely used, open source firewall/router. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/pf-sense "View full PF Sense report") + -
Stats - [![GitHub: pfsense/pfsense](https://img.shields.io/github/stars/pfsense/pfsense?style=flat&logo=github&label=pfsense&color=%235f53f4&cacheSeconds=3600)](https://github.com/pfsense/pfsense) [![Privacy Policy](https://shields.tosdr.org/en_6291.svg)](https://tosdr.org/en/service/6291) [![PF Sense on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PF_Sense)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pf-sense) -˙ + [![GitHub: pfsense/pfsense](https://img.shields.io/github/stars/pfsense/pfsense?style=flat&logo=github&label=pfsense&color=%235f53f4&cacheSeconds=3600)](https://github.com/pfsense/pfsense) [![Privacy Policy](https://shields.tosdr.org/en_6291.svg)](https://tosdr.org/en/service/6291) [![PF Sense on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PF_Sense)](https://awesome-privacy.xyz/networking/self-hosted-network-security/pf-sense)ㅤ
- **[icon Zeek](https://www.zeek.org)** - Detect if you have a malware-infected computer on your network, and powerful network analysis framework and monitor. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/zeek "View full Zeek report") + -
Stats - [![GitHub: zeek/zeek](https://img.shields.io/github/stars/zeek/zeek?style=flat&logo=github&label=zeek&color=%235f53f4&cacheSeconds=3600)](https://github.com/zeek/zeek) [![Zeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Zeek)](https://awesome-privacy.xyz/networking/self-hosted-network-security/zeek) -˙ + [![GitHub: zeek/zeek](https://img.shields.io/github/stars/zeek/zeek?style=flat&logo=github&label=zeek&color=%235f53f4&cacheSeconds=3600)](https://github.com/zeek/zeek) [![Zeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Zeek)](https://awesome-privacy.xyz/networking/self-hosted-network-security/zeek)ㅤ
- **[icon Firezone](https://www.firezone.dev/)** - Open-source self-hosted VPN and firewall built on WireGuard®. -[…](https://awesome-privacy.xyz/networking/self-hosted-network-security/firezone "View full Firezone report") + -
Stats - [![GitHub: firezone/firezone](https://img.shields.io/github/stars/firezone/firezone?style=flat&logo=github&label=firezone&color=%235f53f4&cacheSeconds=3600)](https://github.com/firezone/firezone) [![Firezone on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firezone)](https://awesome-privacy.xyz/networking/self-hosted-network-security/firezone) -˙ + [![GitHub: firezone/firezone](https://img.shields.io/github/stars/firezone/firezone?style=flat&logo=github&label=firezone&color=%235f53f4&cacheSeconds=3600)](https://github.com/firezone/firezone) [![Firezone on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firezone)](https://awesome-privacy.xyz/networking/self-hosted-network-security/firezone)ㅤ
@@ -2045,32 +1900,29 @@ analysis framework and monitor. - **[icon Tor](https://www.torproject.org)** - Tor provides robust anonymity, allowing you to defend against surveillance, circumvent censorship and reduce tracking. It blocks trackers, resists fingerprinting and implements -multi-layered encryption by default, meaning you can browse freely. Tor also allows access -to OnionLand: hidden services. -[…](https://awesome-privacy.xyz/networking/mix-networks/tor "View full Tor report") +multi-layered encryptio[…](https://awesome-privacy.xyz/networking/mix-networks/tor "View full Tor report") -
Stats - [![GitHub: torproject/tor](https://img.shields.io/github/stars/torproject/tor?style=flat&logo=github&label=tor&color=%235f53f4&cacheSeconds=3600)](https://github.com/torproject/tor) [![Privacy Policy](https://shields.tosdr.org/en_2845.svg)](https://tosdr.org/en/service/2845) [![Tor on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tor)](https://awesome-privacy.xyz/networking/mix-networks/tor) -˙ + [![GitHub: torproject/tor](https://img.shields.io/github/stars/torproject/tor?style=flat&logo=github&label=tor&color=%235f53f4&cacheSeconds=3600)](https://github.com/torproject/tor) [![Privacy Policy](https://shields.tosdr.org/en_2845.svg)](https://tosdr.org/en/service/2845) [![Tor on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tor)](https://awesome-privacy.xyz/networking/mix-networks/tor)ㅤ
- **[icon I2P](https://geti2p.net)** - I2P offers great generic transports, it is well geared towards accessing hidden services, and has a couple of technical benefits over Tor: P2P friendly with unidirectional short-lived -tunnels, it is packet-switched (instead of circuit-switched) with TCP and UDP, and continuously -profiles peers, in order to select the best performing ones. -I2P is less mature, but fully-distributed and self-organising, its smaller size means that it -hasn't yet been blocked or DOSed much. -[…](https://awesome-privacy.xyz/networking/mix-networks/i2p "View full I2P report") -- **[icon Freenet](https://freenetproject.org)** - Freenet is easy to setup, provides excellent friend To Friend Sharing vs I2P, and is great for -publishing content anonymously. It's quite large in size, and very slow so not the best choice -for casual browsing. -[…](https://awesome-privacy.xyz/networking/mix-networks/freenet "View full Freenet report") +tunnels, it is p[…](https://awesome-privacy.xyz/networking/mix-networks/i2p "View full I2P report") -
Stats - [![GitHub: hyphanet/fred](https://img.shields.io/github/stars/hyphanet/fred?style=flat&logo=github&label=fred&color=%235f53f4&cacheSeconds=3600)](https://github.com/hyphanet/fred) [![Freenet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Freenet)](https://awesome-privacy.xyz/networking/mix-networks/freenet) -˙ + [![I2P on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=I2P)](https://awesome-privacy.xyz/networking/mix-networks/i2p) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://geti2p.net)ㅤ + +
+- **[icon Freenet](https://freenetproject.org)** - Freenet is easy to setup, provides excellent friend To Friend Sharing vs I2P, and is great for +publishing content anonymously. It's quite large in size, and very slow so not the best choice +for casual[…](https://awesome-privacy.xyz/networking/mix-networks/freenet "View full Freenet report") + -
+ Stats + + [![GitHub: hyphanet/fred](https://img.shields.io/github/stars/hyphanet/fred?style=flat&logo=github&label=fred&color=%235f53f4&cacheSeconds=3600)](https://github.com/hyphanet/fred) [![Freenet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Freenet)](https://awesome-privacy.xyz/networking/mix-networks/freenet)ㅤ
@@ -2127,18 +1979,23 @@ provide shared network connections and cache data to speed up common requests. - **[icon ShadowSocks](https://shadowsocks.org)** - Secure socks5 proxy, designed to protect your Internet traffic. Open source, superfast, cross-platform and easy to deploy, see [GitHub repo](https://github.com/shadowsocks). -[…](https://awesome-privacy.xyz/networking/proxies/shadowsocks "View full ShadowSocks report") + -
Stats - [![GitHub: shadowsocks/shadowsocks-rust](https://img.shields.io/github/stars/shadowsocks/shadowsocks-rust?style=flat&logo=github&label=shadowsocks-rust&color=%235f53f4&cacheSeconds=3600)](https://github.com/shadowsocks/shadowsocks-rust) [![ShadowSocks on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ShadowSocks)](https://awesome-privacy.xyz/networking/proxies/shadowsocks) -˙ + [![GitHub: shadowsocks/shadowsocks-rust](https://img.shields.io/github/stars/shadowsocks/shadowsocks-rust?style=flat&logo=github&label=shadowsocks-rust&color=%235f53f4&cacheSeconds=3600)](https://github.com/shadowsocks/shadowsocks-rust) [![ShadowSocks on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ShadowSocks)](https://awesome-privacy.xyz/networking/proxies/shadowsocks)ㅤ
- **[icon Privoxy](https://www.privoxy.org)** - Non-caching web proxy with advanced filtering capabilities for enhancing privacy, modifying web page data and HTTP headers, controlling access, and removing ads and other obnoxious Internet junk. -[…](https://awesome-privacy.xyz/networking/proxies/privoxy "View full Privoxy report") + + -
+ Stats + + [![Privoxy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privoxy)](https://awesome-privacy.xyz/networking/proxies/privoxy) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.privoxy.org)ㅤ + +
⚠️ Word of Warning @@ -2172,32 +2029,29 @@ a service that respects privacy and supports DNS-over-TLS, DNS-over-HTTPS or DNS - **[icon CloudFlare](https://developers.cloudflare.com/1.1.1.1/setting-up-1.1.1.1)** - One of the most performant options, Cloudflare's DNS supports DoH and DoT, and has a Tor implementation, providing world-class protection. They have native cross-platform apps, for easy set-up. -[…](https://awesome-privacy.xyz/networking/dns-providers/cloudflare "View full CloudFlare report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_893.svg)](https://tosdr.org/en/service/893) [![CloudFlare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CloudFlare)](https://awesome-privacy.xyz/networking/dns-providers/cloudflare) -🛡️ Security Audited ˙ + [![Privacy Policy](https://shields.tosdr.org/en_893.svg)](https://tosdr.org/en/service/893) [![CloudFlare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CloudFlare)](https://awesome-privacy.xyz/networking/dns-providers/cloudflare) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white)ㅤ
- **[icon AdGuard](https://adguard.com/en/adguard-dns/overview.html)** - Open-source DNS provider, specialising in the blocking of ads, trackers and malicious domains. They have been independently audited and do not keep logs. -[…](https://awesome-privacy.xyz/networking/dns-providers/adguard "View full AdGuard report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2776.svg)](https://tosdr.org/en/service/2776) [![AdGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AdGuard)](https://awesome-privacy.xyz/networking/dns-providers/adguard) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2776.svg)](https://tosdr.org/en/service/2776) [![AdGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AdGuard)](https://awesome-privacy.xyz/networking/dns-providers/adguard)ㅤ
- **[icon NextDNS](https://nextdns.io)** - An ad-blocking, privacy-protecting, censorship-bypassing DNS. Also comes with analytics, and the ability to shield kids from adult content. -[…](https://awesome-privacy.xyz/networking/dns-providers/nextdns "View full NextDNS report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1959.svg)](https://tosdr.org/en/service/1959) [![NextDNS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextDNS)](https://awesome-privacy.xyz/networking/dns-providers/nextdns) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1959.svg)](https://tosdr.org/en/service/1959) [![NextDNS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextDNS)](https://awesome-privacy.xyz/networking/dns-providers/nextdns)ㅤ
@@ -2245,67 +2099,55 @@ battle-tested protocol, that has been in use since 2013, and is still widely use - **[icon DNScrypt-proxy 2](https://dnscrypt.info)** - A flexible DNS proxy, with support for modern encrypted DNS protocols including DNSCrypt V2, DNS-over-HTTPS and Anonymized DNSCrypt. Also allows for advanced monitoring, filtering, caching -and client IP protection through Tor, SOCKS proxies or Anonymized DNS relays. -[…](https://awesome-privacy.xyz/networking/dns-clients/dnscrypt-proxy-2 "View full DNScrypt-proxy 2 report") +and client[…](https://awesome-privacy.xyz/networking/dns-clients/dnscrypt-proxy-2 "View full DNScrypt-proxy 2 report") -
Stats - [![GitHub: DNSCrypt/dnscrypt-proxy](https://img.shields.io/github/stars/DNSCrypt/dnscrypt-proxy?style=flat&logo=github&label=dnscrypt-proxy&color=%235f53f4&cacheSeconds=3600)](https://github.com/DNSCrypt/dnscrypt-proxy) [![DNScrypt-proxy 2 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DNScrypt-proxy_2)](https://awesome-privacy.xyz/networking/dns-clients/dnscrypt-proxy-2) -˙ + [![GitHub: DNSCrypt/dnscrypt-proxy](https://img.shields.io/github/stars/DNSCrypt/dnscrypt-proxy?style=flat&logo=github&label=dnscrypt-proxy&color=%235f53f4&cacheSeconds=3600)](https://github.com/DNSCrypt/dnscrypt-proxy) [![DNScrypt-proxy 2 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DNScrypt-proxy_2)](https://awesome-privacy.xyz/networking/dns-clients/dnscrypt-proxy-2)ㅤ
- **[icon Unbound](https://nlnetlabs.nl/projects/unbound)** - Validating, recursive, caching DNS resolve with support for DNS-over-TLS. Designed to be fast, lean, and secure Unbound incorporates modern features based on open standards. It's fully open -source, and recently audited. (For an in-depth tutorial, see this article by DNSWatch.) -[…](https://awesome-privacy.xyz/networking/dns-clients/unbound "View full Unbound report") +source, an[…](https://awesome-privacy.xyz/networking/dns-clients/unbound "View full Unbound report") -
Stats - [![GitHub: NLnetLabs/unbound](https://img.shields.io/github/stars/NLnetLabs/unbound?style=flat&logo=github&label=unbound&color=%235f53f4&cacheSeconds=3600)](https://github.com/NLnetLabs/unbound) [![Privacy Policy](https://shields.tosdr.org/en_2519.svg)](https://tosdr.org/en/service/2519) [![Unbound on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Unbound)](https://awesome-privacy.xyz/networking/dns-clients/unbound) -˙ + [![GitHub: NLnetLabs/unbound](https://img.shields.io/github/stars/NLnetLabs/unbound?style=flat&logo=github&label=unbound&color=%235f53f4&cacheSeconds=3600)](https://github.com/NLnetLabs/unbound) [![Privacy Policy](https://shields.tosdr.org/en_2519.svg)](https://tosdr.org/en/service/2519) [![Unbound on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Unbound)](https://awesome-privacy.xyz/networking/dns-clients/unbound)ㅤ
- **[icon Nebulo](https://nebulo.app)** - Non-root, small-sized DNS changer utilizing DNS-over-HTTPS and DNS-over-TLS. (Note, since this uses Android's VPN API, it is not possible to run a VPN while using Nebulo.) -[…](https://awesome-privacy.xyz/networking/dns-clients/nebulo "View full Nebulo report") + -
Stats - [![GitHub: Ch4t4r/Nebulo](https://img.shields.io/github/stars/Ch4t4r/Nebulo?style=flat&logo=github&label=Nebulo&color=%235f53f4&cacheSeconds=3600)](https://github.com/Ch4t4r/Nebulo) [![Nebulo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Nebulo)](https://awesome-privacy.xyz/networking/dns-clients/nebulo) -📦 Open Source ˙ + [![GitHub: Ch4t4r/Nebulo](https://img.shields.io/github/stars/Ch4t4r/Nebulo?style=flat&logo=github&label=Nebulo&color=%235f53f4&cacheSeconds=3600)](https://github.com/Ch4t4r/Nebulo) [![Nebulo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Nebulo)](https://awesome-privacy.xyz/networking/dns-clients/nebulo) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/Ch4t4r/Nebulo)ㅤ
- **[icon RethinkDNS & Firewall](https://rethinkdns.com/app)** - Free and open source DNS changer with support for DNS-over-HTTPS, DNS-over-Tor, and DNSCrypt v3 with Anonymized Relays. (Note, since this uses Android's VPN API, it is not possible to run a -VPN while using RethinkDNS + Firewall.) -[…](https://awesome-privacy.xyz/networking/dns-clients/rethinkdns-and-firewall "View full RethinkDNS & Firewall report") +VPN while[…](https://awesome-privacy.xyz/networking/dns-clients/rethinkdns-and-firewall "View full RethinkDNS & Firewall report") -
Stats - [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/dns-clients/rethinkdns-and-firewall) -˙ + [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/dns-clients/rethinkdns-and-firewall) [![RethinkDNS & Firewall on Google Play](https://img.shields.io/badge/-RethinkDNS_%26_Firewall-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.celzero.bravedns)ㅤ
- **[icon DNS Cloak](https://apps.apple.com/us/app/dnscloak-secure-dns-client/id1452162351)** - Simple all that allows for the use for dnscrypt-proxy 2 on an iPhone. -[…](https://awesome-privacy.xyz/networking/dns-clients/dns-cloak "View full DNS Cloak report") + -
Stats - [![GitHub: s-s/dnscloak](https://img.shields.io/github/stars/s-s/dnscloak?style=flat&logo=github&label=dnscloak&color=%235f53f4&cacheSeconds=3600)](https://github.com/s-s/dnscloak) [![DNS Cloak on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DNS_Cloak)](https://awesome-privacy.xyz/networking/dns-clients/dns-cloak) -˙ + [![GitHub: s-s/dnscloak](https://img.shields.io/github/stars/s-s/dnscloak?style=flat&logo=github&label=dnscloak&color=%235f53f4&cacheSeconds=3600)](https://github.com/s-s/dnscloak) [![DNS Cloak on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DNS_Cloak)](https://awesome-privacy.xyz/networking/dns-clients/dns-cloak)ㅤ
- **[icon Stubby](https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby)** - Acts as a local DNS Privacy stub resolver (using DNS-over-TLS). Stubby encrypts DNS queries sent from a client machine (desktop or laptop) to a DNS Privacy resolver increasing end user privacy. -Stubby can be used in combination with Unbound - Unbound provides a local cache and Stubby manages -the upstream TLS connections (since Unbound cannot yet re-use TCP/TLS connections), -see example configuration. -[…](https://awesome-privacy.xyz/networking/dns-clients/stubby "View full Stubby report") +Stubby[…](https://awesome-privacy.xyz/networking/dns-clients/stubby "View full Stubby report") -
Stats - [![GitHub: getdnsapi/stubby](https://img.shields.io/github/stars/getdnsapi/stubby?style=flat&logo=github&label=stubby&color=%235f53f4&cacheSeconds=3600)](https://github.com/getdnsapi/stubby) [![Stubby on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stubby)](https://awesome-privacy.xyz/networking/dns-clients/stubby) -˙ + [![GitHub: getdnsapi/stubby](https://img.shields.io/github/stars/getdnsapi/stubby?style=flat&logo=github&label=stubby&color=%235f53f4&cacheSeconds=3600)](https://github.com/getdnsapi/stubby) [![Stubby on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stubby)](https://awesome-privacy.xyz/networking/dns-clients/stubby)ㅤ
@@ -2323,107 +2165,125 @@ can access which IPs. - **[icon NetGuard](https://netguard.me)** - Provides simple and advanced ways to block access to the internet. Applications and addresses can individually be allowed or denied access to Wi-Fi and/or mobile connection. -[…](https://awesome-privacy.xyz/networking/firewalls/netguard "View full NetGuard report") + -
Stats - [![GitHub: M66B/NetGuard](https://img.shields.io/github/stars/M66B/NetGuard?style=flat&logo=github&label=NetGuard&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/NetGuard) [![NetGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetGuard)](https://awesome-privacy.xyz/networking/firewalls/netguard) -˙ + [![GitHub: M66B/NetGuard](https://img.shields.io/github/stars/M66B/NetGuard?style=flat&logo=github&label=NetGuard&color=%235f53f4&cacheSeconds=3600)](https://github.com/M66B/NetGuard) [![NetGuard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetGuard)](https://awesome-privacy.xyz/networking/firewalls/netguard)ㅤ
- **[icon NoRoot Firewall](https://play.google.com/store/apps/details?id=app.greyshirts.firewall)** - Notifies you when an app is trying to access the Internet, so all you need to do is just Allow or Deny. Allows you to create filter rules based on IP address, host name or domain name, and -you can allow or deny only specific connections of an app. -[…](https://awesome-privacy.xyz/networking/firewalls/noroot-firewall "View full NoRoot Firewall report") -- **[icon AFWall+](https://xdaforums.com/t/5-0-root-3-6-0-afwall-iptables-firewall-28-aug-2023.1957231)** - Android Firewall+ (AFWall+) is an advanced iptables editor (GUI) for rooted Android devices, -which provides very fine-grained control over which Android apps are allowed to access the network. -[…](https://awesome-privacy.xyz/networking/firewalls/afwalland "View full AFWall+ report") +you can all[…](https://awesome-privacy.xyz/networking/firewalls/noroot-firewall "View full NoRoot Firewall report") -
Stats - [![GitHub: ukanth/afwall](https://img.shields.io/github/stars/ukanth/afwall?style=flat&logo=github&label=afwall&color=%235f53f4&cacheSeconds=3600)](https://github.com/ukanth/afwall) [![AFWall+ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFWall+)](https://awesome-privacy.xyz/networking/firewalls/afwalland) -˙ + [![NoRoot Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NoRoot_Firewall)](https://awesome-privacy.xyz/networking/firewalls/noroot-firewall)ㅤ + +
+- **[icon AFWall+](https://xdaforums.com/t/5-0-root-3-6-0-afwall-iptables-firewall-28-aug-2023.1957231)** - Android Firewall+ (AFWall+) is an advanced iptables editor (GUI) for rooted Android devices, +which provides very fine-grained control over which Android apps are allowed to access the network. + + -
+ Stats + + [![GitHub: ukanth/afwall](https://img.shields.io/github/stars/ukanth/afwall?style=flat&logo=github&label=afwall&color=%235f53f4&cacheSeconds=3600)](https://github.com/ukanth/afwall) [![AFWall+ on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFWall+)](https://awesome-privacy.xyz/networking/firewalls/afwalland)ㅤ
- **[icon RethinkDNS & Firewall](https://rethinkdns.com/app)** - An open-source ad-blocker and firewall app for Android 6+ (does not require root). -[…](https://awesome-privacy.xyz/networking/firewalls/rethinkdns-and-firewall "View full RethinkDNS & Firewall report") + -
Stats - [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/firewalls/rethinkdns-and-firewall) -˙ + [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/firewalls/rethinkdns-and-firewall) [![RethinkDNS & Firewall on Google Play](https://img.shields.io/badge/-RethinkDNS_%26_Firewall-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.celzero.bravedns)ㅤ
- **[icon Lockdown](https://lockdownprivacy.com)** - Firewall app for iPhone, allowing you to block any connection to any domain. -[…](https://awesome-privacy.xyz/networking/firewalls/lockdown "View full Lockdown report") -- **[icon SimpleWall](https://simplewall.en.lo4d.com)** - Tool to control Windows Filtering Platform (WFP), in order to configure detailed network activity on your PC. -(Windows) -[…](https://awesome-privacy.xyz/networking/firewalls/simplewall "View full SimpleWall report") + -
Stats - [![GitHub: henrypp/simplewall](https://img.shields.io/github/stars/henrypp/simplewall?style=flat&logo=github&label=simplewall&color=%235f53f4&cacheSeconds=3600)](https://github.com/henrypp/simplewall) [![SimpleWall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleWall)](https://awesome-privacy.xyz/networking/firewalls/simplewall) -˙ + [![Lockdown on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Lockdown)](https://awesome-privacy.xyz/networking/firewalls/lockdown)ㅤ + +
+- **[icon SimpleWall](https://simplewall.en.lo4d.com)** - Tool to control Windows Filtering Platform (WFP), in order to configure detailed network activity on your PC. +(Windows) + + -
+ Stats + + [![GitHub: henrypp/simplewall](https://img.shields.io/github/stars/henrypp/simplewall?style=flat&logo=github&label=simplewall&color=%235f53f4&cacheSeconds=3600)](https://github.com/henrypp/simplewall) [![SimpleWall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SimpleWall)](https://awesome-privacy.xyz/networking/firewalls/simplewall)ㅤ
- **[icon LuLu](https://objective-see.com/products/lulu.html)** - Free, open source macOS firewall. It aims to block unknown outgoing connections, unless explicitly approved by the user. -[…](https://awesome-privacy.xyz/networking/firewalls/lulu "View full LuLu report") + -
Stats - [![GitHub: objective-see/LuLu](https://img.shields.io/github/stars/objective-see/LuLu?style=flat&logo=github&label=LuLu&color=%235f53f4&cacheSeconds=3600)](https://github.com/objective-see/LuLu) [![Privacy Policy](https://shields.tosdr.org/en_3069.svg)](https://tosdr.org/en/service/3069) [![LuLu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LuLu)](https://awesome-privacy.xyz/networking/firewalls/lulu) -˙ + [![GitHub: objective-see/LuLu](https://img.shields.io/github/stars/objective-see/LuLu?style=flat&logo=github&label=LuLu&color=%235f53f4&cacheSeconds=3600)](https://github.com/objective-see/LuLu) [![Privacy Policy](https://shields.tosdr.org/en_3069.svg)](https://tosdr.org/en/service/3069) [![LuLu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LuLu)](https://awesome-privacy.xyz/networking/firewalls/lulu)ㅤ
- **[icon Little Snitch](https://obdev.at/products/littlesnitch/index.html)** - A very polished application firewall, allowing you to easily manage internet connections on a per-app basis. (Mac OS) -[…](https://awesome-privacy.xyz/networking/firewalls/little-snitch "View full Little Snitch report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_4121.svg)](https://tosdr.org/en/service/4121) [![Little Snitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Little_Snitch)](https://awesome-privacy.xyz/networking/firewalls/little-snitch) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_4121.svg)](https://tosdr.org/en/service/4121) [![Little Snitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Little_Snitch)](https://awesome-privacy.xyz/networking/firewalls/little-snitch)ㅤ
- **[icon OpenSnitch](https://github.com/evilsocket/opensnitch)** - Makes internet connections from all apps visible, allowing you to block or manage traffic on a per-app basis. GNU/Linux port of the Little Snitch application firewall. -[…](https://awesome-privacy.xyz/networking/firewalls/opensnitch "View full OpenSnitch report") + -
Stats - [![GitHub: evilsocket/opensnitch](https://img.shields.io/github/stars/evilsocket/opensnitch?style=flat&logo=github&label=opensnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/evilsocket/opensnitch) [![OpenSnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenSnitch)](https://awesome-privacy.xyz/networking/firewalls/opensnitch) -˙ + [![GitHub: evilsocket/opensnitch](https://img.shields.io/github/stars/evilsocket/opensnitch?style=flat&logo=github&label=opensnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/evilsocket/opensnitch) [![OpenSnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenSnitch)](https://awesome-privacy.xyz/networking/firewalls/opensnitch)ㅤ
- **[icon Gufw](https://en.wikipedia.org/wiki/Uncomplicated_Firewall)** - Open source GUI firewall for Linux, allowing you to block internet access for certain applications. -Supports both simple and advanced mode, GUI and CLI options, very easy to use, lightweight/ low-overhead, -under active maintenance and backed by a strong community. -[…](https://awesome-privacy.xyz/networking/firewalls/gufw "View full Gufw report") +Supports both simple and advanced mode, GUI and CLI options, very easy to use, lightweight/ low-over[…](https://awesome-privacy.xyz/networking/firewalls/gufw "View full Gufw report") -
Stats - [![GitHub: costales/gufw](https://img.shields.io/github/stars/costales/gufw?style=flat&logo=github&label=gufw&color=%235f53f4&cacheSeconds=3600)](https://github.com/costales/gufw) [![Gufw on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gufw)](https://awesome-privacy.xyz/networking/firewalls/gufw) -📦 Open Source ˙ + [![GitHub: costales/gufw](https://img.shields.io/github/stars/costales/gufw?style=flat&logo=github&label=gufw&color=%235f53f4&cacheSeconds=3600)](https://github.com/costales/gufw) [![Gufw on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gufw)](https://awesome-privacy.xyz/networking/firewalls/gufw) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/costales/gufw)ㅤ
- **[icon Uncomplicated Firewall](https://wiki.ubuntu.com/UncomplicatedFirewall)** - The ufw (Uncomplicated Firewall) is a GUI application and CLI, that allows you to configure a firewall using `iptables` much more easily. -[…](https://awesome-privacy.xyz/networking/firewalls/uncomplicated-firewall "View full Uncomplicated Firewall report") -- **[icon IPFire](https://www.ipfire.org)** - IPFire is a hardened, versatile, state-of-the-art Open Source firewall based on Linux. Easy to install -on a raspberry Pi, since it is lightweight and heavily customizable. -[…](https://awesome-privacy.xyz/networking/firewalls/ipfire "View full IPFire report") + -
Stats - [![GitHub: ipfire/ipfire-2.x](https://img.shields.io/github/stars/ipfire/ipfire-2.x?style=flat&logo=github&label=ipfire-2.x&color=%235f53f4&cacheSeconds=3600)](https://github.com/ipfire/ipfire-2.x) [![IPFire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IPFire)](https://awesome-privacy.xyz/networking/firewalls/ipfire) -˙ + [![Uncomplicated Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Uncomplicated_Firewall)](https://awesome-privacy.xyz/networking/firewalls/uncomplicated-firewall) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://wiki.ubuntu.com/UncomplicatedFirewall)ㅤ + +
+- **[icon IPFire](https://www.ipfire.org)** - IPFire is a hardened, versatile, state-of-the-art Open Source firewall based on Linux. Easy to install +on a raspberry Pi, since it is lightweight and heavily customizable. + + -
+ Stats + + [![GitHub: ipfire/ipfire-2.x](https://img.shields.io/github/stars/ipfire/ipfire-2.x?style=flat&logo=github&label=ipfire-2.x&color=%235f53f4&cacheSeconds=3600)](https://github.com/ipfire/ipfire-2.x) [![IPFire on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IPFire)](https://awesome-privacy.xyz/networking/firewalls/ipfire)ㅤ
- **[icon Shorewall](https://shorewall.org)** - An open source firewall tool for Linux that builds upon the Netfilter system built into the Linux kernel, making it easier to manage more complex configuration schemes with iptables. -[…](https://awesome-privacy.xyz/networking/firewalls/shorewall "View full Shorewall report") + + -
+ Stats + + [![Shorewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Shorewall)](https://awesome-privacy.xyz/networking/firewalls/shorewall) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://shorewall.org)ㅤ + +
- **[icon OPNSense](https://opnsense.org)** - Enterprise firewall and router for protecting networks, built on the FreeBSD system. -[…](https://awesome-privacy.xyz/networking/firewalls/opnsense "View full OPNSense report") + + -
+ Stats + + [![OPNSense on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OPNSense)](https://awesome-privacy.xyz/networking/firewalls/opnsense) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://opnsense.org)ㅤ + +
⚠️ Word of Warning @@ -2457,80 +2317,70 @@ detect certain content based on pattern matching - **[icon Pi-Hole](https://pi-hole.net/)** - Incredibly powerful, network-wide ad-blocker. Works out-of-the-box, light-weight with an intuitive web interface, but still allows for a lot of advanced configuration for power users. As well as -blocking ads and trackers, Pi-Hole speeds up your network speeds quite significantly. The dashboard -has detailed statistics, and makes it easy to pause/ resume Pi-Hole if needed. -[…](https://awesome-privacy.xyz/networking/ad-blockers/pi-hole "View full Pi-Hole report") +block[…](https://awesome-privacy.xyz/networking/ad-blockers/pi-hole "View full Pi-Hole report") -
Stats - [![GitHub: pi-hole/pi-hole](https://img.shields.io/github/stars/pi-hole/pi-hole?style=flat&logo=github&label=pi-hole&color=%235f53f4&cacheSeconds=3600)](https://github.com/pi-hole/pi-hole) [![Pi-Hole on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pi-Hole)](https://awesome-privacy.xyz/networking/ad-blockers/pi-hole) -˙ + [![GitHub: pi-hole/pi-hole](https://img.shields.io/github/stars/pi-hole/pi-hole?style=flat&logo=github&label=pi-hole&color=%235f53f4&cacheSeconds=3600)](https://github.com/pi-hole/pi-hole) [![Pi-Hole on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pi-Hole)](https://awesome-privacy.xyz/networking/ad-blockers/pi-hole)ㅤ
- **[icon Diversion](https://diversion.ch)** - A shell script application to manage ad-blocking, Dnsmasq logging, Entware and pixelserv-tls installations and more on supported routers running Asuswrt-Merlin firmware, including its forks. -[…](https://awesome-privacy.xyz/networking/ad-blockers/diversion "View full Diversion report") -- **[icon BlockParty](https://github.com/krishkumar/BlockParty)** - Native Apple (Swift) apps, for system-wide ad-blocking. Can be customized with custom host lists, -primarily aimed for just ad-blocking. -[…](https://awesome-privacy.xyz/networking/ad-blockers/blockparty "View full BlockParty report") + -
Stats - [![GitHub: krishkumar/BlockParty](https://img.shields.io/github/stars/krishkumar/BlockParty?style=flat&logo=github&label=BlockParty&color=%235f53f4&cacheSeconds=3600)](https://github.com/krishkumar/BlockParty) [![BlockParty on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BlockParty)](https://awesome-privacy.xyz/networking/ad-blockers/blockparty) -˙ + [![Diversion on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Diversion)](https://awesome-privacy.xyz/networking/ad-blockers/diversion)ㅤ + +
+- **[icon BlockParty](https://github.com/krishkumar/BlockParty)** - Native Apple (Swift) apps, for system-wide ad-blocking. Can be customized with custom host lists, +primarily aimed for just ad-blocking. + + -
+ Stats + + [![GitHub: krishkumar/BlockParty](https://img.shields.io/github/stars/krishkumar/BlockParty?style=flat&logo=github&label=BlockParty&color=%235f53f4&cacheSeconds=3600)](https://github.com/krishkumar/BlockParty) [![BlockParty on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BlockParty)](https://awesome-privacy.xyz/networking/ad-blockers/blockparty)ㅤ
- **[icon hBlock](https://hblock.molinero.dev)** - A POSIX-compliant shell script, designed for Unix-like systems, that gets a list of domains that serve ads, -tracking scripts and malware from multiple sources and creates a hosts file (alternative formats are also supported) -that prevents your system from connecting to them. Aimed at improving security and privacy through blocking advert, -tracking and malware associated domains. -[…](https://awesome-privacy.xyz/networking/ad-blockers/hblock "View full hBlock report") +tracking scripts and malware from multiple sources and creates a hosts file (alternative for[…](https://awesome-privacy.xyz/networking/ad-blockers/hblock "View full hBlock report") -
Stats - [![GitHub: hectorm/hblock](https://img.shields.io/github/stars/hectorm/hblock?style=flat&logo=github&label=hblock&color=%235f53f4&cacheSeconds=3600)](https://github.com/hectorm/hblock) [![hBlock on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=hBlock)](https://awesome-privacy.xyz/networking/ad-blockers/hblock) -˙ + [![GitHub: hectorm/hblock](https://img.shields.io/github/stars/hectorm/hblock?style=flat&logo=github&label=hblock&color=%235f53f4&cacheSeconds=3600)](https://github.com/hectorm/hblock) [![hBlock on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=hBlock)](https://awesome-privacy.xyz/networking/ad-blockers/hblock)ㅤ
- **[icon Blokada](https://blokada.org/)** - Open source mobile ad-blocker that acts like a firewall. Since it's device-wide, once connected all apps will -have ads/ trackers blocked, and the blacklist can be edited. The app is free, but there is a premium option, -which has a built-in VPN. -[…](https://awesome-privacy.xyz/networking/ad-blockers/blokada "View full Blokada report") +have ads/ trackers blocked, and the blacklist can be edited. The app is free, but there is[…](https://awesome-privacy.xyz/networking/ad-blockers/blokada "View full Blokada report") -
Stats - [![GitHub: blokadaorg/blokada](https://img.shields.io/github/stars/blokadaorg/blokada?style=flat&logo=github&label=blokada&color=%235f53f4&cacheSeconds=3600)](https://github.com/blokadaorg/blokada) [![Privacy Policy](https://shields.tosdr.org/en_8557.svg)](https://tosdr.org/en/service/8557) [![Blokada on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blokada)](https://awesome-privacy.xyz/networking/ad-blockers/blokada) -˙ + [![GitHub: blokadaorg/blokada](https://img.shields.io/github/stars/blokadaorg/blokada?style=flat&logo=github&label=blokada&color=%235f53f4&cacheSeconds=3600)](https://github.com/blokadaorg/blokada) [![Privacy Policy](https://shields.tosdr.org/en_8557.svg)](https://tosdr.org/en/service/8557) [![Blokada on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blokada)](https://awesome-privacy.xyz/networking/ad-blockers/blokada) [![Blokada on Google Play](https://img.shields.io/badge/-Blokada-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=org.blokada.sex) [![Blokada on App Store](https://img.shields.io/badge/-Blokada-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/blokada/id1508341781)ㅤ
- **[icon RethinkDNS & Firewall](https://rethinkdns.com/app)** - Free and open source ad-blocker and a firewall for Android 6+ (no root required). -[…](https://awesome-privacy.xyz/networking/ad-blockers/rethinkdns-and-firewall "View full RethinkDNS & Firewall report") + -
Stats - [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/ad-blockers/rethinkdns-and-firewall) -˙ + [![GitHub: celzero/rethink-app](https://img.shields.io/github/stars/celzero/rethink-app?style=flat&logo=github&label=rethink-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/celzero/rethink-app) [![Privacy Policy](https://shields.tosdr.org/en_4691.svg)](https://tosdr.org/en/service/4691) [![RethinkDNS & Firewall on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RethinkDNS_&_Firewall)](https://awesome-privacy.xyz/networking/ad-blockers/rethinkdns-and-firewall) [![RethinkDNS & Firewall on Google Play](https://img.shields.io/badge/-RethinkDNS_%26_Firewall-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.celzero.bravedns)ㅤ
- **[icon Ad Block Radio](https://github.com/adblockradio/adblockradio)** - Python script that uses machine learning to block adverts in live audio streams, such as Radio, Podcasts, Audio Books, and music platforms such as Spotify. See live demo. -[…](https://awesome-privacy.xyz/networking/ad-blockers/ad-block-radio "View full Ad Block Radio report") + -
Stats - [![GitHub: adblockradio/adblockradio](https://img.shields.io/github/stars/adblockradio/adblockradio?style=flat&logo=github&label=adblockradio&color=%235f53f4&cacheSeconds=3600)](https://github.com/adblockradio/adblockradio) [![Ad Block Radio on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ad_Block_Radio)](https://awesome-privacy.xyz/networking/ad-blockers/ad-block-radio) -˙ + [![GitHub: adblockradio/adblockradio](https://img.shields.io/github/stars/adblockradio/adblockradio?style=flat&logo=github&label=adblockradio&color=%235f53f4&cacheSeconds=3600)](https://github.com/adblockradio/adblockradio) [![Ad Block Radio on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Ad_Block_Radio)](https://awesome-privacy.xyz/networking/ad-blockers/ad-block-radio)ㅤ
- **[icon uBlock Origin](https://github.com/gorhill/uBlock)** - Light-weight, fast browser extension for Firefox and Chromium (Chrome, Edge, Brave Opera etc), that blocks -tracking, ads and known malware. uBlock is easy-to-use out-of-the-box, but also has a highly customisable -advanced mode, with a point-and-click firewall which can be configured on a per-site basis. -[…](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin "View full uBlock Origin report") +tracking, ads and known malware. uBlock is easy-to-use out-of-the-box, but also has a highly[…](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin "View full uBlock Origin report") -
Stats - [![GitHub: gorhill/uBlock](https://img.shields.io/github/stars/gorhill/uBlock?style=flat&logo=github&label=uBlock&color=%235f53f4&cacheSeconds=3600)](https://github.com/gorhill/uBlock) [![uBlock Origin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=uBlock_Origin)](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin) -˙ + [![GitHub: gorhill/uBlock](https://img.shields.io/github/stars/gorhill/uBlock?style=flat&logo=github&label=uBlock&color=%235f53f4&cacheSeconds=3600)](https://github.com/gorhill/uBlock) [![uBlock Origin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=uBlock_Origin)](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin)ㅤ
@@ -2559,38 +2409,46 @@ advanced mode, with a point-and-click firewall which can be configured on a per- ### Host Block Lists - **[icon SomeoneWhoCares/ Hosts](https://someonewhocares.org/hosts)** - An up-to-date host list, maintained by Dan Pollock - to make the internet not suck (as much). -[…](https://awesome-privacy.xyz/networking/host-block-lists/someonewhocares/-hosts "View full SomeoneWhoCares/ Hosts report") -- **[icon Hosts by StevenBlack](https://github.com/StevenBlack/hosts)** - Open source, community-maintained consolidated and extending hosts files from several well-curated -sources. You can optionally pick extensions to block p0rn, Social Media, gambling, fake news and other categories. -[…](https://awesome-privacy.xyz/networking/host-block-lists/hosts-by-stevenblack "View full Hosts by StevenBlack report") + -
Stats - [![GitHub: StevenBlack/hosts](https://img.shields.io/github/stars/StevenBlack/hosts?style=flat&logo=github&label=hosts&color=%235f53f4&cacheSeconds=3600)](https://github.com/StevenBlack/hosts) [![Hosts by StevenBlack on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Hosts_by_StevenBlack)](https://awesome-privacy.xyz/networking/host-block-lists/hosts-by-stevenblack) -˙ + [![SomeoneWhoCares/ Hosts on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SomeoneWhoCares/_Hosts)](https://awesome-privacy.xyz/networking/host-block-lists/someonewhocares/-hosts)ㅤ + +
+- **[icon Hosts by StevenBlack](https://github.com/StevenBlack/hosts)** - Open source, community-maintained consolidated and extending hosts files from several well-curated +sources. You can optionally pick extensions to block p0rn, Social Media, gambling, fake news and othe[…](https://awesome-privacy.xyz/networking/host-block-lists/hosts-by-stevenblack "View full Hosts by StevenBlack report") + -
+ Stats + + [![GitHub: StevenBlack/hosts](https://img.shields.io/github/stars/StevenBlack/hosts?style=flat&logo=github&label=hosts&color=%235f53f4&cacheSeconds=3600)](https://github.com/StevenBlack/hosts) [![Hosts by StevenBlack on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Hosts_by_StevenBlack)](https://awesome-privacy.xyz/networking/host-block-lists/hosts-by-stevenblack)ㅤ
- **[icon No Google](https://github.com/nickspaargaren/no-google)** - Totally block all direct and indirect content from Google, Amazon, Facebook, Apple and Microsoft (or just some). -[…](https://awesome-privacy.xyz/networking/host-block-lists/no-google "View full No Google report") + -
Stats - [![GitHub: nickspaargaren/no-google](https://img.shields.io/github/stars/nickspaargaren/no-google?style=flat&logo=github&label=no-google&color=%235f53f4&cacheSeconds=3600)](https://github.com/nickspaargaren/no-google) [![No Google on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=No_Google)](https://awesome-privacy.xyz/networking/host-block-lists/no-google) -˙ + [![GitHub: nickspaargaren/no-google](https://img.shields.io/github/stars/nickspaargaren/no-google?style=flat&logo=github&label=no-google&color=%235f53f4&cacheSeconds=3600)](https://github.com/nickspaargaren/no-google) [![No Google on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=No_Google)](https://awesome-privacy.xyz/networking/host-block-lists/no-google)ㅤ
- **[icon EasyList](https://easylist.to)** - Comprehensive list of domains for blocking tracking, social scripts, bad cookies and annoying stuff. -[…](https://awesome-privacy.xyz/networking/host-block-lists/easylist "View full EasyList report") + -
Stats - [![GitHub: easylist/easylist](https://img.shields.io/github/stars/easylist/easylist?style=flat&logo=github&label=easylist&color=%235f53f4&cacheSeconds=3600)](https://github.com/easylist/easylist) [![EasyList on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=EasyList)](https://awesome-privacy.xyz/networking/host-block-lists/easylist) -˙ + [![GitHub: easylist/easylist](https://img.shields.io/github/stars/easylist/easylist?style=flat&logo=github&label=easylist&color=%235f53f4&cacheSeconds=3600)](https://github.com/easylist/easylist) [![EasyList on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=EasyList)](https://awesome-privacy.xyz/networking/host-block-lists/easylist)ㅤ
- **[icon iBlockList](https://www.iblocklist.com)** - Variety of lists (free and paid-for) for blocking content based on certain topics, inducing: spam, abuse, political, illegal, hijacked, bad peers and more. -[…](https://awesome-privacy.xyz/networking/host-block-lists/iblocklist "View full iBlockList report") + + -
+ Stats + + [![iBlockList on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=iBlockList)](https://awesome-privacy.xyz/networking/host-block-lists/iblocklist)ㅤ + +

⬆️ [Back to Top]

@@ -2602,24 +2460,19 @@ Installing a custom firmware on your Wi-Fi router gives you greater control over security, privacy and performance - **[icon OpenWRT](https://openwrt.org)** - Plenty of scope for customization and a ton of supported addons. Stateful firewall, NAT, and dynamically-configured -port forwarding protocols (UPnP, NAT-PMP + upnpd, etc), Load balancing, IP tunneling, IPv4 & IPv6 support. -[…](https://awesome-privacy.xyz/networking/router-firmware/openwrt "View full OpenWRT report") +port forwarding protocols (UPnP, NAT-PMP + upnpd, etc), Load balancing, IP tunneling[…](https://awesome-privacy.xyz/networking/router-firmware/openwrt "View full OpenWRT report") -
Stats - [![GitHub: openwrt/openwrt](https://img.shields.io/github/stars/openwrt/openwrt?style=flat&logo=github&label=openwrt&color=%235f53f4&cacheSeconds=3600)](https://github.com/openwrt/openwrt) [![Privacy Policy](https://shields.tosdr.org/en_1603.svg)](https://tosdr.org/en/service/1603) [![OpenWRT on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenWRT)](https://awesome-privacy.xyz/networking/router-firmware/openwrt) -˙ + [![GitHub: openwrt/openwrt](https://img.shields.io/github/stars/openwrt/openwrt?style=flat&logo=github&label=openwrt&color=%235f53f4&cacheSeconds=3600)](https://github.com/openwrt/openwrt) [![Privacy Policy](https://shields.tosdr.org/en_1603.svg)](https://tosdr.org/en/service/1603) [![OpenWRT on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenWRT)](https://awesome-privacy.xyz/networking/router-firmware/openwrt)ㅤ
- **[icon DD-WRT](https://dd-wrt.com)** - Easy and powerful user interface. Great access control, bandwidth monitoring and quality of service. -IPTables is built-in for firewall, and there's great VPN support as well as additional plug-and-play -and wake-on-lan features. -[…](https://awesome-privacy.xyz/networking/router-firmware/dd-wrt "View full DD-WRT report") +IPTables is built-in for firewall, and there's great VPN support as well as additional plug-and-pla[…](https://awesome-privacy.xyz/networking/router-firmware/dd-wrt "View full DD-WRT report") -
Stats - [![GitHub: mirror/dd-wrt](https://img.shields.io/github/stars/mirror/dd-wrt?style=flat&logo=github&label=dd-wrt&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirror/dd-wrt) [![DD-WRT on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DD-WRT)](https://awesome-privacy.xyz/networking/router-firmware/dd-wrt) -˙ + [![GitHub: mirror/dd-wrt](https://img.shields.io/github/stars/mirror/dd-wrt?style=flat&logo=github&label=dd-wrt&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirror/dd-wrt) [![DD-WRT on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DD-WRT)](https://awesome-privacy.xyz/networking/router-firmware/dd-wrt)ㅤ
@@ -2655,36 +2508,37 @@ through a proxy - these tools will help you better understand the extent of blocking, deep packet inspection and what data is being analysed - **[icon OONI](https://ooni.org)** - Open Observatory of Network Interference - A free tool and global observation network, for detecting censorship, -surveillance and traffic manipulation on the internet. Developed by The Tor Project, and available for Android, -iOS, and Linux. -[…](https://awesome-privacy.xyz/networking/network-analysis/ooni "View full OONI report") +surveillance and traffic manipulation on the internet. Developed by The Tor Project, an[…](https://awesome-privacy.xyz/networking/network-analysis/ooni "View full OONI report") -
Stats - [![GitHub: ooni/probe](https://img.shields.io/github/stars/ooni/probe?style=flat&logo=github&label=probe&color=%235f53f4&cacheSeconds=3600)](https://github.com/ooni/probe) [![Privacy Policy](https://shields.tosdr.org/en_6241.svg)](https://tosdr.org/en/service/6241) [![OONI on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OONI)](https://awesome-privacy.xyz/networking/network-analysis/ooni) -˙ + [![GitHub: ooni/probe](https://img.shields.io/github/stars/ooni/probe?style=flat&logo=github&label=probe&color=%235f53f4&cacheSeconds=3600)](https://github.com/ooni/probe) [![Privacy Policy](https://shields.tosdr.org/en_6241.svg)](https://tosdr.org/en/service/6241) [![OONI on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OONI)](https://awesome-privacy.xyz/networking/network-analysis/ooni)ㅤ
- **[icon Goodbye DPI](https://ntc.party/c/community-software/goodbyedpi/8)** - Passive Deep Packet Inspection blocker and Active DPI circumvention utility, for Windows. -[…](https://awesome-privacy.xyz/networking/network-analysis/goodbye-dpi "View full Goodbye DPI report") + -
Stats - [![GitHub: ValdikSS/GoodbyeDPI](https://img.shields.io/github/stars/ValdikSS/GoodbyeDPI?style=flat&logo=github&label=GoodbyeDPI&color=%235f53f4&cacheSeconds=3600)](https://github.com/ValdikSS/GoodbyeDPI) [![Goodbye DPI on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Goodbye_DPI)](https://awesome-privacy.xyz/networking/network-analysis/goodbye-dpi) -˙ + [![GitHub: ValdikSS/GoodbyeDPI](https://img.shields.io/github/stars/ValdikSS/GoodbyeDPI?style=flat&logo=github&label=GoodbyeDPI&color=%235f53f4&cacheSeconds=3600)](https://github.com/ValdikSS/GoodbyeDPI) [![Goodbye DPI on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Goodbye_DPI)](https://awesome-privacy.xyz/networking/network-analysis/goodbye-dpi)ㅤ
- **[icon DPITunnel](https://github.com/zhenyolka/DPITunnel)** - An Android app to bypass deep packet inspection. -[…](https://awesome-privacy.xyz/networking/network-analysis/dpitunnel "View full DPITunnel report") + -
Stats - [![GitHub: nomoresat/DPITunnel-android](https://img.shields.io/github/stars/nomoresat/DPITunnel-android?style=flat&logo=github&label=DPITunnel-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/nomoresat/DPITunnel-android) [![DPITunnel on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DPITunnel)](https://awesome-privacy.xyz/networking/network-analysis/dpitunnel) -˙ + [![GitHub: nomoresat/DPITunnel-android](https://img.shields.io/github/stars/nomoresat/DPITunnel-android?style=flat&logo=github&label=DPITunnel-android&color=%235f53f4&cacheSeconds=3600)](https://github.com/nomoresat/DPITunnel-android) [![DPITunnel on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DPITunnel)](https://awesome-privacy.xyz/networking/network-analysis/dpitunnel)ㅤ
- **[icon Proxy Checker](https://ping.eu/proxy/)** - You can quickly check if a given IP is using a proxy, this can also be done through the command line. -[…](https://awesome-privacy.xyz/networking/network-analysis/proxy-checker "View full Proxy Checker report") + + -
+ Stats + + [![Proxy Checker on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Proxy_Checker)](https://awesome-privacy.xyz/networking/network-analysis/proxy-checker)ㅤ + +

⬆️ [Back to Top]

@@ -2698,47 +2552,44 @@ or unexpected events. If you are running a server, then it's essential to know about an incident as soon as possible, in order to minimize damage. - **[icon Zeek](https://zeek.org/)** - Zeek (formally Bro) Passively monitors network traffic and looks for suspicious activity. -[…](https://awesome-privacy.xyz/networking/intrusion-detection/zeek "View full Zeek report") + -
Stats - [![GitHub: zeek/zeek](https://img.shields.io/github/stars/zeek/zeek?style=flat&logo=github&label=zeek&color=%235f53f4&cacheSeconds=3600)](https://github.com/zeek/zeek) [![Zeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Zeek)](https://awesome-privacy.xyz/networking/intrusion-detection/zeek) -˙ + [![GitHub: zeek/zeek](https://img.shields.io/github/stars/zeek/zeek?style=flat&logo=github&label=zeek&color=%235f53f4&cacheSeconds=3600)](https://github.com/zeek/zeek) [![Zeek on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Zeek)](https://awesome-privacy.xyz/networking/intrusion-detection/zeek)ㅤ
- **[icon OSSEC](https://www.ossec.net/)** - OSSEC is an Open Source host-based intrusion detection system, that performs log analysis, integrity checking, monitoring, rootkit detection, real-time alerting and active response. -[…](https://awesome-privacy.xyz/networking/intrusion-detection/ossec "View full OSSEC report") + -
Stats - [![GitHub: ossec/ossec-hids](https://img.shields.io/github/stars/ossec/ossec-hids?style=flat&logo=github&label=ossec-hids&color=%235f53f4&cacheSeconds=3600)](https://github.com/ossec/ossec-hids) [![OSSEC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OSSEC)](https://awesome-privacy.xyz/networking/intrusion-detection/ossec) -˙ + [![GitHub: ossec/ossec-hids](https://img.shields.io/github/stars/ossec/ossec-hids?style=flat&logo=github&label=ossec-hids&color=%235f53f4&cacheSeconds=3600)](https://github.com/ossec/ossec-hids) [![OSSEC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OSSEC)](https://awesome-privacy.xyz/networking/intrusion-detection/ossec)ㅤ
- **[icon Kismet](https://www.kismetwireless.net)** - An 802.11 layer2 wireless network detector, sniffer, and intrusion detection system. -[…](https://awesome-privacy.xyz/networking/intrusion-detection/kismet "View full Kismet report") + -
Stats - [![GitHub: kismetwireless/kismet](https://img.shields.io/github/stars/kismetwireless/kismet?style=flat&logo=github&label=kismet&color=%235f53f4&cacheSeconds=3600)](https://github.com/kismetwireless/kismet) [![Kismet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kismet)](https://awesome-privacy.xyz/networking/intrusion-detection/kismet) -˙ + [![GitHub: kismetwireless/kismet](https://img.shields.io/github/stars/kismetwireless/kismet?style=flat&logo=github&label=kismet&color=%235f53f4&cacheSeconds=3600)](https://github.com/kismetwireless/kismet) [![Kismet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kismet)](https://awesome-privacy.xyz/networking/intrusion-detection/kismet)ㅤ
- **[icon Snare](https://www.snaresolutions.com/products/snare-central)** - SNARE (System iNtrusion Analysis and Reporting Environment) is a series of log collection agents that facilitate -centralized analysis of audit log data. Logs from the OS are collected and audited. Full remote access, through -a web interface easy to use manually, or by an automated process. -[…](https://awesome-privacy.xyz/networking/intrusion-detection/snare "View full Snare report") -- **[icon picosnitch](https://elesiuta.github.io/picosnitch)** - picosnitch helps protect your security and privacy by "snitching" on anything that connects to the internet, -letting you know when, how much data was transferred, and to where. It uses BPF to monitor network traffic per -application, and per parent to cover those that just call others. It also hashes every executable, and will -complain if some mischievous program is giving it trouble. -[…](https://awesome-privacy.xyz/networking/intrusion-detection/picosnitch "View full picosnitch report") +centralized analysis of audit log data. Logs from the OS are collected and audited. Ful[…](https://awesome-privacy.xyz/networking/intrusion-detection/snare "View full Snare report") -
Stats - [![GitHub: elesiuta/picosnitch](https://img.shields.io/github/stars/elesiuta/picosnitch?style=flat&logo=github&label=picosnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/elesiuta/picosnitch) [![picosnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=picosnitch)](https://awesome-privacy.xyz/networking/intrusion-detection/picosnitch) -˙ + [![Snare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Snare)](https://awesome-privacy.xyz/networking/intrusion-detection/snare)ㅤ + +
+- **[icon picosnitch](https://elesiuta.github.io/picosnitch)** - picosnitch helps protect your security and privacy by "snitching" on anything that connects to the internet, +letting you know when, how much data was transferred, and to where. It uses BPF to monitor[…](https://awesome-privacy.xyz/networking/intrusion-detection/picosnitch "View full picosnitch report") + -
+ Stats + + [![GitHub: elesiuta/picosnitch](https://img.shields.io/github/stars/elesiuta/picosnitch?style=flat&logo=github&label=picosnitch&color=%235f53f4&cacheSeconds=3600)](https://github.com/elesiuta/picosnitch) [![picosnitch on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=picosnitch)](https://awesome-privacy.xyz/networking/intrusion-detection/picosnitch)ㅤ
@@ -2755,29 +2606,28 @@ to sign up anonymously, and will keep your files and data safe is be important. - **[icon Njalla](https://njal.la)** - Njalla is a privacy and security-focused domain registrar and VPN hosting provider. They own and manage all their -own servers, which are based in Sweden. They accept crypto, for anonymous payments, and allow you to sign up with -OTR XMPP if you do not want to provide an email address. Both VPS and domain name pricing is reasonable, with -packages starting at $15/ month. -[…](https://awesome-privacy.xyz/networking/cloud-hosting/njalla "View full Njalla report") +own servers, which are based in Sweden. They accept crypto, for anonymous payments, an[…](https://awesome-privacy.xyz/networking/cloud-hosting/njalla "View full Njalla report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3688.svg)](https://tosdr.org/en/service/3688) [![Njalla on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Njalla)](https://awesome-privacy.xyz/networking/cloud-hosting/njalla) -💰 Accepts Anonymous Payment ˙ + [![Privacy Policy](https://shields.tosdr.org/en_3688.svg)](https://tosdr.org/en/service/3688) [![Njalla on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Njalla)](https://awesome-privacy.xyz/networking/cloud-hosting/njalla) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ
- **[icon Private Layer](https://www.privatelayer.com)** - Offers enterprise-grade, high-speed offshore dedicated servers, they own their own data centres, have a solid privacy policy and accept anonymous payment. -[…](https://awesome-privacy.xyz/networking/cloud-hosting/private-layer "View full Private Layer report") -- **[icon Servers Guru](https://servers.guru)** - Servers Guru provides affordable and anonymous VPS and cloud servers with dedicated cpu resources. They accept -crypto-currencies (Bitcoin, Monero, Ethereum etc..) and don't require any personal informations. They resell from -reputable providers. -[…](https://awesome-privacy.xyz/networking/cloud-hosting/servers-guru "View full Servers Guru report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_8079.svg)](https://tosdr.org/en/service/8079) [![Servers Guru on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Servers_Guru)](https://awesome-privacy.xyz/networking/cloud-hosting/servers-guru) -💰 Accepts Anonymous Payment ˙ + [![Private Layer on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Private_Layer)](https://awesome-privacy.xyz/networking/cloud-hosting/private-layer) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ + +
+- **[icon Servers Guru](https://servers.guru)** - Servers Guru provides affordable and anonymous VPS and cloud servers with dedicated cpu resources. They accept +crypto-currencies (Bitcoin, Monero, Ethereum etc..) and don't require any personal inform[…](https://awesome-privacy.xyz/networking/cloud-hosting/servers-guru "View full Servers Guru report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_8079.svg)](https://tosdr.org/en/service/8079) [![Servers Guru on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Servers_Guru)](https://awesome-privacy.xyz/networking/cloud-hosting/servers-guru) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ
@@ -2811,17 +2661,22 @@ who have legal right to view your data. ### Domain Registrars - **[icon Njal.la](https://njal.la)** - Privacy-aware domain service with anonymous sign-up and accepts cryptocurrency. -[…](https://awesome-privacy.xyz/networking/domain-registrars/njal.la "View full Njal.la report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3688.svg)](https://tosdr.org/en/service/3688) [![Njal.la on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Njal.la)](https://awesome-privacy.xyz/networking/domain-registrars/njal.la) -💰 Accepts Anonymous Payment ˙ + [![Privacy Policy](https://shields.tosdr.org/en_3688.svg)](https://tosdr.org/en/service/3688) [![Njal.la on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Njal.la)](https://awesome-privacy.xyz/networking/domain-registrars/njal.la) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ
- **[icon Orange Website](https://www.orangewebsite.com/domain-registration.php)** - Anonymous domain registration, with low online censorship since they are based outside the 14-eyes jurisdiction (in Iceland). -[…](https://awesome-privacy.xyz/networking/domain-registrars/orange-website "View full Orange Website report") + + -
+ Stats + + [![Orange Website on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Orange_Website)](https://awesome-privacy.xyz/networking/domain-registrars/orange-website) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ + +

⬆️ [Back to Top]

@@ -2830,13 +2685,12 @@ who have legal right to view your data. ### DNS Hosting - **[icon deSEC](https://desec.io)** - Free DNS hosting provider designed with security in mind, and running -on purely open source software. deSEC is backed and funded by SSE. -[…](https://awesome-privacy.xyz/networking/dns-hosting/desec "View full deSEC report") +on purely open source software. deSEC is backed and funded by SSE. + -
Stats - [![GitHub: desec-io/desec-stack](https://img.shields.io/github/stars/desec-io/desec-stack?style=flat&logo=github&label=desec-stack&color=%235f53f4&cacheSeconds=3600)](https://github.com/desec-io/desec-stack) [![deSEC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=deSEC)](https://awesome-privacy.xyz/networking/dns-hosting/desec) -📦 Open Source ˙ + [![GitHub: desec-io/desec-stack](https://img.shields.io/github/stars/desec-io/desec-stack?style=flat&logo=github&label=desec-stack&color=%235f53f4&cacheSeconds=3600)](https://github.com/desec-io/desec-stack) [![deSEC on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=deSEC)](https://awesome-privacy.xyz/networking/dns-hosting/desec) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/desec-io/desec-stack)ㅤ
@@ -2848,31 +2702,28 @@ on purely open source software. deSEC is backed and funded by SSE. - **[icon Mail-in-a-box](https://mailinabox.email)** - Easy-to-deploy fully-featured and pre-configured SMTP mail server. It includes everything from webmail, to spam filtering and backups. -[…](https://awesome-privacy.xyz/networking/mail-servers/mail-in-a-box "View full Mail-in-a-box report") + -
Stats - [![GitHub: mail-in-a-box/mailinabox](https://img.shields.io/github/stars/mail-in-a-box/mailinabox?style=flat&logo=github&label=mailinabox&color=%235f53f4&cacheSeconds=3600)](https://github.com/mail-in-a-box/mailinabox) [![Mail-in-a-box on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mail-in-a-box)](https://awesome-privacy.xyz/networking/mail-servers/mail-in-a-box) -˙ + [![GitHub: mail-in-a-box/mailinabox](https://img.shields.io/github/stars/mail-in-a-box/mailinabox?style=flat&logo=github&label=mailinabox&color=%235f53f4&cacheSeconds=3600)](https://github.com/mail-in-a-box/mailinabox) [![Mail-in-a-box on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mail-in-a-box)](https://awesome-privacy.xyz/networking/mail-servers/mail-in-a-box)ㅤ
- **[icon Docker Mailserver](https://docker-mailserver.github.io/docker-mailserver/latest)** - A full-stack but simple mailserver (smtp, imap, antispam, antivirus, ssl...) using Docker. Very complete, with everything you will need, customizable and very easy to deploy with docker. -[…](https://awesome-privacy.xyz/networking/mail-servers/docker-mailserver "View full Docker Mailserver report") + -
Stats - [![GitHub: tomav/docker-mailserver](https://img.shields.io/github/stars/tomav/docker-mailserver?style=flat&logo=github&label=docker-mailserver&color=%235f53f4&cacheSeconds=3600)](https://github.com/tomav/docker-mailserver) [![Docker Mailserver on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Docker_Mailserver)](https://awesome-privacy.xyz/networking/mail-servers/docker-mailserver) -˙ + [![GitHub: tomav/docker-mailserver](https://img.shields.io/github/stars/tomav/docker-mailserver?style=flat&logo=github&label=docker-mailserver&color=%235f53f4&cacheSeconds=3600)](https://github.com/tomav/docker-mailserver) [![Docker Mailserver on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Docker_Mailserver)](https://awesome-privacy.xyz/networking/mail-servers/docker-mailserver)ㅤ
- **[icon mailcow](https://mailcow.email/)** - A mail server with everything you need (SMTP, IMAP, webmail, NextCloud support..) using Docker. -[…](https://awesome-privacy.xyz/networking/mail-servers/mailcow "View full mailcow report") + -
Stats - [![GitHub: mailcow/mailcow-dockerized](https://img.shields.io/github/stars/mailcow/mailcow-dockerized?style=flat&logo=github&label=mailcow-dockerized&color=%235f53f4&cacheSeconds=3600)](https://github.com/mailcow/mailcow-dockerized) [![mailcow on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=mailcow)](https://awesome-privacy.xyz/networking/mail-servers/mailcow) -˙ + [![GitHub: mailcow/mailcow-dockerized](https://img.shields.io/github/stars/mailcow/mailcow-dockerized?style=flat&logo=github&label=mailcow-dockerized&color=%235f53f4&cacheSeconds=3600)](https://github.com/mailcow/mailcow-dockerized) [![mailcow on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=mailcow)](https://awesome-privacy.xyz/networking/mail-servers/mailcow)ㅤ
@@ -2894,96 +2745,75 @@ be time consuming to setup and maintain and securing it correctly is critical ### Digital Notes - **[icon Standard Notes](https://standardnotes.com)** - S.Notes is a free, open-source, and completely encrypted private notes app. It has a simple UI, -yet packs in a lot of features, thanks to the Extensions Store, allowing for: To-Do lists, Spreadsheets, -Rich Text, Markdown, Math Editor, Code Editor and many more. You can choose between a number of themes -(yay, dark mode!), and it features built-in secure file store, tags/ folders, fast search and more. -Standard Notes is actively developed, and fully open-source. -[…](https://awesome-privacy.xyz/productivity/digital-notes/standard-notes "View full Standard Notes report") +yet packs in a lot of features, thanks to the Extensions Store, allowing for: To-Do lists, Spreadsheets,[…](https://awesome-privacy.xyz/productivity/digital-notes/standard-notes "View full Standard Notes report") -
Stats - [![GitHub: standardnotes/app](https://img.shields.io/github/stars/standardnotes/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/standardnotes/app) [![Privacy Policy](https://shields.tosdr.org/en_2116.svg)](https://tosdr.org/en/service/2116) [![Standard Notes on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Standard_Notes)](https://awesome-privacy.xyz/productivity/digital-notes/standard-notes) -📦 Open Source 🛡️ Security Audited ˙ + [![GitHub: standardnotes/app](https://img.shields.io/github/stars/standardnotes/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/standardnotes/app) [![Privacy Policy](https://shields.tosdr.org/en_2116.svg)](https://tosdr.org/en/service/2116) [![Standard Notes on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Standard_Notes)](https://awesome-privacy.xyz/productivity/digital-notes/standard-notes) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/standardnotes/app) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Standard Notes on Google Play](https://img.shields.io/badge/-Standard_Notes-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.standardnotes) [![Standard Notes on App Store](https://img.shields.io/badge/-Standard_Notes-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/standard-notes/id1285392450) [![r/StandardNotes on Reddit](https://img.shields.io/badge/-StandardNotes-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/StandardNotes)ㅤ
- **[icon Turtle](https://turtlapp.com)** - A secure, collaborative notebook. Self-host it yourself, or use their hosted plan (free edition or $3/ month for premium). -[…](https://awesome-privacy.xyz/productivity/digital-notes/turtle "View full Turtle report") + -
Stats - [![GitHub: turtl/desktop](https://img.shields.io/github/stars/turtl/desktop?style=flat&logo=github&label=desktop&color=%235f53f4&cacheSeconds=3600)](https://github.com/turtl/desktop) [![Turtle on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Turtle)](https://awesome-privacy.xyz/productivity/digital-notes/turtle) -🛡️ Security Audited ˙ + [![GitHub: turtl/desktop](https://img.shields.io/github/stars/turtl/desktop?style=flat&logo=github&label=desktop&color=%235f53f4&cacheSeconds=3600)](https://github.com/turtl/desktop) [![Turtle on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Turtle)](https://awesome-privacy.xyz/productivity/digital-notes/turtle) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Turtle on Google Play](https://img.shields.io/badge/-Turtle-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=com.lyonbros.turtl)ㅤ
- **[icon Notable](https://notable.md)** - An offline markdown-based note editor for desktop, with a simple, yet feature-rich UI. All notes are saved individually as .md files, making them easy to manage. -No mobile app, built-in cloud-sync, encryption or web UI. But due to the structure of the files, -it is easy to use your own cloud sync provider, and additional features are provided through extensions. -[…](https://awesome-privacy.xyz/productivity/digital-notes/notable "View full Notable report") +No mobile app, built-in cloud-sync, en[…](https://awesome-privacy.xyz/productivity/digital-notes/notable "View full Notable report") -
Stats - [![GitHub: notable/notable](https://img.shields.io/github/stars/notable/notable?style=flat&logo=github&label=notable&color=%235f53f4&cacheSeconds=3600)](https://github.com/notable/notable) [![Notable on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Notable)](https://awesome-privacy.xyz/productivity/digital-notes/notable) -˙ + [![GitHub: notable/notable](https://img.shields.io/github/stars/notable/notable?style=flat&logo=github&label=notable&color=%235f53f4&cacheSeconds=3600)](https://github.com/notable/notable) [![Notable on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Notable)](https://awesome-privacy.xyz/productivity/digital-notes/notable) [![r/Notable on Reddit](https://img.shields.io/badge/-Notable-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Notable)ㅤ
- **[icon Joplin](https://joplinapp.org)** - Cross-platform desktop and mobile note-taking and todo app. Easy organisation into notebooks and sections, revision history and a simple UI. Allows for easy import and export of notes to or from -other services. Supports synchronisation with cloud services, implemented with E2EE. -[…](https://awesome-privacy.xyz/productivity/digital-notes/joplin "View full Joplin report") +other[…](https://awesome-privacy.xyz/productivity/digital-notes/joplin "View full Joplin report") -
Stats - [![GitHub: laurent22/joplin](https://img.shields.io/github/stars/laurent22/joplin?style=flat&logo=github&label=joplin&color=%235f53f4&cacheSeconds=3600)](https://github.com/laurent22/joplin) [![Privacy Policy](https://shields.tosdr.org/en_9477.svg)](https://tosdr.org/en/service/9477) [![Joplin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Joplin)](https://awesome-privacy.xyz/productivity/digital-notes/joplin) -🛡️ Security Audited ˙ + [![GitHub: laurent22/joplin](https://img.shields.io/github/stars/laurent22/joplin?style=flat&logo=github&label=joplin&color=%235f53f4&cacheSeconds=3600)](https://github.com/laurent22/joplin) [![Privacy Policy](https://shields.tosdr.org/en_9477.svg)](https://tosdr.org/en/service/9477) [![Joplin on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Joplin)](https://awesome-privacy.xyz/productivity/digital-notes/joplin) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Joplin on Google Play](https://img.shields.io/badge/-Joplin-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=net.cozic.joplin) [![Joplin on App Store](https://img.shields.io/badge/-Joplin-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/gb/app/joplin/id1315599797) [![r/JoplinApp on Reddit](https://img.shields.io/badge/-JoplinApp-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/JoplinApp)ㅤ
- **[icon Logseq](https://logseq.com/)** - Privacy-first, open-source knowledge base that works on top of local plain-text Markdown and Org-mode files. Supports lots of different note modes, including task management, -PDF annotation, flashcards, whiteboards strong markdown support and more. -Includes themes and extensions, backed by a strong community -[…](https://awesome-privacy.xyz/productivity/digital-notes/logseq "View full Logseq report") +PDF annotation, flashcard[…](https://awesome-privacy.xyz/productivity/digital-notes/logseq "View full Logseq report") -
Stats - [![GitHub: logseq/logseq](https://img.shields.io/github/stars/logseq/logseq?style=flat&logo=github&label=logseq&color=%235f53f4&cacheSeconds=3600)](https://github.com/logseq/logseq) [![Logseq on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Logseq)](https://awesome-privacy.xyz/productivity/digital-notes/logseq) -˙ + [![GitHub: logseq/logseq](https://img.shields.io/github/stars/logseq/logseq?style=flat&logo=github&label=logseq&color=%235f53f4&cacheSeconds=3600)](https://github.com/logseq/logseq) [![Logseq on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Logseq)](https://awesome-privacy.xyz/productivity/digital-notes/logseq) [![Logseq on App Store](https://img.shields.io/badge/-Logseq-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/logseq/id1601013908) [![r/Logseq on Reddit](https://img.shields.io/badge/-Logseq-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/Logseq)ㅤ
- **[icon Obsidian](https://obsidian.md/)** - A powerful knowledge base that works on top of local plain-text Markdown files. It has a strong community, and a lot of plugins and themes. Generally privacy-respecting, but no -encryption out of the box, and some of the code is obfuscated or not fully open source -[…](https://awesome-privacy.xyz/productivity/digital-notes/obsidian "View full Obsidian report") +encryption out of the b[…](https://awesome-privacy.xyz/productivity/digital-notes/obsidian "View full Obsidian report") -
Stats - [![GitHub: obsidianmd/obsidian-releases](https://img.shields.io/github/stars/obsidianmd/obsidian-releases?style=flat&logo=github&label=obsidian-releases&color=%235f53f4&cacheSeconds=3600)](https://github.com/obsidianmd/obsidian-releases) [![Privacy Policy](https://shields.tosdr.org/en_3870.svg)](https://tosdr.org/en/service/3870) [![Obsidian on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Obsidian)](https://awesome-privacy.xyz/productivity/digital-notes/obsidian) -🛡️ Security Audited ˙ + [![GitHub: obsidianmd/obsidian-releases](https://img.shields.io/github/stars/obsidianmd/obsidian-releases?style=flat&logo=github&label=obsidian-releases&color=%235f53f4&cacheSeconds=3600)](https://github.com/obsidianmd/obsidian-releases) [![Privacy Policy](https://shields.tosdr.org/en_3870.svg)](https://tosdr.org/en/service/3870) [![Obsidian on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Obsidian)](https://awesome-privacy.xyz/productivity/digital-notes/obsidian) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white) [![Obsidian on Google Play](https://img.shields.io/badge/-Obsidian-3bd47f?style=flat&logo=android&logoColor=white)](https://play.google.com/store/apps/details?id=md.obsidian) [![Obsidian on App Store](https://img.shields.io/badge/-Obsidian-0D96F6?style=flat&logo=appstore&logoColor=white)](https://apps.apple.com/us/app/obsidian-connected-notes/id1557175442) [![r/ObsidianMD on Reddit](https://img.shields.io/badge/-ObsidianMD-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/ObsidianMD)ㅤ
- **[icon AFFiNE](https://affine.pro)** - Privacy first, open-source alternative to Notion, monday.com and Miro. It is a knowledge management tool that allows you to create, organize and share your knowledge. -[…](https://awesome-privacy.xyz/productivity/digital-notes/affine "View full AFFiNE report") + -
Stats - [![GitHub: toeverything/AFFiNE](https://img.shields.io/github/stars/toeverything/AFFiNE?style=flat&logo=github&label=AFFiNE&color=%235f53f4&cacheSeconds=3600)](https://github.com/toeverything/AFFiNE) [![AFFiNE on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFFiNE)](https://awesome-privacy.xyz/productivity/digital-notes/affine) -˙ + [![GitHub: toeverything/AFFiNE](https://img.shields.io/github/stars/toeverything/AFFiNE?style=flat&logo=github&label=AFFiNE&color=%235f53f4&cacheSeconds=3600)](https://github.com/toeverything/AFFiNE) [![AFFiNE on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AFFiNE)](https://awesome-privacy.xyz/productivity/digital-notes/affine) [![r/AFFiNE on Reddit](https://img.shields.io/badge/-AFFiNE-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/r/AFFiNE)ㅤ
- **[icon Cryptee](https://crypt.ee/)** - Private & encrypted rich-text documents. Cryptee has encryption and anonymity at its core, it also has a beautiful and minimalistic UI. You can use Cryptee from the browser, or download -native apps. Comes with many additional features, such as support for photo albums and file storage. -The disadvantage is that only the frontend is open source. Pricing is free for starter plan, $3/ -month for 10GB, additional plans go up-to 2TB. -[…](https://awesome-privacy.xyz/productivity/digital-notes/cryptee "View full Cryptee report") +native apps. C[…](https://awesome-privacy.xyz/productivity/digital-notes/cryptee "View full Cryptee report") -
Stats - [![GitHub: cryptee/web-client](https://img.shields.io/github/stars/cryptee/web-client?style=flat&logo=github&label=web-client&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptee/web-client) [![Privacy Policy](https://shields.tosdr.org/en_5047.svg)](https://tosdr.org/en/service/5047) [![Cryptee on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptee)](https://awesome-privacy.xyz/productivity/digital-notes/cryptee) -˙ + [![GitHub: cryptee/web-client](https://img.shields.io/github/stars/cryptee/web-client?style=flat&logo=github&label=web-client&color=%235f53f4&cacheSeconds=3600)](https://github.com/cryptee/web-client) [![Privacy Policy](https://shields.tosdr.org/en_5047.svg)](https://tosdr.org/en/service/5047) [![Cryptee on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cryptee)](https://awesome-privacy.xyz/productivity/digital-notes/cryptee)ㅤ
@@ -2991,7 +2821,7 @@ month for 10GB, additional plans go up-to 2TB. ✳️ Notable Mentions > If you are already tied into Evernote, One Note etc, then [SafeRoom](https://www.getsaferoom.com) -> is a utility that encrypts your entire notebook, before it is uploaded to the cloud. +> is a utility that encrypts your entire notebook, before it is uploaded to the cloud. > > [Org Mode](https://orgmode.org) is a mode for [GNU Emacs](https://www.gnu.org/software/emacs/) > dedicated to working with the Org markup format. Org can be thought of as @@ -3022,37 +2852,39 @@ month for 10GB, additional plans go up-to 2TB. - **[icon SeaFile](https://www.seafile.com)** - An open source cloud storage and sync solution. Files are grouped into Libraries, which can be individually encrypted, shared of synced. Docker image available for easy deployment, and native -clients for Windows, Mac, Linux, Android and iOS. -[…](https://awesome-privacy.xyz/productivity/backup-and-sync/seafile "View full SeaFile report") +clients[…](https://awesome-privacy.xyz/productivity/backup-and-sync/seafile "View full SeaFile report") -
Stats - [![GitHub: haiwen/seafile](https://img.shields.io/github/stars/haiwen/seafile?style=flat&logo=github&label=seafile&color=%235f53f4&cacheSeconds=3600)](https://github.com/haiwen/seafile) [![Privacy Policy](https://shields.tosdr.org/en_4322.svg)](https://tosdr.org/en/service/4322) [![SeaFile on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SeaFile)](https://awesome-privacy.xyz/productivity/backup-and-sync/seafile) -˙ + [![GitHub: haiwen/seafile](https://img.shields.io/github/stars/haiwen/seafile?style=flat&logo=github&label=seafile&color=%235f53f4&cacheSeconds=3600)](https://github.com/haiwen/seafile) [![Privacy Policy](https://shields.tosdr.org/en_4322.svg)](https://tosdr.org/en/service/4322) [![SeaFile on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SeaFile)](https://awesome-privacy.xyz/productivity/backup-and-sync/seafile)ㅤ
- **[icon Syncthing](https://syncthing.net)** - Continuous file synchronization between 2 or more clients. It is simple, yet powerful, and fully-encrypted and private. Syncthing can be deployed with Docker, and there are native clients -for Windows, Mac, Linux, BSD and Android. -[…](https://awesome-privacy.xyz/productivity/backup-and-sync/syncthing "View full Syncthing report") +for Windows,[…](https://awesome-privacy.xyz/productivity/backup-and-sync/syncthing "View full Syncthing report") -
Stats - [![GitHub: syncthing/syncthing](https://img.shields.io/github/stars/syncthing/syncthing?style=flat&logo=github&label=syncthing&color=%235f53f4&cacheSeconds=3600)](https://github.com/syncthing/syncthing) [![Syncthing on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Syncthing)](https://awesome-privacy.xyz/productivity/backup-and-sync/syncthing) -˙ + [![GitHub: syncthing/syncthing](https://img.shields.io/github/stars/syncthing/syncthing?style=flat&logo=github&label=syncthing&color=%235f53f4&cacheSeconds=3600)](https://github.com/syncthing/syncthing) [![Syncthing on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Syncthing)](https://awesome-privacy.xyz/productivity/backup-and-sync/syncthing)ㅤ
- **[icon NextCloud](https://nextcloud.com)** - Feature-rich productivity platform, that can be used to backup and selectively sync encrypted files and folders between 1 or more clients. -A key benefit the wide range of plug-ins in the NextCloud App Store, -maintained by the community. NextCloud was a hard fork off OwnCloud. -[…](https://awesome-privacy.xyz/productivity/backup-and-sync/nextcloud "View full NextCloud report") +A key benefit the wide range of plug-ins in the NextCloud App[…](https://awesome-privacy.xyz/productivity/backup-and-sync/nextcloud "View full NextCloud report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_707.svg)](https://tosdr.org/en/service/707) [![NextCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextCloud)](https://awesome-privacy.xyz/productivity/backup-and-sync/nextcloud) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_707.svg)](https://tosdr.org/en/service/707) [![NextCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextCloud)](https://awesome-privacy.xyz/productivity/backup-and-sync/nextcloud)ㅤ + +
+- **[icon bewCloud](https://bewcloud.com)** - Modern and simpler alternative to Nextcloud/ownCloud crafted with TypeScript. +Unifies file management, sync, sharing, notes, RSS, expenses, calendars, +contacts, and photos, with MFA, WebDAV, CalDAV, C[…](https://awesome-privacy.xyz/productivity/backup-and-sync/bewcloud "View full bewCloud report") + -
+ Stats + + [![GitHub: bewcloud/bewcloud](https://img.shields.io/github/stars/bewcloud/bewcloud?style=flat&logo=github&label=bewcloud&color=%235f53f4&cacheSeconds=3600)](https://github.com/bewcloud/bewcloud) [![bewCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=bewCloud)](https://awesome-privacy.xyz/productivity/backup-and-sync/bewcloud) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/bewcloud/bewcloud)ㅤ
@@ -3091,67 +2923,48 @@ For hosted solutions - use a strong password, keep your credentials safe and ena - **[icon CryptPad](https://cryptpad.org/)** - A zero knowledge cloud productivity suite. Provides Rich Text, Presentations, Spreadsheets, Kanban, Paint a code editor and file drive. -All notes and user content, are encrypted by default, and can only be -accessed with specific URL. The main disadvantage, is a lack of Android, -iOS and desktop apps - CryptPad is entirely web-based. You can use their -web service, or you can host your own instance. Price for hosted: free -for 50mb or $5/ month for premium. -[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/cryptpad "View full CryptPad report") +All notes and user content, are encrypted by default, and can on[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/cryptpad "View full CryptPad report") -
Stats - [![GitHub: xwiki-labs/cryptpad](https://img.shields.io/github/stars/xwiki-labs/cryptpad?style=flat&logo=github&label=cryptpad&color=%235f53f4&cacheSeconds=3600)](https://github.com/xwiki-labs/cryptpad) [![Privacy Policy](https://shields.tosdr.org/en_2584.svg)](https://tosdr.org/en/service/2584) [![CryptPad on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CryptPad)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/cryptpad) -˙ + [![GitHub: xwiki-labs/cryptpad](https://img.shields.io/github/stars/xwiki-labs/cryptpad?style=flat&logo=github&label=cryptpad&color=%235f53f4&cacheSeconds=3600)](https://github.com/xwiki-labs/cryptpad) [![Privacy Policy](https://shields.tosdr.org/en_2584.svg)](https://tosdr.org/en/service/2584) [![CryptPad on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CryptPad)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/cryptpad)ㅤ
- **[icon NextCloud](https://nextcloud.com)** - A complete self-hosted productivity platform, with a strong community and growing app store. NextCloud is similar to (but arguably more complete -than) Google Drive, Office 365 and Dropbox. Clear UI and stable native -apps across all platforms, and also supports file sync. Supports encrypted -files, but you need to configure this yourself. Fully open source. -[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/nextcloud "View full NextCloud report") +than) Google Drive, Office 365 and Dropbox. Clear UI an[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/nextcloud "View full NextCloud report") -
Stats - [![GitHub: nextcloud/server](https://img.shields.io/github/stars/nextcloud/server?style=flat&logo=github&label=server&color=%235f53f4&cacheSeconds=3600)](https://github.com/nextcloud/server) [![Privacy Policy](https://shields.tosdr.org/en_707.svg)](https://tosdr.org/en/service/707) [![NextCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextCloud)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/nextcloud) -˙ + [![GitHub: nextcloud/server](https://img.shields.io/github/stars/nextcloud/server?style=flat&logo=github&label=server&color=%235f53f4&cacheSeconds=3600)](https://github.com/nextcloud/server) [![Privacy Policy](https://shields.tosdr.org/en_707.svg)](https://tosdr.org/en/service/707) [![NextCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NextCloud)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/nextcloud)ㅤ
- **[icon Disroot](https://disroot.org)** - A platform providing online services based on principles of freedom, privacy, federation and decentralization. It is an implementation of -NextCloud, with strong encryption configured - it is widely used by -journalists, activists and whistle-blowers. It is free to use, but -there have been reported reliability issues of the cloud services. -[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/disroot "View full Disroot report") +NextCloud, with strong encryption configured - it is widely us[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/disroot "View full Disroot report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1826.svg)](https://tosdr.org/en/service/1826) [![Disroot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Disroot)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/disroot) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1826.svg)](https://tosdr.org/en/service/1826) [![Disroot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Disroot)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/disroot)ㅤ
- **[icon Sandstorm](https://sandstorm.io)** - An open source platform for self-hosting web apps. Once you've set it up, you can install items from the Sandstorm App Market with -click, similar to NextCloud in terms of flexibility. -[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/sandstorm "View full Sandstorm report") + -
Stats - [![GitHub: sandstorm-io/sandstorm](https://img.shields.io/github/stars/sandstorm-io/sandstorm?style=flat&logo=github&label=sandstorm&color=%235f53f4&cacheSeconds=3600)](https://github.com/sandstorm-io/sandstorm) [![Sandstorm on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sandstorm)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/sandstorm) -˙ + [![GitHub: sandstorm-io/sandstorm](https://img.shields.io/github/stars/sandstorm-io/sandstorm?style=flat&logo=github&label=sandstorm&color=%235f53f4&cacheSeconds=3600)](https://github.com/sandstorm-io/sandstorm) [![Sandstorm on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sandstorm)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/sandstorm)ㅤ
- **[icon Vikunja](https://vikunja.io)** - Vikunja is an open-source to-do application. It is suitable for a wide variety of projects, supporting List, Gantt, Table and Kanban views to -visualize all tasks in different contexts. For collaboration, it has -sharing support via private teams or public links. It can be self-hosted -or used as a managed service for a small fee. -[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/vikunja "View full Vikunja report") +visualize all tasks in different contexts. For collaborati[…](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/vikunja "View full Vikunja report") -
Stats - [![GitHub: go-vikunja/vikunja](https://img.shields.io/github/stars/go-vikunja/vikunja?style=flat&logo=github&label=vikunja&color=%235f53f4&cacheSeconds=3600)](https://github.com/go-vikunja/vikunja) [![Vikunja on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Vikunja)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/vikunja) -˙ + [![GitHub: go-vikunja/vikunja](https://img.shields.io/github/stars/go-vikunja/vikunja?style=flat&logo=github&label=vikunja&color=%235f53f4&cacheSeconds=3600)](https://github.com/go-vikunja/vikunja) [![Vikunja on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Vikunja)](https://awesome-privacy.xyz/productivity/cloud-productivity-suites/vikunja)ㅤ
@@ -3170,61 +2983,62 @@ It is recommended to encrypt files on your client machine, before syncing to the [Cryptomator](https://cryptomator.org) is a cross-platform, open source encryption app, designed for just this. - **[icon Tresorit](https://tresorit.com)** - End-to-end encrypted zero knowledge file storage, syncing and sharing provider, based in Switzerland. -The app is cross-platform, user-friendly client and with all expected features. £6.49/month for 500 GB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/tresorit "View full Tresorit report") +The app is cross-platform, user-friendly client and with all expected features. £6.49/month for 50[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/tresorit "View full Tresorit report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1696.svg)](https://tosdr.org/en/service/1696) [![Tresorit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tresorit)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/tresorit) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1696.svg)](https://tosdr.org/en/service/1696) [![Tresorit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tresorit)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/tresorit)ㅤ
- **[icon IceDrive](https://icedrive.net)** - Very affordable encrypted storage provider, with cross-platform apps. Starts as £1.50/month for 150 GB or £3.33/month for 1 TB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/icedrive "View full IceDrive report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3118.svg)](https://tosdr.org/en/service/3118) [![IceDrive on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IceDrive)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/icedrive) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3118.svg)](https://tosdr.org/en/service/3118) [![IceDrive on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IceDrive)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/icedrive)ㅤ
- **[icon Sync.com](https://www.sync.com)** - Secure file sync, sharing, collaboration and backup for individuals, small businesses and sole practitioners. Starts at $8/month for 2 TB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/sync.com "View full Sync.com report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_698.svg)](https://tosdr.org/en/service/698) [![Sync.com on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sync.com)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/sync.com) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_698.svg)](https://tosdr.org/en/service/698) [![Sync.com on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sync.com)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/sync.com)ㅤ
- **[icon pCloud](https://www.pcloud.com)** - Secure and simple to use cloud storage, with cross-platform client apps. £3.99/month for 500 GB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/pcloud "View full pCloud report") -- **[icon Peergos](https://peergos.org/)** - A peer-to-peer end-to-end encrypted global filesystem with fine grained access control. Provides a secure -and private space online where you can store, share and view your photos, videos, music and documents. -Also includes a calendar, news feed, task lists, chat and email client. Fully open source and self-hostable -(or use hosted solution, from £5/month for 100 GB). -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/peergos "View full Peergos report") -- **[icon Internxt](https://internxt.com/)** - Store your files in total privacy. Internxt Drive is a zero-knowledge cloud storage service based on best-in-class -privacy and security. Made in Spain. Open-source mobile and desktop apps. 10GB FREE and Paid plans starting from -€0.99/month for 20GB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/internxt "View full Internxt report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_4176.svg)](https://tosdr.org/en/service/4176) [![Internxt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Internxt)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/internxt) -˙ + [![pCloud on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=pCloud)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/pcloud)ㅤ + +
+- **[icon Peergos](https://peergos.org/)** - A peer-to-peer end-to-end encrypted global filesystem with fine grained access control. Provides a secure +and private space online where you can store, share and view your photos, videos, music and do[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/peergos "View full Peergos report") + -
+ Stats + + [![Peergos on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Peergos)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/peergos)ㅤ + +
+- **[icon Internxt](https://internxt.com/)** - Store your files in total privacy. Internxt Drive is a zero-knowledge cloud storage service based on best-in-class +privacy and security. Made in Spain. Open-source mobile and desktop apps. 10GB FREE a[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/internxt "View full Internxt report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_4176.svg)](https://tosdr.org/en/service/4176) [![Internxt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Internxt)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/internxt)ㅤ
- **[icon FileN](https://filen.io/)** - Zero knowledge end-to-end encrypted affordable cloud storage made in Germany. Open-source mobile and desktop apps. 10GB FREE with paid plans starting at €0.92/month for 100GB. -[…](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/filen "View full FileN report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_6820.svg)](https://tosdr.org/en/service/6820) [![FileN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FileN)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/filen) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_6820.svg)](https://tosdr.org/en/service/6820) [![FileN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FileN)](https://awesome-privacy.xyz/productivity/encrypted-cloud-storage/filen)ㅤ
@@ -3246,19 +3060,19 @@ privacy and security. Made in Spain. Open-source mobile and desktop apps. 10GB F ### File Drop - **[icon FileSend](https://filesend.standardnotes.org)** - Simple, encrypted file sharing, with a 500mb limit and 5-day retention. Files are secured with client-side AES-256 -encryption and no IP address or device info is logged. Files are permanently deleted after download or after specified -duration. Developed by StandardNotes, and has built-in integration with the SN app. -[…](https://awesome-privacy.xyz/productivity/file-drop/filesend "View full FileSend report") -- **[icon OnionShare](https://onionshare.org/)** - An open source tool that lets you securely and anonymously share a file of any size, via Tor servers. OnionShare does -require installing, but the benefit is that your files are transferred directly to the recipient, without needing to be -hosted on an interim server. The host needs to remain connected for the duration of the transfer, but once it is complete, -the process will be terminated. -[…](https://awesome-privacy.xyz/productivity/file-drop/onionshare "View full OnionShare report") +encryption and no IP address or device info is logged. Files are permanently deleted[…](https://awesome-privacy.xyz/productivity/file-drop/filesend "View full FileSend report") -
Stats - [![GitHub: micahflee/onionshare](https://img.shields.io/github/stars/micahflee/onionshare?style=flat&logo=github&label=onionshare&color=%235f53f4&cacheSeconds=3600)](https://github.com/micahflee/onionshare) [![OnionShare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OnionShare)](https://awesome-privacy.xyz/productivity/file-drop/onionshare) -˙ + [![FileSend on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FileSend)](https://awesome-privacy.xyz/productivity/file-drop/filesend)ㅤ + +
+- **[icon OnionShare](https://onionshare.org/)** - An open source tool that lets you securely and anonymously share a file of any size, via Tor servers. OnionShare does +require installing, but the benefit is that your files are transferred directly to[…](https://awesome-privacy.xyz/productivity/file-drop/onionshare "View full OnionShare report") + -
+ Stats + + [![GitHub: micahflee/onionshare](https://img.shields.io/github/stars/micahflee/onionshare?style=flat&logo=github&label=onionshare&color=%235f53f4&cacheSeconds=3600)](https://github.com/micahflee/onionshare) [![OnionShare on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OnionShare)](https://awesome-privacy.xyz/productivity/file-drop/onionshare)ㅤ
@@ -3280,56 +3094,44 @@ the process will be terminated. ### Browser Sync - **[icon Floccus](https://floccus.org)** - Simple and efficient bookmark syncing using either NextCloud Bookmarks, a WebDAV server (local or remote) -or just a local folder through LoFloccus. Browser extensions available for Chrome, Firefox, and Edge. -[…](https://awesome-privacy.xyz/productivity/browser-sync/floccus "View full Floccus report") +or just a local folder through LoFloccus. Browser extensions available for Chrome, Firefox, an[…](https://awesome-privacy.xyz/productivity/browser-sync/floccus "View full Floccus report") -
Stats - [![GitHub: marcelklehr/floccus](https://img.shields.io/github/stars/marcelklehr/floccus?style=flat&logo=github&label=floccus&color=%235f53f4&cacheSeconds=3600)](https://github.com/marcelklehr/floccus) [![Floccus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Floccus)](https://awesome-privacy.xyz/productivity/browser-sync/floccus) -˙ + [![GitHub: marcelklehr/floccus](https://img.shields.io/github/stars/marcelklehr/floccus?style=flat&logo=github&label=floccus&color=%235f53f4&cacheSeconds=3600)](https://github.com/marcelklehr/floccus) [![Floccus on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Floccus)](https://awesome-privacy.xyz/productivity/browser-sync/floccus)ㅤ
- **[icon XBrowserSync](https://www.xbrowsersync.org)** - Secure, anonymous and free browser and bookmark syncing. Easy to setup, and no sign up is required, you can -either use a community-run sync server, or host your own with their docker image. Extensions are available for -Chrome, Firefox, and on Android. -[…](https://awesome-privacy.xyz/productivity/browser-sync/xbrowsersync "View full XBrowserSync report") +either use a community-run sync server, or host your own with their docker image. Extensions[…](https://awesome-privacy.xyz/productivity/browser-sync/xbrowsersync "View full XBrowserSync report") -
Stats - [![GitHub: xbrowsersync/app](https://img.shields.io/github/stars/xbrowsersync/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/xbrowsersync/app) [![XBrowserSync on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XBrowserSync)](https://awesome-privacy.xyz/productivity/browser-sync/xbrowsersync) -˙ + [![GitHub: xbrowsersync/app](https://img.shields.io/github/stars/xbrowsersync/app?style=flat&logo=github&label=app&color=%235f53f4&cacheSeconds=3600)](https://github.com/xbrowsersync/app) [![XBrowserSync on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=XBrowserSync)](https://awesome-privacy.xyz/productivity/browser-sync/xbrowsersync)ㅤ
- **[icon Unmark](https://unmark.it)** - A web application which acts as a todo app for bookmarks. You can either self-host it, or use their managed service which has a free and paid-for tier. -[…](https://awesome-privacy.xyz/productivity/browser-sync/unmark "View full Unmark report") + -
Stats - [![GitHub: cdevroe/unmark](https://img.shields.io/github/stars/cdevroe/unmark?style=flat&logo=github&label=unmark&color=%235f53f4&cacheSeconds=3600)](https://github.com/cdevroe/unmark) [![Privacy Policy](https://shields.tosdr.org/en_9301.svg)](https://tosdr.org/en/service/9301) [![Unmark on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Unmark)](https://awesome-privacy.xyz/productivity/browser-sync/unmark) -˙ + [![GitHub: cdevroe/unmark](https://img.shields.io/github/stars/cdevroe/unmark?style=flat&logo=github&label=unmark&color=%235f53f4&cacheSeconds=3600)](https://github.com/cdevroe/unmark) [![Privacy Policy](https://shields.tosdr.org/en_9301.svg)](https://tosdr.org/en/service/9301) [![Unmark on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Unmark)](https://awesome-privacy.xyz/productivity/browser-sync/unmark)ㅤ
- **[icon Reminiscence](https://github.com/kanishka-linux/reminiscence)** - A self-hosted bookmark and archive manager. Reminiscence is more geared towards archiving useful web pages -either for offline viewing or to preserve a copy. It is a web application, that can be installed with Docker -on either a local or remote server, although it has a comprehensive and well-documented REST API, there is -currently no browser extension. -[…](https://awesome-privacy.xyz/productivity/browser-sync/reminiscence "View full Reminiscence report") +either for offline viewing or to preserve a copy. It is a web application, that can be instal[…](https://awesome-privacy.xyz/productivity/browser-sync/reminiscence "View full Reminiscence report") -
Stats - [![GitHub: kanishka-linux/reminiscence](https://img.shields.io/github/stars/kanishka-linux/reminiscence?style=flat&logo=github&label=reminiscence&color=%235f53f4&cacheSeconds=3600)](https://github.com/kanishka-linux/reminiscence) [![Reminiscence on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Reminiscence)](https://awesome-privacy.xyz/productivity/browser-sync/reminiscence) -˙ + [![GitHub: kanishka-linux/reminiscence](https://img.shields.io/github/stars/kanishka-linux/reminiscence?style=flat&logo=github&label=reminiscence&color=%235f53f4&cacheSeconds=3600)](https://github.com/kanishka-linux/reminiscence) [![Reminiscence on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Reminiscence)](https://awesome-privacy.xyz/productivity/browser-sync/reminiscence)ㅤ
- **[icon Shiori](https://github.com/go-shiori/shiori)** - Simple bookmark manager written in Go, intended to be a clone of Pocket, it has both a simple and clean web -interface as well as a CLI. Shiori has easy import/ export, is portable and has webpage archiving features. -[…](https://awesome-privacy.xyz/productivity/browser-sync/shiori "View full Shiori report") +interface as well as a CLI. Shiori has easy import/ export, is portable and has webpage arch[…](https://awesome-privacy.xyz/productivity/browser-sync/shiori "View full Shiori report") -
Stats - [![GitHub: go-shiori/shiori](https://img.shields.io/github/stars/go-shiori/shiori?style=flat&logo=github&label=shiori&color=%235f53f4&cacheSeconds=3600)](https://github.com/go-shiori/shiori) [![Shiori on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Shiori)](https://awesome-privacy.xyz/productivity/browser-sync/shiori) -˙ + [![GitHub: go-shiori/shiori](https://img.shields.io/github/stars/go-shiori/shiori?style=flat&logo=github&label=shiori&color=%235f53f4&cacheSeconds=3600)](https://github.com/go-shiori/shiori) [![Shiori on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Shiori)](https://awesome-privacy.xyz/productivity/browser-sync/shiori)ㅤ
@@ -3368,26 +3170,19 @@ for each of us, depending on the ratio of performance + features to security + privacy required in your situation. - **[icon Jami](https://jami.net)** - A free and open source, distributed video, calling and screenshare platform with a focus on security. Jami is -completely peer-to-peer, and has full end-to-end encryption with perfect forward secrecy for all communications, -complying with the X.509 standard. Supported natively on Windows, macOS, iOS, GNU/Linux, Android and Android TV. -Video quality is quite good, but very dependent on network speeds, some of the apps are lacking in features. -[…](https://awesome-privacy.xyz/productivity/secure-conference-calls/jami "View full Jami report") +completely peer-to-peer, and has full end-to-end encryption with perfect forward secrecy f[…](https://awesome-privacy.xyz/productivity/secure-conference-calls/jami "View full Jami report") -
Stats - [![GitHub: savoirfairelinux/jami-project](https://img.shields.io/github/stars/savoirfairelinux/jami-project?style=flat&logo=github&label=jami-project&color=%235f53f4&cacheSeconds=3600)](https://github.com/savoirfairelinux/jami-project) [![Jami on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jami)](https://awesome-privacy.xyz/productivity/secure-conference-calls/jami) -˙ + [![GitHub: savoirfairelinux/jami-project](https://img.shields.io/github/stars/savoirfairelinux/jami-project?style=flat&logo=github&label=jami-project&color=%235f53f4&cacheSeconds=3600)](https://github.com/savoirfairelinux/jami-project) [![Jami on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jami)](https://awesome-privacy.xyz/productivity/secure-conference-calls/jami)ㅤ
- **[icon Jitsi](https://jitsi.org)** - Encrypted, free and open source video calling app, which does not require creating an account/ providing any personal -details. Available as a web app, and native app for Windows, MacOS, Linux, Android and iOS. You can use the public -Jitsi instance, self-host your own, or use a community hosted instance. -[…](https://awesome-privacy.xyz/productivity/secure-conference-calls/jitsi "View full Jitsi report") +details. Available as a web app, and native app for Windows, MacOS, Linux, Android[…](https://awesome-privacy.xyz/productivity/secure-conference-calls/jitsi "View full Jitsi report") -
Stats - [![GitHub: jitsi/jitsi-meet](https://img.shields.io/github/stars/jitsi/jitsi-meet?style=flat&logo=github&label=jitsi-meet&color=%235f53f4&cacheSeconds=3600)](https://github.com/jitsi/jitsi-meet) [![Privacy Policy](https://shields.tosdr.org/en_2201.svg)](https://tosdr.org/en/service/2201) [![Jitsi on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jitsi)](https://awesome-privacy.xyz/productivity/secure-conference-calls/jitsi) -˙ + [![GitHub: jitsi/jitsi-meet](https://img.shields.io/github/stars/jitsi/jitsi-meet?style=flat&logo=github&label=jitsi-meet&color=%235f53f4&cacheSeconds=3600)](https://github.com/jitsi/jitsi-meet) [![Privacy Policy](https://shields.tosdr.org/en_2201.svg)](https://tosdr.org/en/service/2201) [![Jitsi on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Jitsi)](https://awesome-privacy.xyz/productivity/secure-conference-calls/jitsi)ㅤ
@@ -3419,20 +3214,27 @@ current system. Useful for compartmentalisation and safely testing software, or handling potentially malicious files - **[icon VirtualBox](https://www.virtualbox.org)** - Open source, powerful, feature-rich virtualization product, supporting x86 and AMD64/Intel64 architectures. -Available for Windows, MacOS, Linux and BSD, and free for both personal and enterprise use. VirtualBox is -backed by a strong community, and has been under active development since 2007. -[…](https://awesome-privacy.xyz/utilities/virtual-machines/virtualbox "View full VirtualBox report") -- **[icon Xen Project](https://xenproject.org)** - Open source virtual machine monitor intended to serve as a type-1 hyperviser for multiple operating systems -using the same hardware - very useful for servers, as it allows for fully independent virtual Linux machines. -[…](https://awesome-privacy.xyz/utilities/virtual-machines/xen-project "View full Xen Project report") -- **[icon UTM](https://mac.getutm.app)** - Open source, feature rich, powerful type 2 hypervisor for Mac, can emulate x86-64 OSes on Apple Silicon Macs. -There's also an [iOS](https://getutm.app/) version (so you can run Windows on your iPhone!) -[…](https://awesome-privacy.xyz/utilities/virtual-machines/utm "View full UTM report") +Available for Windows, MacOS, Linux and BSD, and free for both personal and enterprise use.[…](https://awesome-privacy.xyz/utilities/virtual-machines/virtualbox "View full VirtualBox report") -
Stats - [![GitHub: utmapp/UTM](https://img.shields.io/github/stars/utmapp/UTM?style=flat&logo=github&label=UTM&color=%235f53f4&cacheSeconds=3600)](https://github.com/utmapp/UTM) [![Privacy Policy](https://shields.tosdr.org/en_8038.svg)](https://tosdr.org/en/service/8038) [![UTM on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=UTM)](https://awesome-privacy.xyz/utilities/virtual-machines/utm) -˙ + [![VirtualBox on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VirtualBox)](https://awesome-privacy.xyz/utilities/virtual-machines/virtualbox) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.virtualbox.org)ㅤ + +
+- **[icon Xen Project](https://xenproject.org)** - Open source virtual machine monitor intended to serve as a type-1 hyperviser for multiple operating systems +using the same hardware - very useful for servers, as it allows for fully independent virtua[…](https://awesome-privacy.xyz/utilities/virtual-machines/xen-project "View full Xen Project report") + -
+ Stats + + [![Xen Project on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Xen_Project)](https://awesome-privacy.xyz/utilities/virtual-machines/xen-project) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://xenproject.org)ㅤ + +
+- **[icon UTM](https://mac.getutm.app)** - Open source, feature rich, powerful type 2 hypervisor for Mac, can emulate x86-64 OSes on Apple Silicon Macs. +There's also an [iOS](https://getutm.app/) version (so you can run Windows on your iPhone!)[…](https://awesome-privacy.xyz/utilities/virtual-machines/utm "View full UTM report") + -
+ Stats + + [![GitHub: utmapp/UTM](https://img.shields.io/github/stars/utmapp/UTM?style=flat&logo=github&label=UTM&color=%235f53f4&cacheSeconds=3600)](https://github.com/utmapp/UTM) [![Privacy Policy](https://shields.tosdr.org/en_8038.svg)](https://tosdr.org/en/service/8038) [![UTM on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=UTM)](https://awesome-privacy.xyz/utilities/virtual-machines/utm)ㅤ
@@ -3465,59 +3267,82 @@ There's also an [iOS](https://getutm.app/) version (so you can run Windows on yo Tools for signing, verifying, encrypting and decrypting text and files using [GnuPG](https://www.gnupg.org) standard - **[icon SeaHorse](https://wiki.gnome.org/Apps/Seahorse)** - Application for managing encryption keys and passwords, integrated with the GNOME Keyring. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/seahorse "View full SeaHorse report") -- **[icon Kleopatra](https://apps.kde.org/kleopatra)** - Certificate manager and a universal crypto GUI. It supports managing X.509 and OpenPGP certificates in the GpgSM -keybox and retrieving certificates from LDAP servers. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/kleopatra "View full Kleopatra report") -- **[icon GPG4Win](https://www.gpg4win.org)** - Kleopatra ported to Windows. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/gpg4win "View full GPG4Win report") + -
Stats - [![GitHub: gpg/gpg4win](https://img.shields.io/github/stars/gpg/gpg4win?style=flat&logo=github&label=gpg4win&color=%235f53f4&cacheSeconds=3600)](https://github.com/gpg/gpg4win) [![Privacy Policy](https://shields.tosdr.org/en_8276.svg)](https://tosdr.org/en/service/8276) [![GPG4Win on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GPG4Win)](https://awesome-privacy.xyz/utilities/pgp-managers/gpg4win) -˙ + [![SeaHorse on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SeaHorse)](https://awesome-privacy.xyz/utilities/pgp-managers/seahorse) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://wiki.gnome.org/Apps/Seahorse)ㅤ + +
+- **[icon Kleopatra](https://apps.kde.org/kleopatra)** - Certificate manager and a universal crypto GUI. It supports managing X.509 and OpenPGP certificates in the GpgSM +keybox and retrieving certificates from LDAP servers. + + -
+ Stats + + [![Kleopatra on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kleopatra)](https://awesome-privacy.xyz/utilities/pgp-managers/kleopatra) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://apps.kde.org/kleopatra)ㅤ + +
+- **[icon GPG4Win](https://www.gpg4win.org)** - Kleopatra ported to Windows. + + -
+ Stats + + [![GitHub: gpg/gpg4win](https://img.shields.io/github/stars/gpg/gpg4win?style=flat&logo=github&label=gpg4win&color=%235f53f4&cacheSeconds=3600)](https://github.com/gpg/gpg4win) [![Privacy Policy](https://shields.tosdr.org/en_8276.svg)](https://tosdr.org/en/service/8276) [![GPG4Win on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GPG4Win)](https://awesome-privacy.xyz/utilities/pgp-managers/gpg4win)ㅤ
- **[icon GPG Suite](https://gpgtools.org)** - Successor of MacGPG. Plays nice with MacOS apps, including Finder, Appple Mail, Keychain and Spotlight. Makes encrypting files, emails, and messages / data very easy. -As well as GUI for generating keys, verifying signatures, etc. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/gpg-suite "View full GPG Suite report") -- **[icon OpenKeychain](https://www.openkeychain.org)** - Android app for managing keys, and encrypting messages. -Works both stand-alone, and as integrated into other apps, including k9-Mail. -Everything can be done through a simple yet powerful GUI. -Open source, security audited, transparent permissions, and activley maintained. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/openkeychain "View full OpenKeychain report") +As well as GUI for generating key[…](https://awesome-privacy.xyz/utilities/pgp-managers/gpg-suite "View full GPG Suite report") -
Stats - [![GitHub: open-keychain/open-keychain](https://img.shields.io/github/stars/open-keychain/open-keychain?style=flat&logo=github&label=open-keychain&color=%235f53f4&cacheSeconds=3600)](https://github.com/open-keychain/open-keychain) [![Privacy Policy](https://shields.tosdr.org/en_7378.svg)](https://tosdr.org/en/service/7378) [![OpenKeychain on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenKeychain)](https://awesome-privacy.xyz/utilities/pgp-managers/openkeychain) -🛡️ Security Audited ˙ + [![GPG Suite on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GPG_Suite)](https://awesome-privacy.xyz/utilities/pgp-managers/gpg-suite)ㅤ + +
+- **[icon OpenKeychain](https://www.openkeychain.org)** - Android app for managing keys, and encrypting messages. +Works both stand-alone, and as integrated into other apps, including k9-Mail. +Everything can be done through a simple yet powerful GUI. +Open sou[…](https://awesome-privacy.xyz/utilities/pgp-managers/openkeychain "View full OpenKeychain report") + -
+ Stats + + [![GitHub: open-keychain/open-keychain](https://img.shields.io/github/stars/open-keychain/open-keychain?style=flat&logo=github&label=open-keychain&color=%235f53f4&cacheSeconds=3600)](https://github.com/open-keychain/open-keychain) [![Privacy Policy](https://shields.tosdr.org/en_7378.svg)](https://tosdr.org/en/service/7378) [![OpenKeychain on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenKeychain)](https://awesome-privacy.xyz/utilities/pgp-managers/openkeychain) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white)ㅤ
- **[icon PGP Everywhere](https://www.pgpeverywhere.com)** - iOS app for encrypting/ decrypting text. Has native keyboard integration, keychain support and app integrations which makes it quick to use in any app. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/pgp-everywhere "View full PGP Everywhere report") -- **[icon FlowCrypt](https://flowcrypt.com)** - Browser extension for using PGP within Gmail, for Chrome and Firefox. -Mobile version supported on Android and iOS. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/flowcrypt "View full FlowCrypt report") + -
Stats - [![GitHub: FlowCrypt/flowcrypt-browser](https://img.shields.io/github/stars/FlowCrypt/flowcrypt-browser?style=flat&logo=github&label=flowcrypt-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/FlowCrypt/flowcrypt-browser) [![FlowCrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FlowCrypt)](https://awesome-privacy.xyz/utilities/pgp-managers/flowcrypt) -˙ + [![PGP Everywhere on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PGP_Everywhere)](https://awesome-privacy.xyz/utilities/pgp-managers/pgp-everywhere)ㅤ + +
+- **[icon FlowCrypt](https://flowcrypt.com)** - Browser extension for using PGP within Gmail, for Chrome and Firefox. +Mobile version supported on Android and iOS. + + -
+ Stats + + [![GitHub: FlowCrypt/flowcrypt-browser](https://img.shields.io/github/stars/FlowCrypt/flowcrypt-browser?style=flat&logo=github&label=flowcrypt-browser&color=%235f53f4&cacheSeconds=3600)](https://github.com/FlowCrypt/flowcrypt-browser) [![FlowCrypt on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FlowCrypt)](https://awesome-privacy.xyz/utilities/pgp-managers/flowcrypt)ㅤ
- **[icon EnigMail](https://enigmail.net)** - OpenPGP extension for Thunderbird and PostBox, integrates natively within mail app. -[…](https://awesome-privacy.xyz/utilities/pgp-managers/enigmail "View full EnigMail report") -- **[icon Mailvelope](https://www.mailvelope.com)** - Mailvelope is an addon for email applications, that makes using PGP very easy for beginners. You can use the hosted -version for free, or opt to host your own instance. -Works with Gmail, Yahoo, Outlook, GMX, Posteo, Web.de, FreeNet.de, Mailbox.org and [many others](https://mailvelope.com/en/faq#mailer_list). -[…](https://awesome-privacy.xyz/utilities/pgp-managers/mailvelope "View full Mailvelope report") + -
Stats - [![GitHub: mailvelope/mailvelope](https://img.shields.io/github/stars/mailvelope/mailvelope?style=flat&logo=github&label=mailvelope&color=%235f53f4&cacheSeconds=3600)](https://github.com/mailvelope/mailvelope) [![Privacy Policy](https://shields.tosdr.org/en_6210.svg)](https://tosdr.org/en/service/6210) [![Mailvelope on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mailvelope)](https://awesome-privacy.xyz/utilities/pgp-managers/mailvelope) -🛡️ Security Audited ˙ + [![EnigMail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=EnigMail)](https://awesome-privacy.xyz/utilities/pgp-managers/enigmail) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://enigmail.net)ㅤ + +
+- **[icon Mailvelope](https://www.mailvelope.com)** - Mailvelope is an addon for email applications, that makes using PGP very easy for beginners. You can use the hosted +version for free, or opt to host your own instance. +Works with Gmail, Yahoo, Outlook[…](https://awesome-privacy.xyz/utilities/pgp-managers/mailvelope "View full Mailvelope report") + -
+ Stats + + [![GitHub: mailvelope/mailvelope](https://img.shields.io/github/stars/mailvelope/mailvelope?style=flat&logo=github&label=mailvelope&color=%235f53f4&cacheSeconds=3600)](https://github.com/mailvelope/mailvelope) [![Privacy Policy](https://shields.tosdr.org/en_6210.svg)](https://tosdr.org/en/service/6210) [![Mailvelope on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mailvelope)](https://awesome-privacy.xyz/utilities/pgp-managers/mailvelope) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white)ㅤ
@@ -3540,33 +3365,27 @@ for their own use. This could obviously pose a security risk, and that is why it is recommended to strip out this data from a file before sharing. - **[icon ExifCleaner](https://exifcleaner.com)** - Cross-platform, open source, performant EXIF meta data removal tool. This GUI tool makes cleaning media files really -easy, and has great batch process support. Created by @szTheory, and uses ExifTool. -[…](https://awesome-privacy.xyz/utilities/metadata-removal/exifcleaner "View full ExifCleaner report") +easy, and has great batch process support. Created by @szTheory, and uses ExifTool.[…](https://awesome-privacy.xyz/utilities/metadata-removal/exifcleaner "View full ExifCleaner report") -
Stats - [![GitHub: szTheory/exifcleaner](https://img.shields.io/github/stars/szTheory/exifcleaner?style=flat&logo=github&label=exifcleaner&color=%235f53f4&cacheSeconds=3600)](https://github.com/szTheory/exifcleaner) [![ExifCleaner on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ExifCleaner)](https://awesome-privacy.xyz/utilities/metadata-removal/exifcleaner) -˙ + [![GitHub: szTheory/exifcleaner](https://img.shields.io/github/stars/szTheory/exifcleaner?style=flat&logo=github&label=exifcleaner&color=%235f53f4&cacheSeconds=3600)](https://github.com/szTheory/exifcleaner) [![ExifCleaner on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ExifCleaner)](https://awesome-privacy.xyz/utilities/metadata-removal/exifcleaner)ㅤ
- **[icon ExifTool](https://exiftool.org)** - Platform-independent open source Perl library & CLI app, for reading, writing and editing meta data. Built by Phill -Harvey. Very good performance, and supports all common metadata formats. An official GUI application is available -for Windows, implemented by Bogdan Hrastnik. -[…](https://awesome-privacy.xyz/utilities/metadata-removal/exiftool "View full ExifTool report") +Harvey. Very good performance, and supports all common metadata formats. An official[…](https://awesome-privacy.xyz/utilities/metadata-removal/exiftool "View full ExifTool report") -
Stats - [![GitHub: exiftool/exiftool](https://img.shields.io/github/stars/exiftool/exiftool?style=flat&logo=github&label=exiftool&color=%235f53f4&cacheSeconds=3600)](https://github.com/exiftool/exiftool) [![ExifTool on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ExifTool)](https://awesome-privacy.xyz/utilities/metadata-removal/exiftool) -˙ + [![GitHub: exiftool/exiftool](https://img.shields.io/github/stars/exiftool/exiftool?style=flat&logo=github&label=exiftool&color=%235f53f4&cacheSeconds=3600)](https://github.com/exiftool/exiftool) [![ExifTool on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ExifTool)](https://awesome-privacy.xyz/utilities/metadata-removal/exiftool)ㅤ
- **[icon ImageOptim](https://imageoptim.com/mac)** - Native MacOS app, with drag 'n drop image optimization and meta data removal. -[…](https://awesome-privacy.xyz/utilities/metadata-removal/imageoptim "View full ImageOptim report") + -
Stats - [![GitHub: ImageOptim/ImageOptim](https://img.shields.io/github/stars/ImageOptim/ImageOptim?style=flat&logo=github&label=ImageOptim&color=%235f53f4&cacheSeconds=3600)](https://github.com/ImageOptim/ImageOptim) [![ImageOptim on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ImageOptim)](https://awesome-privacy.xyz/utilities/metadata-removal/imageoptim) -˙ + [![GitHub: ImageOptim/ImageOptim](https://img.shields.io/github/stars/ImageOptim/ImageOptim?style=flat&logo=github&label=ImageOptim&color=%235f53f4&cacheSeconds=3600)](https://github.com/ImageOptim/ImageOptim) [![ImageOptim on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ImageOptim)](https://awesome-privacy.xyz/utilities/metadata-removal/imageoptim)ㅤ
@@ -3581,7 +3400,7 @@ for Windows, implemented by Bogdan Hrastnik. > > If you have [GIMP](https://www.gimp.org) installed, then just go to `File --> Export As --> Export --> Advanced Options --> Uncheck the "Save EXIF data" option`. > -> Often you need to perform meta data removal programmatically, as part of a script or automation process. +> Often you need to perform meta data removal programmatically, as part of a script or automation process. > - GoLang: [go-exif](https://github.com/dsoprea/go-exif) by @dsoprea > - JS: [exifr](https://github.com/MikeKovarik/exifr) by @MikeKovarik > - Python: [Piexif](https://github.com/hMatoba/Piexif) by @hMatoba @@ -3605,43 +3424,80 @@ the disk, before you destroy, sell or give away a hard drive. - **[icon Eraser](https://eraser.heidi.ie)** - Allows you to completely remove sensitive data from your hard drive by overwriting it several times with carefully selected patterns. -[…](https://awesome-privacy.xyz/utilities/data-erasers/eraser "View full Eraser report") + -
Stats - [![GitHub: gtrant/eraser](https://img.shields.io/github/stars/gtrant/eraser?style=flat&logo=github&label=eraser&color=%235f53f4&cacheSeconds=3600)](https://github.com/gtrant/eraser) [![Eraser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Eraser)](https://awesome-privacy.xyz/utilities/data-erasers/eraser) -˙ + [![GitHub: gtrant/eraser](https://img.shields.io/github/stars/gtrant/eraser?style=flat&logo=github&label=eraser&color=%235f53f4&cacheSeconds=3600)](https://github.com/gtrant/eraser) [![Eraser on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Eraser)](https://awesome-privacy.xyz/utilities/data-erasers/eraser)ㅤ
- **[icon Hard Disk Scrubber](http://www.summitcn.com/hdscrub.html)** - Easy to use, but with some advanced features, including custom wipe patterns. Data Sanitation Methods: AFSSI-5020, DoD 5220.22-M, and Random Data. -[…](https://awesome-privacy.xyz/utilities/data-erasers/hard-disk-scrubber "View full Hard Disk Scrubber report") -- **[icon SDelete](https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete)** - Microsoft Secure Delete is a CLI utility, uses DoD 5220.22-M. -[…](https://awesome-privacy.xyz/utilities/data-erasers/sdelete "View full SDelete report") -- **[icon OW Shredder](https://schiffer.tech/ow-shredder.html)** - File, folder and drive portable eraser for Windows. Bundled with other tools to scan, analyze, and wipe, and other -traces that were left behind. Includes context menu item, recycle bin integration. -[…](https://awesome-privacy.xyz/utilities/data-erasers/ow-shredder "View full OW Shredder report") -- **[icon DBAN](https://dban.org)** - Darik's Boot and Nuke ("DBAN") is a self-contained boot disk that securely wipes the hard disks of most computers. -DBAN will automatically and completely delete the contents of any hard disk that it can detect, which makes it an -appropriate utility for bulk or emergency data destruction. DBAN is the free edition of Blanco, which is an enterprise -tool designed for legal compliance. -[…](https://awesome-privacy.xyz/utilities/data-erasers/dban "View full DBAN report") -- **[icon nwipe](https://github.com/martijnvanbrummelen/nwipe)** - C-based secure light-weight disk eraser, operated through the easy-to-use CLI or a GUI interface. -[…](https://awesome-privacy.xyz/utilities/data-erasers/nwipe "View full nwipe report") + -
Stats - [![GitHub: martijnvanbrummelen/nwipe](https://img.shields.io/github/stars/martijnvanbrummelen/nwipe?style=flat&logo=github&label=nwipe&color=%235f53f4&cacheSeconds=3600)](https://github.com/martijnvanbrummelen/nwipe) [![nwipe on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=nwipe)](https://awesome-privacy.xyz/utilities/data-erasers/nwipe) -˙ + [![Hard Disk Scrubber on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Hard_Disk_Scrubber)](https://awesome-privacy.xyz/utilities/data-erasers/hard-disk-scrubber)ㅤ + +
+- **[icon SDelete](https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete)** - Microsoft Secure Delete is a CLI utility, uses DoD 5220.22-M. + + -
+ Stats + + [![SDelete on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SDelete)](https://awesome-privacy.xyz/utilities/data-erasers/sdelete)ㅤ + +
+- **[icon OW Shredder](https://schiffer.tech/ow-shredder.html)** - File, folder and drive portable eraser for Windows. Bundled with other tools to scan, analyze, and wipe, and other +traces that were left behind. Includes context menu item, recycle bin integration. + + -
+ Stats + + [![OW Shredder on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OW_Shredder)](https://awesome-privacy.xyz/utilities/data-erasers/ow-shredder)ㅤ + +
+- **[icon DBAN](https://dban.org)** - Darik's Boot and Nuke ("DBAN") is a self-contained boot disk that securely wipes the hard disks of most computers. +DBAN will automatically and completely delete the contents of any hard disk that it c[…](https://awesome-privacy.xyz/utilities/data-erasers/dban "View full DBAN report") + -
+ Stats + + [![DBAN on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DBAN)](https://awesome-privacy.xyz/utilities/data-erasers/dban)ㅤ + +
+- **[icon nwipe](https://github.com/martijnvanbrummelen/nwipe)** - C-based secure light-weight disk eraser, operated through the easy-to-use CLI or a GUI interface. + + -
+ Stats + + [![GitHub: martijnvanbrummelen/nwipe](https://img.shields.io/github/stars/martijnvanbrummelen/nwipe?style=flat&logo=github&label=nwipe&color=%235f53f4&cacheSeconds=3600)](https://github.com/martijnvanbrummelen/nwipe) [![nwipe on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=nwipe)](https://awesome-privacy.xyz/utilities/data-erasers/nwipe)ㅤ
- **[icon shred](https://www.gnu.org/software/coreutils/manual/html_node/shred-invocation.html)** - A CLI utility that can be used to securely delete files and devices, to make them extremely difficult to recover. -[…](https://awesome-privacy.xyz/utilities/data-erasers/shred "View full shred report") + + -
+ Stats + + [![shred on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=shred)](https://awesome-privacy.xyz/utilities/data-erasers/shred) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.gnu.org/software/coreutils/manual/html_node/shred-invocation.html)ㅤ + +
- **[icon Secure Remove](https://www.systutorials.com/docs/linux/man/1-srm/)** - CLI utility for securely removing files, directories and whole disks, works on Linux, BSD and MacOS. -[…](https://awesome-privacy.xyz/utilities/data-erasers/secure-remove "View full Secure Remove report") + + -
+ Stats + + [![Secure Remove on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Secure_Remove)](https://awesome-privacy.xyz/utilities/data-erasers/secure-remove) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://www.systutorials.com/docs/linux/man/1-srm/)ㅤ + +
- **[icon Mr. Phone](https://drfone.wondershare.com)** - Proprietary, closed-source suite of forensic data tools for mobile. The data eraser allows for both Android and iOS to be fully wiped, through connecting them to a PC. -[…](https://awesome-privacy.xyz/utilities/data-erasers/mr.-phone "View full Mr. Phone report") + + -
+ Stats + + [![Mr. Phone on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mr._Phone)](https://awesome-privacy.xyz/utilities/data-erasers/mr.-phone)ㅤ + +
✳️ Notable Mentions @@ -3684,46 +3540,36 @@ collecting a wealth of information, and logging your every move. A [custom ROM](https://en.wikipedia.org/wiki/List_of_custom_Android_distributions), is an open source, usually Google-free mobile OS that can be flashed to your device. -- **[icon GrapheneOS](https://grapheneos.org/)** - GrapheneOS is an open source privacy and security focused mobile OS with Android app compatibility. Developed by Daniel Micay. -GrapheneOS is a young project, and currently only supports Pixel devices, partially due to their strong hardware security. -[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/grapheneos "View full GrapheneOS report") +- **[icon GrapheneOS](https://grapheneos.org/)** - GrapheneOS is an open source privacy and security focused mobile OS with Android app compatibility. Developed by Daniel Micay. +GrapheneOS is a young project, and currently only supports Pixel devices,[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/grapheneos "View full GrapheneOS report") -
Stats - [![GitHub: GrapheneOS/hardened_malloc](https://img.shields.io/github/stars/GrapheneOS/hardened_malloc?style=flat&logo=github&label=hardened_malloc&color=%235f53f4&cacheSeconds=3600)](https://github.com/GrapheneOS/hardened_malloc) [![GrapheneOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GrapheneOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/grapheneos) -˙ + [![GitHub: GrapheneOS/hardened_malloc](https://img.shields.io/github/stars/GrapheneOS/hardened_malloc?style=flat&logo=github&label=hardened_malloc&color=%235f53f4&cacheSeconds=3600)](https://github.com/GrapheneOS/hardened_malloc) [![GrapheneOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GrapheneOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/grapheneos)ㅤ
-- **[icon CalyxOS](https://calyxos.org)** - CalyxOS is an free and open source Android mobile operating system that puts privacy and security into the hands of everyday users. -Plus, proactive security recommendations and automatic updates take the guesswork out of keeping your personal data personal. Also currently -only supports Pixel devices and Xiaomi Mi A2 with Fairphone 4, OnePlus 8T, OnePlus 9 test builds available. Developed by the Calyx Foundation. -[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/calyxos "View full CalyxOS report") +- **[icon CalyxOS](https://calyxos.org)** - CalyxOS is an free and open source Android mobile operating system that puts privacy and security into the hands of everyday users. +Plus, proactive security recommendations and automatic updates take[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/calyxos "View full CalyxOS report") -
Stats - [![GitHub: CalyxOS/calyxos](https://img.shields.io/github/stars/CalyxOS/calyxos?style=flat&logo=github&label=calyxos&color=%235f53f4&cacheSeconds=3600)](https://github.com/CalyxOS/calyxos) [![Privacy Policy](https://shields.tosdr.org/en_2558.svg)](https://tosdr.org/en/service/2558) [![CalyxOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CalyxOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/calyxos) -˙ + [![GitHub: CalyxOS/calyxos](https://img.shields.io/github/stars/CalyxOS/calyxos?style=flat&logo=github&label=calyxos&color=%235f53f4&cacheSeconds=3600)](https://github.com/CalyxOS/calyxos) [![Privacy Policy](https://shields.tosdr.org/en_2558.svg)](https://tosdr.org/en/service/2558) [![CalyxOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CalyxOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/calyxos)ㅤ
-- **[icon DivestOS](https://divestos.org)** - DivestOS is a vastly diverged unofficial more secure and private soft fork of LineageOS. DivestOS primary goal is prolonging the life-span of -discontinued devices, enhancing user privacy, and providing a modest increase of security where/when possible. Project is developed and maintained -solely by Tad (SkewedZeppelin) since 2014. -[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/divestos "View full DivestOS report") +- **[icon DivestOS](https://divestos.org)** - DivestOS is a vastly diverged unofficial more secure and private soft fork of LineageOS. DivestOS primary goal is prolonging the life-span of +discontinued devices, enhancing user privacy, and providin[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/divestos "View full DivestOS report") -
Stats - [![GitHub: Divested-Mobile/DivestOS-Build](https://img.shields.io/github/stars/Divested-Mobile/DivestOS-Build?style=flat&logo=github&label=DivestOS-Build&color=%235f53f4&cacheSeconds=3600)](https://github.com/Divested-Mobile/DivestOS-Build) [![Privacy Policy](https://shields.tosdr.org/en_2550.svg)](https://tosdr.org/en/service/2550) [![DivestOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DivestOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/divestos) -˙ + [![GitHub: Divested-Mobile/DivestOS-Build](https://img.shields.io/github/stars/Divested-Mobile/DivestOS-Build?style=flat&logo=github&label=DivestOS-Build&color=%235f53f4&cacheSeconds=3600)](https://github.com/Divested-Mobile/DivestOS-Build) [![Privacy Policy](https://shields.tosdr.org/en_2550.svg)](https://tosdr.org/en/service/2550) [![DivestOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DivestOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/divestos)ㅤ
-- **[icon LineageOS](https://www.lineageos.org)** - A free and open-source operating system for various devices, based on the Android mobile platform - Lineage is light-weight, well maintained, -supports a wide range of devices, and comes bundled with Privacy Guard. -[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/lineageos "View full LineageOS report") +- **[icon LineageOS](https://www.lineageos.org)** - A free and open-source operating system for various devices, based on the Android mobile platform - Lineage is light-weight, well maintained, +supports a wide range of devices, and comes bundled with P[…](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/lineageos "View full LineageOS report") -
Stats - [![GitHub: LineageOS/android](https://img.shields.io/github/stars/LineageOS/android?style=flat&logo=github&label=android&color=%235f53f4&cacheSeconds=3600)](https://github.com/LineageOS/android) [![Privacy Policy](https://shields.tosdr.org/en_7188.svg)](https://tosdr.org/en/service/7188) [![LineageOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LineageOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/lineageos) -˙ + [![GitHub: LineageOS/android](https://img.shields.io/github/stars/LineageOS/android?style=flat&logo=github&label=android&color=%235f53f4&cacheSeconds=3600)](https://github.com/LineageOS/android) [![Privacy Policy](https://shields.tosdr.org/en_7188.svg)](https://tosdr.org/en/service/7188) [![LineageOS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LineageOS)](https://awesome-privacy.xyz/operating-systems/mobile-operating-systems/lineageos)ㅤ
@@ -3776,48 +3622,53 @@ you don't need necessarily need to use a security distro, any well-maintained stable distro is going to be considerably better than a proprietary OS - **[icon Qubes OS](https://www.qubes-os.org/)** - Open-source security-oriented operating system for single-user desktop computing. It uses virtualisation, -to run each application in its own compartment to avoid data being leaked. It features Split GPG, U2F Proxy, -and Whonix integration. Qubes makes is easy to create disposable VMs which are spawned quickly and destroyed -when closed. Qubes is recommended by Edward Snowden. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/qubes-os "View full Qubes OS report") +to run each application in its own compartment to avoid data being leaked. It features Split G[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/qubes-os "View full Qubes OS report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2258.svg)](https://tosdr.org/en/service/2258) [![Qubes OS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Qubes_OS)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/qubes-os) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2258.svg)](https://tosdr.org/en/service/2258) [![Qubes OS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Qubes_OS)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/qubes-os)ㅤ
- **[icon Whonix](https://www.whonix.org/)** - Whonix is an anonymous operating system, which can run in a VM, inside your current OS. It is the best way to -use Tor, and provides very strong protection for your IP address. It comes bundled with other features too: -Keystroke Anonymization, Time Attack Defences, Stream Isolation, Kernel Self Protection Settings and an Advanced -Firewall. Open source, well audited, and with a strong community - Whonix is based on Debian, KickSecure and Tor. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/whonix "View full Whonix report") -- **[icon Tails](https://tails.boum.org/)** - Tails is a live operating system (so you boot into it from a USB, instead of installing). It preserves your -privacy and anonymity through having no persistent memory/ leaving no trace on the computer. Tails has Tor -built-in system-wide, and uses state-of-the-art cryptographic tools to encrypt your files, emails and instant -messaging. Open source, and built on top of Debian. Tails is simple to stop, configure and use. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/tails "View full Tails report") -- **[icon Parrot](https://www.parrotsec.org/)** - Parrot Linux, is a full Debian-based operating system, that is geared towards security, privacy and development. -It is fully-featured yet light-weight, very open. There are 3 editions: General Purpose, Security and Forensic. -The Secure distribution includes its own sandbox system obtained with the combination of Firejail and AppArmor -with custom security profiles. While the Forensics Edition is bundled with a comprehensive suite of security/ -pen-testing tools, similar to Kali and Black Arch. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/parrot "View full Parrot report") +use Tor, and provides very strong protection for your IP address. It comes bundled with ot[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/whonix "View full Whonix report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_8267.svg)](https://tosdr.org/en/service/8267) [![Parrot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Parrot)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/parrot) -˙ + [![Whonix on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Whonix)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/whonix)ㅤ + +
+- **[icon Tails](https://tails.boum.org/)** - Tails is a live operating system (so you boot into it from a USB, instead of installing). It preserves your +privacy and anonymity through having no persistent memory/ leaving no trace on the computer.[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/tails "View full Tails report") + -
+ Stats + + [![Tails on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tails)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/tails)ㅤ + +
+- **[icon Parrot](https://www.parrotsec.org/)** - Parrot Linux, is a full Debian-based operating system, that is geared towards security, privacy and development. +It is fully-featured yet light-weight, very open. There are 3 editions: General Purpose[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/parrot "View full Parrot report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_8267.svg)](https://tosdr.org/en/service/8267) [![Parrot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Parrot)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/parrot)ㅤ
- **[icon Discreete Linux](https://www.privacy-cd.org/)** - Aimed at journalists, activists and whistle-blowers, Discreete Linux is similar to Tails, in that it is booted -live from external media, and leaves no/ minimal trace on the system. The aim of the project, was to provide -all required cryptographic tools offline, to protect against Trojan-based surveillance. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/discreete-linux "View full Discreete Linux report") +live from external media, and leaves no/ minimal trace on the system. The aim of the proj[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/discreete-linux "View full Discreete Linux report") + -
+ Stats + + [![Discreete Linux on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Discreete_Linux)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/discreete-linux)ㅤ + +
- **[icon Alpine Linux](https://www.alpinelinux.org/)** - Alpine is a security-oriented, lightweight distro based on musl libc and busybox. It compiles all user-space -binaries as position-independent executables with stack-smashing protection. Install and setup may be quite -complex for some new users. -[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/alpine-linux "View full Alpine Linux report") +binaries as position-independent executables with stack-smashing protection. Install and se[…](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/alpine-linux "View full Alpine Linux report") + -
+ Stats + + [![Alpine Linux on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Alpine_Linux)](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/alpine-linux)ㅤ + +
✳️ Notable Mentions @@ -3903,7 +3754,7 @@ which are not available in a standard Windows 10 instance. It does require some technical knowledge to get started with, but once setup should perform just as any other Windows 10 system. Note that you should only download the LTSC ISO from the Microsoft's -[official page](https://www.microsoft.com/en-in/evalcenter/evaluate-windows-10-enterprise) +[official page](https://www.microsoft.com/en-in/evalcenter/evaluate-windows-10-enterprise) #### Improve the Security and Privacy of your current OS @@ -3921,40 +3772,55 @@ See: [Windows 10 security guide](https://heimdalsecurity.com/en/windows-10-secur ### Linux Defenses - **[icon Firejail](https://github.com/netblue30/firejail)** - Firejail is a SUID sandbox program that reduces the risk of security breaches by restricting the running environment -of untrusted applications using Linux namespaces and seccomp-bpf. Written in C, virtually no dependencies, runs on any -modern Linux system, with no daemon running in the background, no complicated configuration, and it's super lightweight -and super secure, since all actions are implemented by the kernel. It includes security profiles for over 800 common -Linux applications. FireJail is recommended for running any app that may potential pose some kind of risk, such as -torrenting through Transmission, browsing the web, opening downloaded attachments. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/firejail "View full Firejail report") +of untrusted applications using Linux namespaces and seccomp-bpf. Written in C, vir[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/firejail "View full Firejail report") -
Stats - [![GitHub: netblue30/firejail](https://img.shields.io/github/stars/netblue30/firejail?style=flat&logo=github&label=firejail&color=%235f53f4&cacheSeconds=3600)](https://github.com/netblue30/firejail) [![Firejail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firejail)](https://awesome-privacy.xyz/operating-systems/linux-defenses/firejail) -˙ + [![GitHub: netblue30/firejail](https://img.shields.io/github/stars/netblue30/firejail?style=flat&logo=github&label=firejail&color=%235f53f4&cacheSeconds=3600)](https://github.com/netblue30/firejail) [![Firejail on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firejail)](https://awesome-privacy.xyz/operating-systems/linux-defenses/firejail)ㅤ
- **[icon Gufw](https://man.archlinux.org/man/gufw.8.en)** - Open source GUI firewall for Linux, allowing you to block internet access for certain applications. Supports both simple -and advanced mode, GUI and CLI options, very easy to use, lightweight/ low-overhead, under active maintenance and backed -by a strong community. Installable through most package managers, or compile from source. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/gufw "View full Gufw report") -- **[icon ClamTk](https://gitlab.com/dave_m/clamtk/-/wikis/home)** - ClamTk is basically a graphical front-end for ClamAV, making it an easy to use, light-weight, on-demand virus scanner -for Linux systems. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/clamtk "View full ClamTk report") +and advanced mode, GUI and CLI options, very easy to use, lightweight/ low-over[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/gufw "View full Gufw report") -
Stats - [![GitHub: dave_m/clamtk](https://img.shields.io/github/stars/dave_m/clamtk?style=flat&logo=github&label=clamtk&color=%235f53f4&cacheSeconds=3600)](https://github.com/dave_m/clamtk) [![ClamTk on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ClamTk)](https://awesome-privacy.xyz/operating-systems/linux-defenses/clamtk) -˙ + [![Gufw on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gufw)](https://awesome-privacy.xyz/operating-systems/linux-defenses/gufw)ㅤ + +
+- **[icon ClamTk](https://gitlab.com/dave_m/clamtk/-/wikis/home)** - ClamTk is basically a graphical front-end for ClamAV, making it an easy to use, light-weight, on-demand virus scanner +for Linux systems. + + -
+ Stats + + [![GitHub: dave_m/clamtk](https://img.shields.io/github/stars/dave_m/clamtk?style=flat&logo=github&label=clamtk&color=%235f53f4&cacheSeconds=3600)](https://github.com/dave_m/clamtk) [![ClamTk on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ClamTk)](https://awesome-privacy.xyz/operating-systems/linux-defenses/clamtk)ㅤ
- **[icon chkrootkit](http://www.chkrootkit.org)** - Locally checks for signs of a rootkit. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/chkrootkit "View full chkrootkit report") + + -
+ Stats + + [![chkrootkit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=chkrootkit)](https://awesome-privacy.xyz/operating-systems/linux-defenses/chkrootkit)ㅤ + +
- **[icon Snort](https://www.snort.org)** - Open source intrusion prevention system capable of real-time traffic analysis and packet logging. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/snort "View full Snort report") + + -
+ Stats + + [![Snort on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Snort)](https://awesome-privacy.xyz/operating-systems/linux-defenses/snort)ㅤ + +
- **[icon BleachBit](https://www.bleachbit.org)** - Clears cache and deletes temporary files very effectively. This frees up disk space, improves performance, but most importantly helps to protect privacy. -[…](https://awesome-privacy.xyz/operating-systems/linux-defenses/bleachbit "View full BleachBit report") + + -
+ Stats + + [![BleachBit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BleachBit)](https://awesome-privacy.xyz/operating-systems/linux-defenses/bleachbit)ㅤ + +
✳️ Notable Mentions @@ -3971,128 +3837,198 @@ importantly helps to protect privacy. - **[icon Windows Spy Blocker](https://github.com/crazy-max/WindowsSpyBlocker)** - Capture and interprets network traffic based on a set of rules, and depending on the interactions certain assignments are blocked. Open source, written in Go and delivered as a single executable. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-spy-blocker "View full Windows Spy Blocker report") + -
Stats - [![GitHub: crazy-max/WindowsSpyBlocker](https://img.shields.io/github/stars/crazy-max/WindowsSpyBlocker?style=flat&logo=github&label=WindowsSpyBlocker&color=%235f53f4&cacheSeconds=3600)](https://github.com/crazy-max/WindowsSpyBlocker) [![Windows Spy Blocker on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Windows_Spy_Blocker)](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-spy-blocker) -˙ + [![GitHub: crazy-max/WindowsSpyBlocker](https://img.shields.io/github/stars/crazy-max/WindowsSpyBlocker?style=flat&logo=github&label=WindowsSpyBlocker&color=%235f53f4&cacheSeconds=3600)](https://github.com/crazy-max/WindowsSpyBlocker) [![Windows Spy Blocker on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Windows_Spy_Blocker)](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-spy-blocker)ㅤ
- **[icon HardenTools](https://github.com/securitywithoutborders/hardentools)** - A utility that disables a number of risky Windows features. These "features" are exposed by the OS and primary consumer applications, -and very commonly abused by attackers, to execute malicious code on a -victim's computer. So this tool just reduces the attack surface by -disabling the low-hanging fruit. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/hardentools "View full HardenTools report") +and very commonly abused by attackers, to execute malicious code o[…](https://awesome-privacy.xyz/operating-systems/windows-defences/hardentools "View full HardenTools report") -
Stats - [![GitHub: securitywithoutborders/hardentools](https://img.shields.io/github/stars/securitywithoutborders/hardentools?style=flat&logo=github&label=hardentools&color=%235f53f4&cacheSeconds=3600)](https://github.com/securitywithoutborders/hardentools) [![HardenTools on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HardenTools)](https://awesome-privacy.xyz/operating-systems/windows-defences/hardentools) -˙ + [![GitHub: securitywithoutborders/hardentools](https://img.shields.io/github/stars/securitywithoutborders/hardentools?style=flat&logo=github&label=hardentools&color=%235f53f4&cacheSeconds=3600)](https://github.com/securitywithoutborders/hardentools) [![HardenTools on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=HardenTools)](https://awesome-privacy.xyz/operating-systems/windows-defences/hardentools)ㅤ
- **[icon ShutUp10](https://www.oo-software.com/en/shutup10)** - A portable app that lets you disable core Windows features (such as Cortana, Edge) and control which data is passed to Microsoft. (Note: Free, but not open source). -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/shutup10 "View full ShutUp10 report") + + -
+ Stats + + [![ShutUp10 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ShutUp10)](https://awesome-privacy.xyz/operating-systems/windows-defences/shutup10)ㅤ + +
- **[icon WPD](https://wpd.app)** - Portable app with a GUI, that makes it really easy to safely block key telemetry features, from sending data to Microsoft and other third parties -(It uses the Windows API to interact with key features of Local Group -Police, Services, Tasks Scheduler, etc). -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/wpd "View full WPD report") +(It uses the Windows API to interact with key features[…](https://awesome-privacy.xyz/operating-systems/windows-defences/wpd "View full WPD report") + -
+ Stats + + [![WPD on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WPD)](https://awesome-privacy.xyz/operating-systems/windows-defences/wpd)ㅤ + +
- **[icon GhostPress](https://schiffer.tech/ghostpress.html)** - Anti low-level keylogger: Provides full system-wide key press protection, and target window screenshot protection. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/ghostpress "View full GhostPress report") + + -
+ Stats + + [![GhostPress on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GhostPress)](https://awesome-privacy.xyz/operating-systems/windows-defences/ghostpress)ㅤ + +
- **[icon KeyScrambler](https://www.qfxsoftware.com)** - Provides protection against software keyloggers. Encrypts keypresses at driver level, and decrypts at application level, to protect against common keyloggers. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/keyscrambler "View full KeyScrambler report") + + -
+ Stats + + [![KeyScrambler on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=KeyScrambler)](https://awesome-privacy.xyz/operating-systems/windows-defences/keyscrambler)ㅤ + +
- **[icon SafeKeys V3.0](http://www.aplin.com.au)** - Portable virtual keyboard. Useful for protecting from keyloggers when using a public computer, as it can run of a USB with no administrative permissions. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/safekeys-v3.0 "View full SafeKeys V3.0 report") + + -
+ Stats + + [![SafeKeys V3.0 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SafeKeys_V3.0)](https://awesome-privacy.xyz/operating-systems/windows-defences/safekeys-v3.0)ㅤ + +
- **[icon RKill](https://www.bleepingcomputer.com/download/rkill)** - Useful utility, that attempts to terminate known malware processes, so that your normal security software can then run and clean your computer of infections. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/rkill "View full RKill report") + + -
+ Stats + + [![RKill on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RKill)](https://awesome-privacy.xyz/operating-systems/windows-defences/rkill)ㅤ + +
- **[icon IIS Crypto](https://www.nartac.com/Products/IISCrypto)** - A utility for configuring encryption protocols, cyphers, hashing methods, and key exchanges for Windows components. Useful for sysadmins on Windows Server. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/iis-crypto "View full IIS Crypto report") -- **[icon NetLimiter](https://www.netlimiter.com)** - Internet traffic control and monitoring tool. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/netlimiter "View full NetLimiter report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_9043.svg)](https://tosdr.org/en/service/9043) [![NetLimiter on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetLimiter)](https://awesome-privacy.xyz/operating-systems/windows-defences/netlimiter) -˙ + [![IIS Crypto on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=IIS_Crypto)](https://awesome-privacy.xyz/operating-systems/windows-defences/iis-crypto)ㅤ + +
+- **[icon NetLimiter](https://www.netlimiter.com)** - Internet traffic control and monitoring tool. + + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_9043.svg)](https://tosdr.org/en/service/9043) [![NetLimiter on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=NetLimiter)](https://awesome-privacy.xyz/operating-systems/windows-defences/netlimiter)ㅤ
- **[icon Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer)** - Scans for accessibility tools backdoors via RDP. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/sticky-keys-slayer "View full Sticky-Keys-Slayer report") + -
Stats - [![GitHub: linuz/Sticky-Keys-Slayer](https://img.shields.io/github/stars/linuz/Sticky-Keys-Slayer?style=flat&logo=github&label=Sticky-Keys-Slayer&color=%235f53f4&cacheSeconds=3600)](https://github.com/linuz/Sticky-Keys-Slayer) [![Sticky-Keys-Slayer on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sticky-Keys-Slayer)](https://awesome-privacy.xyz/operating-systems/windows-defences/sticky-keys-slayer) -˙ + [![GitHub: linuz/Sticky-Keys-Slayer](https://img.shields.io/github/stars/linuz/Sticky-Keys-Slayer?style=flat&logo=github&label=Sticky-Keys-Slayer&color=%235f53f4&cacheSeconds=3600)](https://github.com/linuz/Sticky-Keys-Slayer) [![Sticky-Keys-Slayer on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sticky-Keys-Slayer)](https://awesome-privacy.xyz/operating-systems/windows-defences/sticky-keys-slayer)ㅤ
- **[icon SigCheck](https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck)** - A CLI utility that shows file version number, timestamp information, and digital signature details. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/sigcheck "View full SigCheck report") + + -
+ Stats + + [![SigCheck on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SigCheck)](https://awesome-privacy.xyz/operating-systems/windows-defences/sigcheck)ㅤ + +
- **[icon BleachBit](https://www.bleachbit.org)** - Clears cache and deletes temporary files very effectively. This frees up disk space, improves performance, but most importantly helps to protect privacy. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/bleachbit "View full BleachBit report") + + -
+ Stats + + [![BleachBit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BleachBit)](https://awesome-privacy.xyz/operating-systems/windows-defences/bleachbit)ㅤ + +
- **[icon Windows Secure Baseline](https://github.com/nsacyber/Windows-Secure-Host-Baseline)** - Group Policy objects, compliance checks, and configuration tools that provide an automated and flexible approach for securely deploying and maintaining the latest releases of Windows 10. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-secure-baseline "View full Windows Secure Baseline report") + -
Stats - [![GitHub: nsacyber/Windows-Secure-Host-Baseline](https://img.shields.io/github/stars/nsacyber/Windows-Secure-Host-Baseline?style=flat&logo=github&label=Windows-Secure-Host-Baseline&color=%235f53f4&cacheSeconds=3600)](https://github.com/nsacyber/Windows-Secure-Host-Baseline) [![Windows Secure Baseline on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Windows_Secure_Baseline)](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-secure-baseline) -˙ + [![GitHub: nsacyber/Windows-Secure-Host-Baseline](https://img.shields.io/github/stars/nsacyber/Windows-Secure-Host-Baseline?style=flat&logo=github&label=Windows-Secure-Host-Baseline&color=%235f53f4&cacheSeconds=3600)](https://github.com/nsacyber/Windows-Secure-Host-Baseline) [![Windows Secure Baseline on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Windows_Secure_Baseline)](https://awesome-privacy.xyz/operating-systems/windows-defences/windows-secure-baseline)ㅤ
- **[icon USBFix](https://www.usb-antivirus.com)** - Detects infected USB removable devices. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/usbfix "View full USBFix report") -- **[icon GMER](http://www.gmer.net)** - Rootkit detection and removal utility. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/gmer "View full GMER report") -- **[icon ScreenWings](https://schiffer.tech/screenwings.html)** - Blocks malicious background applications from taking screenshots. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/screenwings "View full ScreenWings report") -- **[icon CamWings](https://schiffer.tech/camwings.html)** - Blocks unauthorized webcam access. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/camwings "View full CamWings report") -- **[icon SpyDish](https://github.com/mirinsoft/spydish)** - Open source GUI app built upon PowerShell, allowing you to perform a quick and easy privacy check, on Windows 10 systems. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/spydish "View full SpyDish report") + -
Stats - [![GitHub: mirinsoft/spydish](https://img.shields.io/github/stars/mirinsoft/spydish?style=flat&logo=github&label=spydish&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirinsoft/spydish) [![SpyDish on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SpyDish)](https://awesome-privacy.xyz/operating-systems/windows-defences/spydish) -˙ + [![USBFix on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=USBFix)](https://awesome-privacy.xyz/operating-systems/windows-defences/usbfix)ㅤ
-- **[icon SharpApp](https://github.com/mirinsoft/sharpapp)** - Open source GUI app built upon PowerShell, for disabling telemetry functions in Windows 10, uninstalling preinstalled apps, installing software packages and automating Windows tasks with integrated PowerShell scripting. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/sharpapp "View full SharpApp report") +- **[icon GMER](http://www.gmer.net)** - Rootkit detection and removal utility. + -
Stats - [![GitHub: mirinsoft/sharpapp](https://img.shields.io/github/stars/mirinsoft/sharpapp?style=flat&logo=github&label=sharpapp&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirinsoft/sharpapp) [![SharpApp on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SharpApp)](https://awesome-privacy.xyz/operating-systems/windows-defences/sharpapp) -˙ + [![GMER on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GMER)](https://awesome-privacy.xyz/operating-systems/windows-defences/gmer)ㅤ + +
+- **[icon ScreenWings](https://schiffer.tech/screenwings.html)** - Blocks malicious background applications from taking screenshots. + + -
+ Stats + + [![ScreenWings on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ScreenWings)](https://awesome-privacy.xyz/operating-systems/windows-defences/screenwings)ㅤ + +
+- **[icon CamWings](https://schiffer.tech/camwings.html)** - Blocks unauthorized webcam access. + + -
+ Stats + + [![CamWings on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CamWings)](https://awesome-privacy.xyz/operating-systems/windows-defences/camwings)ㅤ + +
+- **[icon SpyDish](https://github.com/mirinsoft/spydish)** - Open source GUI app built upon PowerShell, allowing you to perform a quick and easy privacy check, on Windows 10 systems. + + -
+ Stats + + [![GitHub: mirinsoft/spydish](https://img.shields.io/github/stars/mirinsoft/spydish?style=flat&logo=github&label=spydish&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirinsoft/spydish) [![SpyDish on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SpyDish)](https://awesome-privacy.xyz/operating-systems/windows-defences/spydish)ㅤ + +
+- **[icon SharpApp](https://github.com/mirinsoft/sharpapp)** - Open source GUI app built upon PowerShell, for disabling telemetry functions in Windows 10, uninstalling preinstalled apps, installing software packages and automating Windows tasks with integrated Po[…](https://awesome-privacy.xyz/operating-systems/windows-defences/sharpapp "View full SharpApp report") + -
+ Stats + + [![GitHub: mirinsoft/sharpapp](https://img.shields.io/github/stars/mirinsoft/sharpapp?style=flat&logo=github&label=sharpapp&color=%235f53f4&cacheSeconds=3600)](https://github.com/mirinsoft/sharpapp) [![SharpApp on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SharpApp)](https://awesome-privacy.xyz/operating-systems/windows-defences/sharpapp)ㅤ
- **[icon Debotnet](https://github.com/Mirinsoft/Debotnet)** - Light-weight, portable app for controlling the many privacy-related settings within Windows 10- with the aim of helping to keep private data, private. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/debotnet "View full Debotnet report") + -
Stats - [![GitHub: Mirinsoft/Debotnet](https://img.shields.io/github/stars/Mirinsoft/Debotnet?style=flat&logo=github&label=Debotnet&color=%235f53f4&cacheSeconds=3600)](https://github.com/Mirinsoft/Debotnet) [![Debotnet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Debotnet)](https://awesome-privacy.xyz/operating-systems/windows-defences/debotnet) -˙ + [![GitHub: Mirinsoft/Debotnet](https://img.shields.io/github/stars/Mirinsoft/Debotnet?style=flat&logo=github&label=Debotnet&color=%235f53f4&cacheSeconds=3600)](https://github.com/Mirinsoft/Debotnet) [![Debotnet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Debotnet)](https://awesome-privacy.xyz/operating-systems/windows-defences/debotnet)ㅤ
- **[icon PrivaZer](https://privazer.com/)** - Good alternative to CCleaner, for deleting unnecessary data - logs, cache, history, etc. -[…](https://awesome-privacy.xyz/operating-systems/windows-defences/privazer "View full PrivaZer report") + + -
+ Stats + + [![PrivaZer on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PrivaZer)](https://awesome-privacy.xyz/operating-systems/windows-defences/privazer)ㅤ + +
⚠️ Word of Warning @@ -4106,7 +4042,7 @@ and check reviews/ forums. Create a system restore point, before making any significant changes to your OS (such as disabling core features). -From a security and privacy perspective, Linux may be a better option. +From a security and privacy perspective, Linux may be a better option.
@@ -4127,30 +4063,26 @@ From a security and privacy perspective, Linux may be a better option. ### Mac OS Defences - **[icon LuLu](https://objective-see.com/products/lulu.html)** - Free, open source macOS firewall. It aims to block unknown outgoing connections, unless explicitly approved by the user. -[…](https://awesome-privacy.xyz/operating-systems/mac-os-defences/lulu "View full LuLu report") + -
Stats - [![GitHub: objective-see/LuLu](https://img.shields.io/github/stars/objective-see/LuLu?style=flat&logo=github&label=LuLu&color=%235f53f4&cacheSeconds=3600)](https://github.com/objective-see/LuLu) [![Privacy Policy](https://shields.tosdr.org/en_3069.svg)](https://tosdr.org/en/service/3069) [![LuLu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LuLu)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/lulu) -˙ + [![GitHub: objective-see/LuLu](https://img.shields.io/github/stars/objective-see/LuLu?style=flat&logo=github&label=LuLu&color=%235f53f4&cacheSeconds=3600)](https://github.com/objective-see/LuLu) [![Privacy Policy](https://shields.tosdr.org/en_3069.svg)](https://tosdr.org/en/service/3069) [![LuLu on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LuLu)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/lulu)ㅤ
- **[icon Stronghold](https://github.com/alichtman/stronghold)** - Easily configure macOS security settings from the terminal. -[…](https://awesome-privacy.xyz/operating-systems/mac-os-defences/stronghold "View full Stronghold report") + -
Stats - [![GitHub: alichtman/stronghold](https://img.shields.io/github/stars/alichtman/stronghold?style=flat&logo=github&label=stronghold&color=%235f53f4&cacheSeconds=3600)](https://github.com/alichtman/stronghold) [![Stronghold on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stronghold)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/stronghold) -˙ + [![GitHub: alichtman/stronghold](https://img.shields.io/github/stars/alichtman/stronghold?style=flat&logo=github&label=stronghold&color=%235f53f4&cacheSeconds=3600)](https://github.com/alichtman/stronghold) [![Stronghold on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Stronghold)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/stronghold)ㅤ
-- **[icon Fortress](https://github.com/essandess/macOS-Fortress)** - Kernel-level, OS-level, and client-level security for macOS. With a Firewall, Blackhole, and Privatizing Proxy for Trackers, Attackers, Malware, Adware, and Spammers; with On-Demand and On-Access Anti-Virus Scanning. -[…](https://awesome-privacy.xyz/operating-systems/mac-os-defences/fortress "View full Fortress report") +- **[icon Fortress](https://github.com/essandess/macOS-Fortress)** - Kernel-level, OS-level, and client-level security for macOS. With a Firewall, Blackhole, and Privatizing Proxy for Trackers, Attackers, Malware, Adware, and Spammers; with On-Demand and On-Access Anti[…](https://awesome-privacy.xyz/operating-systems/mac-os-defences/fortress "View full Fortress report") -
Stats - [![GitHub: essandess/macOS-Fortress](https://img.shields.io/github/stars/essandess/macOS-Fortress?style=flat&logo=github&label=macOS-Fortress&color=%235f53f4&cacheSeconds=3600)](https://github.com/essandess/macOS-Fortress) [![Fortress on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Fortress)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/fortress) -˙ + [![GitHub: essandess/macOS-Fortress](https://img.shields.io/github/stars/essandess/macOS-Fortress?style=flat&logo=github&label=macOS-Fortress&color=%235f53f4&cacheSeconds=3600)](https://github.com/essandess/macOS-Fortress) [![Fortress on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Fortress)](https://awesome-privacy.xyz/operating-systems/mac-os-defences/fortress)ㅤ
@@ -4163,14 +4095,19 @@ From a security and privacy perspective, Linux may be a better option. Cross-platform, open source malware detection and virus prevention tools - **[icon ClamAV](https://www.clamav.net)** - An open source cross-platform antivirus engine for detecting viruses, malware & other malicious threats. It is versatile, performant and very effective. -[…](https://awesome-privacy.xyz/operating-systems/anti-malware/clamav "View full ClamAV report") -- **[icon VirusTotal](https://www.virustotal.com)** - Web-based malware scanner, that inspects files and URLs with over 70 antivirus scanners, URL/domain services, and other tools to extract signals and determine the legitimacy. -[…](https://awesome-privacy.xyz/operating-systems/anti-malware/virustotal "View full VirusTotal report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1886.svg)](https://tosdr.org/en/service/1886) [![VirusTotal on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VirusTotal)](https://awesome-privacy.xyz/operating-systems/anti-malware/virustotal) -˙ + [![ClamAV on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ClamAV)](https://awesome-privacy.xyz/operating-systems/anti-malware/clamav)ㅤ + +
+- **[icon VirusTotal](https://www.virustotal.com)** - Web-based malware scanner, that inspects files and URLs with over 70 antivirus scanners, URL/domain services, and other tools to extract signals and determine the legitimacy. + + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_1886.svg)](https://tosdr.org/en/service/1886) [![VirusTotal on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VirusTotal)](https://awesome-privacy.xyz/operating-systems/anti-malware/virustotal)ㅤ
@@ -4188,7 +4125,7 @@ decrease your privacy. Never use a free anti-virus, and never trust the companie that offer free solutions, even if you pay for the premium package. This includes (but not limited to) Avast, AVG, McAfee and Kasperky. For AV to be effective, it needs intermate access to all areas of your PC, -so it is important to go with a trusted vendor, and monitor its activity closely. +so it is important to go with a trusted vendor, and monitor its activity closely.
@@ -4209,36 +4146,45 @@ so it is important to go with a trusted vendor, and monitor its activity closely ### Code Hosting - **[icon SourceHut](https://sourcehut.org)** - Git and mercurial code hosting, task management, mailing lists, wiki hosting and Alpine-based build pipelines. Can be self-hosted, or used through the managed instance at sr.ht. -[…](https://awesome-privacy.xyz/development/code-hosting/sourcehut "View full SourceHut report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1607.svg)](https://tosdr.org/en/service/1607) [![SourceHut on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SourceHut)](https://awesome-privacy.xyz/development/code-hosting/sourcehut) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1607.svg)](https://tosdr.org/en/service/1607) [![SourceHut on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=SourceHut)](https://awesome-privacy.xyz/development/code-hosting/sourcehut)ㅤ
- **[icon Codeberg](https://codeberg.org)** - A fully-managed instance of Forgejo. -[…](https://awesome-privacy.xyz/development/code-hosting/codeberg "View full Codeberg report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3370.svg)](https://tosdr.org/en/service/3370) [![Codeberg on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Codeberg)](https://awesome-privacy.xyz/development/code-hosting/codeberg) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3370.svg)](https://tosdr.org/en/service/3370) [![Codeberg on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Codeberg)](https://awesome-privacy.xyz/development/code-hosting/codeberg)ㅤ
- **[icon GitLab](https://gitlab.com)** - Fully-featured git, CI and project management platform. Managed instance available, but can also be self-hosted. -[…](https://awesome-privacy.xyz/development/code-hosting/gitlab "View full GitLab report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_514.svg)](https://tosdr.org/en/service/514) [![GitLab on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GitLab)](https://awesome-privacy.xyz/development/code-hosting/gitlab) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_514.svg)](https://tosdr.org/en/service/514) [![GitLab on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GitLab)](https://awesome-privacy.xyz/development/code-hosting/gitlab)ㅤ
- **[icon Gitea](https://gitea.io/)** - Lightweight self-hosted git platform, written in Go. -[…](https://awesome-privacy.xyz/development/code-hosting/gitea "View full Gitea report") + + -
+ Stats + + [![Gitea on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gitea)](https://awesome-privacy.xyz/development/code-hosting/gitea)ㅤ + +
- **[icon Gogs](https://gogs.io/)** - Lightweight self-hosted git platform, written in Go. -[…](https://awesome-privacy.xyz/development/code-hosting/gogs "View full Gogs report") + + -
+ Stats + + [![Gogs on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gogs)](https://awesome-privacy.xyz/development/code-hosting/gogs)ㅤ + +

⬆️ [Back to Top]

@@ -4273,25 +4219,20 @@ human voice interface while also protecting your privacy and security - **[icon Mycroft](https://mycroft-ai.gitbook.io/mark-ii)** - An open source privacy-respecting AI platform, compatible with a wide range of devices including Raspberry Pi, desktop computers, or dedicated Mycroft hardware. -Actively developed, with extensive documentation and a broad skill set. Facilitates -easy development of new skills. -[…](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/mycroft "View full Mycroft report") +Actively developed, with extensive docu[…](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/mycroft "View full Mycroft report") -
Stats - [![GitHub: MycroftAI/mycroft-core](https://img.shields.io/github/stars/MycroftAI/mycroft-core?style=flat&logo=github&label=mycroft-core&color=%235f53f4&cacheSeconds=3600)](https://github.com/MycroftAI/mycroft-core) [![Privacy Policy](https://shields.tosdr.org/en_1824.svg)](https://tosdr.org/en/service/1824) [![Mycroft on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mycroft)](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/mycroft) -˙ + [![GitHub: MycroftAI/mycroft-core](https://img.shields.io/github/stars/MycroftAI/mycroft-core?style=flat&logo=github&label=mycroft-core&color=%235f53f4&cacheSeconds=3600)](https://github.com/MycroftAI/mycroft-core) [![Privacy Policy](https://shields.tosdr.org/en_1824.svg)](https://tosdr.org/en/service/1824) [![Mycroft on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mycroft)](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/mycroft)ㅤ
- **[icon Kalliope](https://kalliope-project.github.io)** - A modular, always-on, voice-controlled personal assistant geared towards home automation. Optimized for Raspberry Pi, Debian, or Ubuntu. Skills are easily programmable in YAML, -though the library of pre-built add-ons is not as extensive. -[…](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/kalliope "View full Kalliope report") +though the library of p[…](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/kalliope "View full Kalliope report") -
Stats - [![GitHub: kalliope-project/kalliope](https://img.shields.io/github/stars/kalliope-project/kalliope?style=flat&logo=github&label=kalliope&color=%235f53f4&cacheSeconds=3600)](https://github.com/kalliope-project/kalliope) [![Kalliope on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kalliope)](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/kalliope) -˙ + [![GitHub: kalliope-project/kalliope](https://img.shields.io/github/stars/kalliope-project/kalliope?style=flat&logo=github&label=kalliope&color=%235f53f4&cacheSeconds=3600)](https://github.com/kalliope-project/kalliope) [![Kalliope on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kalliope)](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/kalliope)ㅤ
@@ -4334,14 +4275,11 @@ you are happy with how it works, from a privacy perspective. - **[icon Gladys Assistant](https://gladysassistant.com/)** - An open source privacy-respecting Home Assistant, compatible with a wide range of devices including Raspberry Pi, desktop computers, or NAS systems. -Actively developed, with good french community and various integrations -(Zigbee, Philips, Camera, Tuya, MQTT, Telegram, ...). -[…](https://awesome-privacy.xyz/smart-home-and-iot/smart-home/gladys-assistant "View full Gladys Assistant report") +Actively developed, with good french community and[…](https://awesome-privacy.xyz/smart-home-and-iot/smart-home/gladys-assistant "View full Gladys Assistant report") -
Stats - [![GitHub: gladysassistant/gladys](https://img.shields.io/github/stars/gladysassistant/gladys?style=flat&logo=github&label=gladys&color=%235f53f4&cacheSeconds=3600)](https://github.com/gladysassistant/gladys) [![Gladys Assistant on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gladys_Assistant)](https://awesome-privacy.xyz/smart-home-and-iot/smart-home/gladys-assistant) -˙ + [![GitHub: gladysassistant/gladys](https://img.shields.io/github/stars/gladysassistant/gladys?style=flat&logo=github&label=gladys&color=%235f53f4&cacheSeconds=3600)](https://github.com/gladysassistant/gladys) [![Gladys Assistant on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gladys_Assistant)](https://awesome-privacy.xyz/smart-home-and-iot/smart-home/gladys-assistant)ㅤ
@@ -4355,27 +4293,20 @@ Actively developed, with good french community and various integrations - **[icon Monero](https://www.getmonero.org)** - One of the most private cryptocurrencies, since no meta data is available (not even the transaction amount). It uses complex on-chain cryptographic -methods such as Ring signatures, RingCT, Kovri, and Stealth addresses all -of which help protect the privacy of users. -[…](https://awesome-privacy.xyz/finance/cryptocurrencies/monero "View full Monero report") +methods such as Ring signatures, RingCT, Kovri, and[…](https://awesome-privacy.xyz/finance/cryptocurrencies/monero "View full Monero report") -
Stats - [![GitHub: monero-project/monero](https://img.shields.io/github/stars/monero-project/monero?style=flat&logo=github&label=monero&color=%235f53f4&cacheSeconds=3600)](https://github.com/monero-project/monero) [![Privacy Policy](https://shields.tosdr.org/en_8279.svg)](https://tosdr.org/en/service/8279) [![Monero on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Monero)](https://awesome-privacy.xyz/finance/cryptocurrencies/monero) -˙ + [![GitHub: monero-project/monero](https://img.shields.io/github/stars/monero-project/monero?style=flat&logo=github&label=monero&color=%235f53f4&cacheSeconds=3600)](https://github.com/monero-project/monero) [![Privacy Policy](https://shields.tosdr.org/en_8279.svg)](https://tosdr.org/en/service/8279) [![Monero on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Monero)](https://awesome-privacy.xyz/finance/cryptocurrencies/monero)ㅤ
- **[icon ZCash](https://z.cash)** - Uses zero-knowledge proofs to protect privacy cryptographic technique, that allows two users to transact without ever revealing their true identity -or address. The Zcash blockchain uses two types of addresses and transactions, -Z transactions and addresses are private and T transactions and addresses -are transparent like Bitcoin. -[…](https://awesome-privacy.xyz/finance/cryptocurrencies/zcash "View full ZCash report") +or address. The Zcash blockchain uses two types of a[…](https://awesome-privacy.xyz/finance/cryptocurrencies/zcash "View full ZCash report") -
Stats - [![GitHub: zcash/zcash](https://img.shields.io/github/stars/zcash/zcash?style=flat&logo=github&label=zcash&color=%235f53f4&cacheSeconds=3600)](https://github.com/zcash/zcash) [![Privacy Policy](https://shields.tosdr.org/en_8258.svg)](https://tosdr.org/en/service/8258) [![ZCash on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ZCash)](https://awesome-privacy.xyz/finance/cryptocurrencies/zcash) -˙ + [![GitHub: zcash/zcash](https://img.shields.io/github/stars/zcash/zcash?style=flat&logo=github&label=zcash&color=%235f53f4&cacheSeconds=3600)](https://github.com/zcash/zcash) [![Privacy Policy](https://shields.tosdr.org/en_8258.svg)](https://tosdr.org/en/service/8258) [![ZCash on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ZCash)](https://awesome-privacy.xyz/finance/cryptocurrencies/zcash)ㅤ
@@ -4407,7 +4338,7 @@ and be very weary crypto-related scams are very common. as is and cryptocurrency > Other privacy-focused cryptocurrencies include: > [PIVX](https://pivx.org), -> [Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/). +> [Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/). >
@@ -4428,69 +4359,62 @@ be physically tracked (CCTV, phone location, card payments etc) ### Crypto Wallets -- **[icon Wasabi Wallet](https://www.wasabiwallet.io)** - An open source, native desktop wallet for Windows, Linux, and MacOS. Wasabi implements trustless CoinJoins over the Tor network. Neither an observer nor the participants can determine which output belongs to which input. This makes it difficult for outside parties to trace where a particular coin originated from and where it was sent to, which greatly improves privacy. Since it's trustless, the CoinJoin coordinator cannot breach the privacy of the participants. Wasabi is compatible with cold storage and hardware wallets, including OpenCard and Trezor. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/wasabi-wallet "View full Wasabi Wallet report") +- **[icon Wasabi Wallet](https://www.wasabiwallet.io)** - An open source, native desktop wallet for Windows, Linux, and MacOS. Wasabi implements trustless CoinJoins over the Tor network. Neither an observer nor the participants can determine which output bel[…](https://awesome-privacy.xyz/finance/crypto-wallets/wasabi-wallet "View full Wasabi Wallet report") -
Stats - [![GitHub: zkSNACKs/WalletWasabi](https://img.shields.io/github/stars/zkSNACKs/WalletWasabi?style=flat&logo=github&label=WalletWasabi&color=%235f53f4&cacheSeconds=3600)](https://github.com/zkSNACKs/WalletWasabi) [![Wasabi Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Wasabi_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/wasabi-wallet) -˙ + [![GitHub: zkSNACKs/WalletWasabi](https://img.shields.io/github/stars/zkSNACKs/WalletWasabi?style=flat&logo=github&label=WalletWasabi&color=%235f53f4&cacheSeconds=3600)](https://github.com/zkSNACKs/WalletWasabi) [![Wasabi Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Wasabi_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/wasabi-wallet)ㅤ
-- **[icon Trezor](https://trezor.io)** - Open source, cross-platform, offline, crypto wallet, compatible with 1000+ coins. Your private key is generated on the device, and never leaves it, all transactions are signed by the Trezor, which ensures your wallet is safe from theft. There are native apps for Windows, Linux, MacOS, Android, and iOS, but Trezor is also compatible with other wallets, such as Wasabi. You can back the Trezor up, either by writing down the seed, or by duplicating it to another device. It is simple and intuitive to use, but also incredibly customizable with a large range of advanced features. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/trezor "View full Trezor report") +- **[icon Trezor](https://trezor.io)** - Open source, cross-platform, offline, crypto wallet, compatible with 1000+ coins. Your private key is generated on the device, and never leaves it, all transactions are signed by the Trezor, which ens[…](https://awesome-privacy.xyz/finance/crypto-wallets/trezor "View full Trezor report") -
Stats - [![GitHub: trezor/trezor-firmware](https://img.shields.io/github/stars/trezor/trezor-firmware?style=flat&logo=github&label=trezor-firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/trezor/trezor-firmware) [![Trezor on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Trezor)](https://awesome-privacy.xyz/finance/crypto-wallets/trezor) -˙ + [![GitHub: trezor/trezor-firmware](https://img.shields.io/github/stars/trezor/trezor-firmware?style=flat&logo=github&label=trezor-firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/trezor/trezor-firmware) [![Trezor on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Trezor)](https://awesome-privacy.xyz/finance/crypto-wallets/trezor)ㅤ
-- **[icon ColdCard](https://coldcardwallet.com/)** - An easy-to-use, super secure Bitcoin hardware wallet, which can be used independently as an air-gapped wallet. ColdCard is based on partially signed Bitcoin transactions following the BIP174 standard. Built specifically for Bitcoin, and with a variety of unique security features, ColdCard is secure, trustless, private, and easy-to-use. Companion products for the ColdCard include: BlockClock, SeedPlate, and ColdPower. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/coldcard "View full ColdCard report") +- **[icon ColdCard](https://coldcardwallet.com/)** - An easy-to-use, super secure Bitcoin hardware wallet, which can be used independently as an air-gapped wallet. ColdCard is based on partially signed Bitcoin transactions following the BIP174 standard.[…](https://awesome-privacy.xyz/finance/crypto-wallets/coldcard "View full ColdCard report") -
Stats - [![GitHub: Coldcard/firmware](https://img.shields.io/github/stars/Coldcard/firmware?style=flat&logo=github&label=firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/Coldcard/firmware) [![ColdCard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ColdCard)](https://awesome-privacy.xyz/finance/crypto-wallets/coldcard) -˙ + [![GitHub: Coldcard/firmware](https://img.shields.io/github/stars/Coldcard/firmware?style=flat&logo=github&label=firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/Coldcard/firmware) [![ColdCard on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=ColdCard)](https://awesome-privacy.xyz/finance/crypto-wallets/coldcard)ㅤ
-- **[icon Electrum](https://electrum.org/)** - Long-standing Python-based Bitcoin wallet with good security features. Private keys are encrypted and do not touch the internet and balance is checked with a watch-only wallet. Compatible with other wallets, so there is no tie-in, and funds can be recovered with your secret seed. It supports proof-checking to verify transactions using SPV, multi-sig, and add-ons for compatibility with hardware wallets. A decentralized server indexes ledger transactions, meaning it's fast and doesn't require much disk space. The potential security issue here would not be with the wallet, but rather your PC - you must ensure your computer is secure and your wallet has a long, strong passphrase to encrypt it with. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/electrum "View full Electrum report") +- **[icon Electrum](https://electrum.org/)** - Long-standing Python-based Bitcoin wallet with good security features. Private keys are encrypted and do not touch the internet and balance is checked with a watch-only wallet. Compatible with other w[…](https://awesome-privacy.xyz/finance/crypto-wallets/electrum "View full Electrum report") -
Stats - [![GitHub: spesmilo/electrum](https://img.shields.io/github/stars/spesmilo/electrum?style=flat&logo=github&label=electrum&color=%235f53f4&cacheSeconds=3600)](https://github.com/spesmilo/electrum) [![Privacy Policy](https://shields.tosdr.org/en_2761.svg)](https://tosdr.org/en/service/2761) [![Electrum on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Electrum)](https://awesome-privacy.xyz/finance/crypto-wallets/electrum) -˙ + [![GitHub: spesmilo/electrum](https://img.shields.io/github/stars/spesmilo/electrum?style=flat&logo=github&label=electrum&color=%235f53f4&cacheSeconds=3600)](https://github.com/spesmilo/electrum) [![Privacy Policy](https://shields.tosdr.org/en_2761.svg)](https://tosdr.org/en/service/2761) [![Electrum on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Electrum)](https://awesome-privacy.xyz/finance/crypto-wallets/electrum)ㅤ
-- **[icon Sparrow Wallet](https://sparrowwallet.com/)** - Sparrow is a Bitcoin wallet for those who value financial self-sovereignty. Sparrow’s emphasis is on security, privacy, and usability. Sparrow does not hide information from you - on the contrary, it attempts to provide as much detail as possible about your transactions and UTXOs, but in a way that is manageable and usable. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/sparrow-wallet "View full Sparrow Wallet report") +- **[icon Sparrow Wallet](https://sparrowwallet.com/)** - Sparrow is a Bitcoin wallet for those who value financial self-sovereignty. Sparrow’s emphasis is on security, privacy, and usability. Sparrow does not hide information from you - on the contrary, it[…](https://awesome-privacy.xyz/finance/crypto-wallets/sparrow-wallet "View full Sparrow Wallet report") -
Stats - [![GitHub: sparrowwallet/sparrow](https://img.shields.io/github/stars/sparrowwallet/sparrow?style=flat&logo=github&label=sparrow&color=%235f53f4&cacheSeconds=3600)](https://github.com/sparrowwallet/sparrow) [![Sparrow Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sparrow_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/sparrow-wallet) -˙ + [![GitHub: sparrowwallet/sparrow](https://img.shields.io/github/stars/sparrowwallet/sparrow?style=flat&logo=github&label=sparrow&color=%235f53f4&cacheSeconds=3600)](https://github.com/sparrowwallet/sparrow) [![Sparrow Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Sparrow_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/sparrow-wallet)ㅤ
-- **[icon Atomic Wallet](https://atomicwallet.io/)** - Atomic is an open-source desktop and mobile-based wallet, where your private keys are stored on your local device, and do not touch the internet. Atomic has a great feature set, and supports swapping, staking, and lending directly from the app. However, most of Atomic's features require an active internet connection, and Atomic does not support hardware wallets yet. Therefore, it may only be a good choice as a secondary wallet, for storing small amounts of your actively used currency. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/atomic-wallet "View full Atomic Wallet report") +- **[icon Atomic Wallet](https://atomicwallet.io/)** - Atomic is an open-source desktop and mobile-based wallet, where your private keys are stored on your local device, and do not touch the internet. Atomic has a great feature set, and supports swapping,[…](https://awesome-privacy.xyz/finance/crypto-wallets/atomic-wallet "View full Atomic Wallet report") -
Stats - [![GitHub: Atomicwallet/bip38](https://img.shields.io/github/stars/Atomicwallet/bip38?style=flat&logo=github&label=bip38&color=%235f53f4&cacheSeconds=3600)](https://github.com/Atomicwallet/bip38) [![Atomic Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Atomic_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/atomic-wallet) -˙ + [![GitHub: Atomicwallet/bip38](https://img.shields.io/github/stars/Atomicwallet/bip38?style=flat&logo=github&label=bip38&color=%235f53f4&cacheSeconds=3600)](https://github.com/Atomicwallet/bip38) [![Atomic Wallet on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Atomic_Wallet)](https://awesome-privacy.xyz/finance/crypto-wallets/atomic-wallet)ㅤ
- **[icon CryptoSteel](https://cryptosteel.com/how-it-works)** - A steel plate, with engraved letters which can be permanently screwed - CryptoSteel is a good fire-proof, shock-proof, water-proof, and stainless cryptocurrency backup solution. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/cryptosteel "View full CryptoSteel report") -- **[icon BitBox02](https://shiftcrypto.ch/)** - Open source hardware wallet, supporting secure multisig with the option for making encrypted backups on a MicroSD card. -[…](https://awesome-privacy.xyz/finance/crypto-wallets/bitbox02 "View full BitBox02 report") + -
Stats - [![GitHub: digitalbitbox/bitbox-wallet-app](https://img.shields.io/github/stars/digitalbitbox/bitbox-wallet-app?style=flat&logo=github&label=bitbox-wallet-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/digitalbitbox/bitbox-wallet-app) [![BitBox02 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BitBox02)](https://awesome-privacy.xyz/finance/crypto-wallets/bitbox02) -˙ + [![CryptoSteel on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=CryptoSteel)](https://awesome-privacy.xyz/finance/crypto-wallets/cryptosteel)ㅤ + +
+- **[icon BitBox02](https://shiftcrypto.ch/)** - Open source hardware wallet, supporting secure multisig with the option for making encrypted backups on a MicroSD card. + + -
+ Stats + + [![GitHub: digitalbitbox/bitbox-wallet-app](https://img.shields.io/github/stars/digitalbitbox/bitbox-wallet-app?style=flat&logo=github&label=bitbox-wallet-app&color=%235f53f4&cacheSeconds=3600)](https://github.com/digitalbitbox/bitbox-wallet-app) [![BitBox02 on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BitBox02)](https://awesome-privacy.xyz/finance/crypto-wallets/bitbox02)ㅤ
@@ -4525,41 +4449,38 @@ properly - to keep it safe from theft, loss or damage. - **[icon Bisq](https://bisq.network)** - An open-source, peer-to-peer application that allows you to buy and sell cryptocurrencies in exchange for national currencies. Fully decentralized, and no registration required. -[…](https://awesome-privacy.xyz/finance/crypto-exchanges/bisq "View full Bisq report") -- **[icon LocalBitcoins](https://localbitcoins.com/)** - Person-to-person exchange, find people local to your area, and trade -directly with them, to avoid going through any central organization. -Primarily focused on Bitcoin, Ethereum, Ripple, and LiteCoin, -as it gets harder to find people near you selling niche alt-coins. -[…](https://awesome-privacy.xyz/finance/crypto-exchanges/localbitcoins "View full LocalBitcoins report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3645.svg)](https://tosdr.org/en/service/3645) [![LocalBitcoins on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LocalBitcoins)](https://awesome-privacy.xyz/finance/crypto-exchanges/localbitcoins) -˙ + [![Bisq on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bisq)](https://awesome-privacy.xyz/finance/crypto-exchanges/bisq)ㅤ + +
+- **[icon LocalBitcoins](https://localbitcoins.com/)** - Person-to-person exchange, find people local to your area, and trade +directly with them, to avoid going through any central organization. +Primarily focused on Bitcoin, Ethereum, Ripple, and LiteCoin,[…](https://awesome-privacy.xyz/finance/crypto-exchanges/localbitcoins "View full LocalBitcoins report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_3645.svg)](https://tosdr.org/en/service/3645) [![LocalBitcoins on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=LocalBitcoins)](https://awesome-privacy.xyz/finance/crypto-exchanges/localbitcoins)ㅤ
- **[icon AtomicDEX](https://atomicdex.io/)** - Person-to-person cryptocurrency exchange with no KYC or registration required and uses atomic swaps to perform trustless trades. -The orderbook uses a modified libp2p protocol to prevent censorship and maintain decentralization. -Fiat currencies are not supported, but hundreds of alt-coins and major cryptocurrencies are supported. -[…](https://awesome-privacy.xyz/finance/crypto-exchanges/atomicdex "View full AtomicDEX report") +The orderbook uses a modified libp2p protocol to prevent censorship and[…](https://awesome-privacy.xyz/finance/crypto-exchanges/atomicdex "View full AtomicDEX report") -
Stats - [![GitHub: KomodoPlatform/atomicDEX-Pro](https://img.shields.io/github/stars/KomodoPlatform/atomicDEX-Pro?style=flat&logo=github&label=atomicDEX-Pro&color=%235f53f4&cacheSeconds=3600)](https://github.com/KomodoPlatform/atomicDEX-Pro) [![AtomicDEX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AtomicDEX)](https://awesome-privacy.xyz/finance/crypto-exchanges/atomicdex) -˙ + [![GitHub: KomodoPlatform/atomicDEX-Pro](https://img.shields.io/github/stars/KomodoPlatform/atomicDEX-Pro?style=flat&logo=github&label=atomicDEX-Pro&color=%235f53f4&cacheSeconds=3600)](https://github.com/KomodoPlatform/atomicDEX-Pro) [![AtomicDEX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=AtomicDEX)](https://awesome-privacy.xyz/finance/crypto-exchanges/atomicdex)ㅤ
- **[icon RoboSats](https://learn.robosats.com)** - RoboSats is an easy way to privately exchange Bitcoin for national currencies. It simplifies the peer-to-peer experience and makes use of lightning hold -invoices to minimize custody and trust requirements. -The deterministically generated avatars help users stick to best privacy practices. -[…](https://awesome-privacy.xyz/finance/crypto-exchanges/robosats "View full RoboSats report") +invoices to minimize custody and trust requirem[…](https://awesome-privacy.xyz/finance/crypto-exchanges/robosats "View full RoboSats report") -
Stats - [![GitHub: RoboSats/robosats](https://img.shields.io/github/stars/RoboSats/robosats?style=flat&logo=github&label=robosats&color=%235f53f4&cacheSeconds=3600)](https://github.com/RoboSats/robosats) [![RoboSats on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RoboSats)](https://awesome-privacy.xyz/finance/crypto-exchanges/robosats) -˙ + [![GitHub: RoboSats/robosats](https://img.shields.io/github/stars/RoboSats/robosats?style=flat&logo=github&label=robosats&color=%235f53f4&cacheSeconds=3600)](https://github.com/RoboSats/robosats) [![RoboSats on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RoboSats)](https://awesome-privacy.xyz/finance/crypto-exchanges/robosats)ㅤ
@@ -4593,37 +4514,30 @@ Not all services are available in all countries. - **[icon Privacy.com](https://privacy.com)** - Privacy.com has a good reputation, and is the largest virtual card provider in the US. Unlike other providers, it is free for personal use (up to 12 cards -per month) with no fees, apps and support is good. There is a premium plan -for $10/month, with 1% cashback and 36 cards/month. -[…](https://awesome-privacy.xyz/finance/virtual-credit-cards/privacy.com "View full Privacy.com report") +per month) with no fees, apps and support is[…](https://awesome-privacy.xyz/finance/virtual-credit-cards/privacy.com "View full Privacy.com report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3262.svg)](https://tosdr.org/en/service/3262) [![Privacy.com on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy.com)](https://awesome-privacy.xyz/finance/virtual-credit-cards/privacy.com) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3262.svg)](https://tosdr.org/en/service/3262) [![Privacy.com on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Privacy.com)](https://awesome-privacy.xyz/finance/virtual-credit-cards/privacy.com)ㅤ
- **[icon Revolut Premium](https://www.revolut.com/)** - Revolut is more of a digital bank account, and identity checks are required to sign up. Virtual cards are only available on Premium/ Metal accounts, which start at $7/month. -[…](https://awesome-privacy.xyz/finance/virtual-credit-cards/revolut-premium "View full Revolut Premium report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2310.svg)](https://tosdr.org/en/service/2310) [![Revolut Premium on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Revolut_Premium)](https://awesome-privacy.xyz/finance/virtual-credit-cards/revolut-premium) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2310.svg)](https://tosdr.org/en/service/2310) [![Revolut Premium on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Revolut_Premium)](https://awesome-privacy.xyz/finance/virtual-credit-cards/revolut-premium)ㅤ
- **[icon MySudo](https://mysudo.com)** - Much more than just virtual cards, MySudo is a platform for creating compartmentalised identities, each with their own virtual cards, virtual phone -numbers, virtual email addresses, messaging, private browsing, and more. There -is a free plan for up to 3 identities, and premium plans start at $0.99/month. -[…](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo "View full MySudo report") +numbers, virtual email addresses, messaging, private[…](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo "View full MySudo report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1351.svg)](https://tosdr.org/en/service/1351) [![MySudo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MySudo)](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1351.svg)](https://tosdr.org/en/service/1351) [![MySudo on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=MySudo)](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo)ㅤ
@@ -4635,13 +4549,31 @@ is a free plan for up to 3 identities, and premium plans start at $0.99/month. - **[icon Cash]()** - Actual physical cash is still the most private option, with no chance of leaving any transactional records. -[…](https://awesome-privacy.xyz/finance/other-payment-methods/cash "View full Cash report") + + -
+ Stats + + [![Cash on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cash)](https://awesome-privacy.xyz/finance/other-payment-methods/cash)ㅤ + +
- **[icon Gift Cards]()** - Gift cards can be purchased for cash in many convenience stores, and redeemed online for goods or services. Try to avoid CCTV as best as possible. -[…](https://awesome-privacy.xyz/finance/other-payment-methods/gift-cards "View full Gift Cards report") + + -
+ Stats + + [![Gift Cards on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gift_Cards)](https://awesome-privacy.xyz/finance/other-payment-methods/gift-cards)ㅤ + +
- **[icon Pre-paid Cards]()** - Similarly to gift cards, buying a pre-paid card for cash can enable you to purchase goods and services in stores that only accept card payments. -[…](https://awesome-privacy.xyz/finance/other-payment-methods/pre-paid-cards "View full Pre-paid Cards report") + + -
+ Stats + + [![Pre-paid Cards on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pre-paid_Cards)](https://awesome-privacy.xyz/finance/other-payment-methods/pre-paid-cards)ㅤ + +
⚠️ Word of Warning @@ -4672,38 +4604,29 @@ crypto currency or cash, since neither can be easily tied back to your identity. - **[icon Firefly III](https://www.firefly-iii.org)** - A free and open source personal finance manager. Firefly III features a clean and clear UI, is easy to set up and use, and is backed by a strong community. -Regular updates bring new features, improvements, and fixes. There's also a hass.io -addon, and compatibility with Home Assistant. Ensure your server is securely configured. -[…](https://awesome-privacy.xyz/finance/secure-budgeting/firefly-iii "View full Firefly III report") +Regular updates bring new features, improvem[…](https://awesome-privacy.xyz/finance/secure-budgeting/firefly-iii "View full Firefly III report") -
Stats - [![GitHub: firefly-iii/firefly-iii](https://img.shields.io/github/stars/firefly-iii/firefly-iii?style=flat&logo=github&label=firefly-iii&color=%235f53f4&cacheSeconds=3600)](https://github.com/firefly-iii/firefly-iii) [![Firefly III on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefly_III)](https://awesome-privacy.xyz/finance/secure-budgeting/firefly-iii) -˙ + [![GitHub: firefly-iii/firefly-iii](https://img.shields.io/github/stars/firefly-iii/firefly-iii?style=flat&logo=github&label=firefly-iii&color=%235f53f4&cacheSeconds=3600)](https://github.com/firefly-iii/firefly-iii) [![Firefly III on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Firefly_III)](https://awesome-privacy.xyz/finance/secure-budgeting/firefly-iii)ㅤ
- **[icon GnuCash](https://www.gnucash.org)** - A full-featured cross-platform accounting application suitable for personal and small business finance. Stable and reliable, GnuCash offers a comprehensive -suite of financial management tools. Available for Windows, Mac, Linux, and -Android. -[…](https://awesome-privacy.xyz/finance/secure-budgeting/gnucash "View full GnuCash report") +suite of financial management tools. Availab[…](https://awesome-privacy.xyz/finance/secure-budgeting/gnucash "View full GnuCash report") -
Stats - [![GitHub: Gnucash/gnucash](https://img.shields.io/github/stars/Gnucash/gnucash?style=flat&logo=github&label=gnucash&color=%235f53f4&cacheSeconds=3600)](https://github.com/Gnucash/gnucash) [![GnuCash on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GnuCash)](https://awesome-privacy.xyz/finance/secure-budgeting/gnucash) -˙ + [![GitHub: Gnucash/gnucash](https://img.shields.io/github/stars/Gnucash/gnucash?style=flat&logo=github&label=gnucash&color=%235f53f4&cacheSeconds=3600)](https://github.com/Gnucash/gnucash) [![GnuCash on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=GnuCash)](https://awesome-privacy.xyz/finance/secure-budgeting/gnucash)ㅤ
- **[icon Plain Text Accounting](https://plaintextaccounting.org)** - Utilizes plain text files and scriptable, command-line-friendly software for bookkeeping/accounting, offering full control over data. Popular tools include -Ledger, hledger, and Beancount among others, providing a flexible and vendor-independent -approach to accounting. -[…](https://awesome-privacy.xyz/finance/secure-budgeting/plain-text-accounting "View full Plain Text Accounting report") +Ledger, hledger, and Beancount among others,[…](https://awesome-privacy.xyz/finance/secure-budgeting/plain-text-accounting "View full Plain Text Accounting report") -
Stats - [![GitHub: plaintextaccounting/plaintextaccounting](https://img.shields.io/github/stars/plaintextaccounting/plaintextaccounting?style=flat&logo=github&label=plaintextaccounting&color=%235f53f4&cacheSeconds=3600)](https://github.com/plaintextaccounting/plaintextaccounting) [![Plain Text Accounting on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Plain_Text_Accounting)](https://awesome-privacy.xyz/finance/secure-budgeting/plain-text-accounting) -˙ + [![GitHub: plaintextaccounting/plaintextaccounting](https://img.shields.io/github/stars/plaintextaccounting/plaintextaccounting?style=flat&logo=github&label=plaintextaccounting&color=%235f53f4&cacheSeconds=3600)](https://github.com/plaintextaccounting/plaintextaccounting) [![Plain Text Accounting on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Plain_Text_Accounting)](https://awesome-privacy.xyz/finance/secure-budgeting/plain-text-accounting)ㅤ
@@ -4722,9 +4645,8 @@ approach to accounting. > [Smart Wallet](https://apps.apple.com/app/smart-wallet/id1378013954) (iOS), > [My-Budget](https://rezach.github.io/my-budget) (Desktop), > [MoneyManager EX](https://www.moneymanagerex.org), -> [Skrooge](https://skrooge.org), -> [kMyMoney](https://kmymoney.org) and -> [Budget Zen](https://budgetzen.net) (a simple E2E encrypted budget manager) +> [Skrooge](https://skrooge.org), and +> [kMyMoney](https://kmymoney.org). >

⬆️ [Back to Top]

@@ -4745,57 +4667,47 @@ following sites aim to do. - **[icon Aether](https://getaether.net)** - Offers self-governing communities with auditable moderation, akin to Reddit but prioritizing privacy, democracy, and transparency. Aether is peer-to-peer and open -source, available for Windows, Mac, and Linux. -[…](https://awesome-privacy.xyz/social/social-networks/aether "View full Aether report") +source, available for Windows, Mac, a[…](https://awesome-privacy.xyz/social/social-networks/aether "View full Aether report") -
Stats - [![GitHub: getaether/aether-community-firmware](https://img.shields.io/github/stars/getaether/aether-community-firmware?style=flat&logo=github&label=aether-community-firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/getaether/aether-community-firmware) [![Aether on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aether)](https://awesome-privacy.xyz/social/social-networks/aether) -˙ + [![GitHub: getaether/aether-community-firmware](https://img.shields.io/github/stars/getaether/aether-community-firmware?style=flat&logo=github&label=aether-community-firmware&color=%235f53f4&cacheSeconds=3600)](https://github.com/getaether/aether-community-firmware) [![Aether on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aether)](https://awesome-privacy.xyz/social/social-networks/aether)ㅤ
- **[icon Discourse](https://www.discourse.org)** - A fully open-source, self-hostable discussion platform usable as a mailing list, discussion forum, or long-form chat room. -[…](https://awesome-privacy.xyz/social/social-networks/discourse "View full Discourse report") + -
Stats - [![GitHub: discourse/discourse](https://img.shields.io/github/stars/discourse/discourse?style=flat&logo=github&label=discourse&color=%235f53f4&cacheSeconds=3600)](https://github.com/discourse/discourse) [![Privacy Policy](https://shields.tosdr.org/en_1340.svg)](https://tosdr.org/en/service/1340) [![Discourse on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Discourse)](https://awesome-privacy.xyz/social/social-networks/discourse) -˙ + [![GitHub: discourse/discourse](https://img.shields.io/github/stars/discourse/discourse?style=flat&logo=github&label=discourse&color=%235f53f4&cacheSeconds=3600)](https://github.com/discourse/discourse) [![Privacy Policy](https://shields.tosdr.org/en_1340.svg)](https://tosdr.org/en/service/1340) [![Discourse on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Discourse)](https://awesome-privacy.xyz/social/social-networks/discourse)ㅤ
- **[icon Mastodon](https://mastodon.social)** - An open-source, distributed social media platform functioning similarly to Twitter, without algorithmic timeline manipulations. It operates across independent servers. -[…](https://awesome-privacy.xyz/social/social-networks/mastodon "View full Mastodon report") + -
Stats - [![GitHub: mastodon/mastodon](https://img.shields.io/github/stars/mastodon/mastodon?style=flat&logo=github&label=mastodon&color=%235f53f4&cacheSeconds=3600)](https://github.com/mastodon/mastodon) [![Privacy Policy](https://shields.tosdr.org/en_639.svg)](https://tosdr.org/en/service/639) [![Mastodon on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mastodon)](https://awesome-privacy.xyz/social/social-networks/mastodon) -˙ + [![GitHub: mastodon/mastodon](https://img.shields.io/github/stars/mastodon/mastodon?style=flat&logo=github&label=mastodon&color=%235f53f4&cacheSeconds=3600)](https://github.com/mastodon/mastodon) [![Privacy Policy](https://shields.tosdr.org/en_639.svg)](https://tosdr.org/en/service/639) [![Mastodon on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mastodon)](https://awesome-privacy.xyz/social/social-networks/mastodon)ㅤ
-- **[icon nostr](https://github.com/nostr-protocol/nostr)** - nostr stands for Notes and other stuff transmitted by relays. -It is an open protocol, not merely a platform. -This distinction enables truly censorship-resistant and global value-for-value publishing on the web. -With the power to replace data-greedy applications like Twitter and Instagram, -nostr offers a promising alternative for users seeking a more private and secure online experience -without algorithmic manipulations. ".... I feel like I’m looking at the future." that is what [Snowden](https://x.com/Snowden/status/1617623779626352640) wrote about nostr. -[…](https://awesome-privacy.xyz/social/social-networks/nostr "View full nostr report") +- **[icon nostr](https://github.com/nostr-protocol/nostr)** - nostr stands for Notes and other stuff transmitted by relays. +It is an open protocol, not merely a platform. +This distinction enables truly censorship-resistant and global value-for-value publishing o[…](https://awesome-privacy.xyz/social/social-networks/nostr "View full nostr report") -
Stats - [![GitHub: https://github.com/nostr-protocol](https://img.shields.io/github/stars/https://github.com/nostr-protocol?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/nostr-protocol) [![nostr on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=nostr)](https://awesome-privacy.xyz/social/social-networks/nostr) -˙ + [![GitHub: https://github.com/nostr-protocol](https://img.shields.io/github/stars/https://github.com/nostr-protocol?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/nostr-protocol) [![nostr on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=nostr)](https://awesome-privacy.xyz/social/social-networks/nostr)ㅤ
- **[icon Minds](https://www.minds.com)** - A social media platform designed to foster open conversations and community engagement. Rewards content creation. -[…](https://awesome-privacy.xyz/social/social-networks/minds "View full Minds report") + -
Stats - [![GitHub: minds/minds](https://img.shields.io/github/stars/minds/minds?style=flat&logo=github&label=minds&color=%235f53f4&cacheSeconds=3600)](https://github.com/minds/minds) [![Minds on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Minds)](https://awesome-privacy.xyz/social/social-networks/minds) -˙ + [![GitHub: minds/minds](https://img.shields.io/github/stars/minds/minds?style=flat&logo=github&label=minds&color=%235f53f4&cacheSeconds=3600)](https://github.com/minds/minds) [![Minds on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Minds)](https://awesome-privacy.xyz/social/social-networks/minds)ㅤ
@@ -4828,33 +4740,29 @@ so should be avoided, but if you choose to keep using them see - **[icon PeerTube](https://joinpeertube.org)** - A federated video platform leveraging peer-to-peer technology to decrease server load during video streaming. Supports self-hosting or joining existing instances, -enabling video viewing from any PeerTube server. -[…](https://awesome-privacy.xyz/social/video-platforms/peertube "View full PeerTube report") +enabling video viewing from any PeerT[…](https://awesome-privacy.xyz/social/video-platforms/peertube "View full PeerTube report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1596.svg)](https://tosdr.org/en/service/1596) [![PeerTube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PeerTube)](https://awesome-privacy.xyz/social/video-platforms/peertube) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_1596.svg)](https://tosdr.org/en/service/1596) [![PeerTube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PeerTube)](https://awesome-privacy.xyz/social/video-platforms/peertube)ㅤ
- **[icon DTube](https://d.tube)** - A decentralized, ad-free video platform emphasizing minimal moderation. It rewards users with cryptocurrency, leveraging blockchain technology. -[…](https://awesome-privacy.xyz/social/video-platforms/dtube "View full DTube report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_2798.svg)](https://tosdr.org/en/service/2798) [![DTube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DTube)](https://awesome-privacy.xyz/social/video-platforms/dtube) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_2798.svg)](https://tosdr.org/en/service/2798) [![DTube on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DTube)](https://awesome-privacy.xyz/social/video-platforms/dtube)ㅤ
- **[icon BitChute](https://www.bitchute.com)** - Established in 2017, BitChute is a video hosting service that offers a platform for uploaders to evade the content restrictions found on other sites like YouTube. -[…](https://awesome-privacy.xyz/social/video-platforms/bitchute "View full BitChute report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_513.svg)](https://tosdr.org/en/service/513) [![BitChute on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BitChute)](https://awesome-privacy.xyz/social/video-platforms/bitchute) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_513.svg)](https://tosdr.org/en/service/513) [![BitChute on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=BitChute)](https://awesome-privacy.xyz/social/video-platforms/bitchute)ㅤ
@@ -4892,56 +4800,56 @@ Brighteon, D-Tube, PeerTube, and many others. - **[icon Write Freely](https://writefreely.org)** - A minimalist, federated blogging platform offering a clean UI. It's free, open source, and caters to writers seeking simplicity and federation capabilities. For hosted options, visit Write.as. -[…](https://awesome-privacy.xyz/social/blogging-platforms/write-freely "View full Write Freely report") + -
Stats - [![GitHub: writeas/writefreely](https://img.shields.io/github/stars/writeas/writefreely?style=flat&logo=github&label=writefreely&color=%235f53f4&cacheSeconds=3600)](https://github.com/writeas/writefreely) [![Write Freely on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Write_Freely)](https://awesome-privacy.xyz/social/blogging-platforms/write-freely) -˙ + [![GitHub: writeas/writefreely](https://img.shields.io/github/stars/writeas/writefreely?style=flat&logo=github&label=writefreely&color=%235f53f4&cacheSeconds=3600)](https://github.com/writeas/writefreely) [![Write Freely on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Write_Freely)](https://awesome-privacy.xyz/social/blogging-platforms/write-freely)ㅤ
- **[icon Telegraph](https://telegra.ph)** - A quick, anonymous blogging platform by Telegram. It's designed for simplicity and speed, allowing for straightforward content publishing without registration. -[…](https://awesome-privacy.xyz/social/blogging-platforms/telegraph "View full Telegraph report") -- **[icon Mataroa](https://mataroa.blog)** - A minimalist blogging platform focused on privacy and simplicity. It's open source and -eschews complex features for a straightforward writing and publishing experience. -[…](https://awesome-privacy.xyz/social/blogging-platforms/mataroa "View full Mataroa report") + -
Stats - [![GitHub: mataroa-blog/mataroa](https://img.shields.io/github/stars/mataroa-blog/mataroa?style=flat&logo=github&label=mataroa&color=%235f53f4&cacheSeconds=3600)](https://github.com/mataroa-blog/mataroa) [![Mataroa on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mataroa)](https://awesome-privacy.xyz/social/blogging-platforms/mataroa) -˙ + [![Telegraph on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Telegraph)](https://awesome-privacy.xyz/social/blogging-platforms/telegraph)ㅤ + +
+- **[icon Mataroa](https://mataroa.blog)** - A minimalist blogging platform focused on privacy and simplicity. It's open source and +eschews complex features for a straightforward writing and publishing experience. + + -
+ Stats + + [![GitHub: mataroa-blog/mataroa](https://img.shields.io/github/stars/mataroa-blog/mataroa?style=flat&logo=github&label=mataroa&color=%235f53f4&cacheSeconds=3600)](https://github.com/mataroa-blog/mataroa) [![Mataroa on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Mataroa)](https://awesome-privacy.xyz/social/blogging-platforms/mataroa)ㅤ
- **[icon Bear Blog](https://bearblog.dev/)** - A no-nonsense, super-fast blogging platform prioritizing privacy. It strips back unnecessary features to focus on straightforward blogging. The platform is open source. -[…](https://awesome-privacy.xyz/social/blogging-platforms/bear-blog "View full Bear Blog report") + -
Stats - [![GitHub: HermanMartinus/bearblog](https://img.shields.io/github/stars/HermanMartinus/bearblog?style=flat&logo=github&label=bearblog&color=%235f53f4&cacheSeconds=3600)](https://github.com/HermanMartinus/bearblog) [![Bear Blog on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bear_Blog)](https://awesome-privacy.xyz/social/blogging-platforms/bear-blog) -˙ + [![GitHub: HermanMartinus/bearblog](https://img.shields.io/github/stars/HermanMartinus/bearblog?style=flat&logo=github&label=bearblog&color=%235f53f4&cacheSeconds=3600)](https://github.com/HermanMartinus/bearblog) [![Bear Blog on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Bear_Blog)](https://awesome-privacy.xyz/social/blogging-platforms/bear-blog)ㅤ
- **[icon Movim](https://movim.eu/)** - A web frontend for XMPP, offering decentralized blogging and chatrooms. Movim is open source, integrating social and communication tools in a unified platform. -[…](https://awesome-privacy.xyz/social/blogging-platforms/movim "View full Movim report") + -
Stats - [![GitHub: movim/movim](https://img.shields.io/github/stars/movim/movim?style=flat&logo=github&label=movim&color=%235f53f4&cacheSeconds=3600)](https://github.com/movim/movim) [![Movim on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Movim)](https://awesome-privacy.xyz/social/blogging-platforms/movim) -˙ + [![GitHub: movim/movim](https://img.shields.io/github/stars/movim/movim?style=flat&logo=github&label=movim&color=%235f53f4&cacheSeconds=3600)](https://github.com/movim/movim) [![Movim on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Movim)](https://awesome-privacy.xyz/social/blogging-platforms/movim)ㅤ
- **[icon Pico](https://pico.sh/)** - Web services over SSH, including blogging with Prose, microsites with Pages, and a pastebin with Pastes. The services use public-key cryptography by default with no browser-based tracking and -minimal logging. -[…](https://awesome-privacy.xyz/social/blogging-platforms/pico "View full Pico report") +minimal[…](https://awesome-privacy.xyz/social/blogging-platforms/pico "View full Pico report") -
Stats - [![GitHub: picosh/pico](https://img.shields.io/github/stars/picosh/pico?style=flat&logo=github&label=pico&color=%235f53f4&cacheSeconds=3600)](https://github.com/picosh/pico) [![Pico on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pico)](https://awesome-privacy.xyz/social/blogging-platforms/pico) -📦 Open Source ˙ + [![GitHub: picosh/pico](https://img.shields.io/github/stars/picosh/pico?style=flat&logo=github&label=pico&color=%235f53f4&cacheSeconds=3600)](https://github.com/picosh/pico) [![Pico on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Pico)](https://awesome-privacy.xyz/social/blogging-platforms/pico) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/picosh/pico)ㅤ
@@ -4976,19 +4884,29 @@ minimal logging. - **[icon Tiny RSS](https://tt-rss.org)** - A web-based news feed reader and aggregator, supporting RSS/Atom feeds. It's free, open source, and offers a customizable and self-hostable platform for managing your news feeds. -[…](https://awesome-privacy.xyz/social/news-readers/tiny-rss "View full Tiny RSS report") -- **[icon RSSOwl](http://www.rssowl.org)** - A powerful, desktop-based RSS reader offering extensive organization features. It facilitates -managing and curating news feeds from various sources. -[…](https://awesome-privacy.xyz/social/news-readers/rssowl "View full RSSOwl report") -- **[icon Feedly](https://feedly.com)** - Offers a premium news aggregation experience, presenting news from chosen sources in a clean, -modern interface. Beyond RSS, it integrates with various news outlets, ensuring a tailored -news feed without manipulated content. Parts of the service are open source. -[…](https://awesome-privacy.xyz/social/news-readers/feedly "View full Feedly report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_405.svg)](https://tosdr.org/en/service/405) [![Feedly on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Feedly)](https://awesome-privacy.xyz/social/news-readers/feedly) -˙ + [![Tiny RSS on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Tiny_RSS)](https://awesome-privacy.xyz/social/news-readers/tiny-rss)ㅤ + +
+- **[icon RSSOwl](http://www.rssowl.org)** - A powerful, desktop-based RSS reader offering extensive organization features. It facilitates +managing and curating news feeds from various sources. + + -
+ Stats + + [![RSSOwl on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RSSOwl)](https://awesome-privacy.xyz/social/news-readers/rssowl)ㅤ + +
+- **[icon Feedly](https://feedly.com)** - Offers a premium news aggregation experience, presenting news from chosen sources in a clean, +modern interface. Beyond RSS, it integrates with various news outlets, ensuring a tailored +news feed witho[…](https://awesome-privacy.xyz/social/news-readers/feedly "View full Feedly report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_405.svg)](https://tosdr.org/en/service/405) [![Feedly on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Feedly)](https://awesome-privacy.xyz/social/news-readers/feedly)ㅤ
@@ -5006,26 +4924,38 @@ or tracking (unless otherwise stated). - **[icon Nitter](https://nitter.net)** - A privacy-centric alternative to Twitter's front-end, focusing on preventing user tracking. It's free, open source, lightweight, supports multiple themes, and offers customizable RSS feeds. -All client requests are proxied, enhancing privacy. No JavaScript required. -[…](https://awesome-privacy.xyz/social/proxy-sites/nitter "View full Nitter report") -- **[icon Invidious](https://invidious.io)** - An open source, privacy-focused YouTube frontend. It minimizes Google tracking, supports audio-only mode, -integrates Reddit comments, and offers advanced playback options. Lightweight and can function without -JavaScript. Supports import/export of subscriptions and feed customization. -[…](https://awesome-privacy.xyz/social/proxy-sites/invidious "View full Invidious report") +All client[…](https://awesome-privacy.xyz/social/proxy-sites/nitter "View full Nitter report") -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_1471.svg)](https://tosdr.org/en/service/1471) [![Invidious on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Invidious)](https://awesome-privacy.xyz/social/proxy-sites/invidious) -˙ + [![Nitter on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Nitter)](https://awesome-privacy.xyz/social/proxy-sites/nitter)ㅤ + +
+- **[icon Invidious](https://invidious.io)** - An open source, privacy-focused YouTube frontend. It minimizes Google tracking, supports audio-only mode, +integrates Reddit comments, and offers advanced playback options. Lightweight and can function[…](https://awesome-privacy.xyz/social/proxy-sites/invidious "View full Invidious report") + -
+ Stats + + [![Privacy Policy](https://shields.tosdr.org/en_1471.svg)](https://tosdr.org/en/service/1471) [![Invidious on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Invidious)](https://awesome-privacy.xyz/social/proxy-sites/invidious)ㅤ
- **[icon Libreddit](https://libreddit.spike.codes)** - A private, fast Reddit frontend written in Rust. Excludes ads, trackers, and bloat, making it much faster -than the official site. Can be self-hosted via Docker or other methods. Implements most Reddit features -for anonymous browsing. -[…](https://awesome-privacy.xyz/social/proxy-sites/libreddit "View full Libreddit report") +than the official site. Can be self-hosted via Docker or other methods. Implements most Reddit[…](https://awesome-privacy.xyz/social/proxy-sites/libreddit "View full Libreddit report") + -
+ Stats + + [![Libreddit on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Libreddit)](https://awesome-privacy.xyz/social/proxy-sites/libreddit)ㅤ + +
- **[icon WebProxy](https://weboproxy.com)** - A free proxy service offering a Tor mode for evading censorship and accessing geo-restricted content. Claims to encrypt traffic, but caution is advised for personal information. Managed by DevroLabs. -[…](https://awesome-privacy.xyz/social/proxy-sites/webproxy "View full WebProxy report") + + -
+ Stats + + [![WebProxy on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=WebProxy)](https://awesome-privacy.xyz/social/proxy-sites/webproxy)ㅤ + +
⚠️ Word of Warning @@ -5043,6 +4973,14 @@ a more private experience, with a native-feel desktop app. It is built upon the [Invidious](https://invidious.io/) API.
+
+ℹ️ Further Info + +> *[alternative-front-ends](https://github.com/mendel5/alternative-front-ends) provides information on +dozens of alternative front-end options for popular platforms, such as YouTube, Twitter, Reddit, +TikTok, and more.* +
+

⬆️ [Back to Top]

--- @@ -5107,7 +5045,16 @@ It is built upon the [Invidious](https://invidious.io/) API. ### File Converters -

⚠️ This section is still a work in progress ⚠️
Check back soon, or help us complete it by submitting a pull request

+- **[icon FFmpeg](https://ffmpeg.org/)** - A complete, cross-platform solution to record, convert, and stream audio and +video. It's the industry standard multimedia framework, handling a vast range +of formats. As a command-line tool, it guaran[…](https://awesome-privacy.xyz/media/file-converters/ffmpeg "View full FFmpeg report") + -
+ Stats + + [![GitHub: FFmpeg/FFmpeg](https://img.shields.io/github/stars/FFmpeg/FFmpeg?style=flat&logo=github&label=FFmpeg&color=%235f53f4&cacheSeconds=3600)](https://github.com/FFmpeg/FFmpeg) [![FFmpeg on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FFmpeg)](https://awesome-privacy.xyz/media/file-converters/ffmpeg) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/FFmpeg/FFmpeg)ㅤ + +
+

⬆️ [Back to Top]

--- @@ -5118,85 +5065,75 @@ It is built upon the [Invidious](https://invidious.io/) API. - **[icon Gimp](https://www.gimp.org)** - A free, open source, cross-platform image editor. GIMP is a powerful tool for photo retouching, image composition, and image authoring. It is highly customizable, -and supports a wide range of file formats. -[…](https://awesome-privacy.xyz/creativity/image-editors/gimp "View full Gimp report") +and supports a wide range of file for[…](https://awesome-privacy.xyz/creativity/image-editors/gimp "View full Gimp report") -
Stats - [![GitHub: GNOME/gimp](https://img.shields.io/github/stars/GNOME/gimp?style=flat&logo=github&label=gimp&color=%235f53f4&cacheSeconds=3600)](https://github.com/GNOME/gimp) [![Gimp on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gimp)](https://awesome-privacy.xyz/creativity/image-editors/gimp) -📦 Open Source ˙ + [![GitHub: GNOME/gimp](https://img.shields.io/github/stars/GNOME/gimp?style=flat&logo=github&label=gimp&color=%235f53f4&cacheSeconds=3600)](https://github.com/GNOME/gimp) [![Gimp on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Gimp)](https://awesome-privacy.xyz/creativity/image-editors/gimp) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/GNOME/gimp)ㅤ
- **[icon InkScape](https://inkscape.org)** - A free, open source, professional vector graphics editor. It is a powerful tool for creating illustrations, icons, logos, diagrams, maps, and web graphics. -[…](https://awesome-privacy.xyz/creativity/image-editors/inkscape "View full InkScape report") + -
Stats - [![GitHub: inkscape/inkscape](https://img.shields.io/github/stars/inkscape/inkscape?style=flat&logo=github&label=inkscape&color=%235f53f4&cacheSeconds=3600)](https://github.com/inkscape/inkscape) [![Privacy Policy](https://shields.tosdr.org/en_6568.svg)](https://tosdr.org/en/service/6568) [![InkScape on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=InkScape)](https://awesome-privacy.xyz/creativity/image-editors/inkscape) -📦 Open Source ˙ + [![GitHub: inkscape/inkscape](https://img.shields.io/github/stars/inkscape/inkscape?style=flat&logo=github&label=inkscape&color=%235f53f4&cacheSeconds=3600)](https://github.com/inkscape/inkscape) [![Privacy Policy](https://shields.tosdr.org/en_6568.svg)](https://tosdr.org/en/service/6568) [![InkScape on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=InkScape)](https://awesome-privacy.xyz/creativity/image-editors/inkscape) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/inkscape/inkscape)ㅤ
- **[icon Paint.NET](https://www.getpaint.net)** - A more advanced take on Microsoft Paint. Suitable for basic image editing, with support for basic layers, unlimited undo/redo, and extendable via plugins -[…](https://awesome-privacy.xyz/creativity/image-editors/paint.net "View full Paint.NET report") + -
Stats - [![GitHub: paintdotnet/release](https://img.shields.io/github/stars/paintdotnet/release?style=flat&logo=github&label=release&color=%235f53f4&cacheSeconds=3600)](https://github.com/paintdotnet/release) [![Paint.NET on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Paint.NET)](https://awesome-privacy.xyz/creativity/image-editors/paint.net) -📦 Open Source ˙ + [![GitHub: paintdotnet/release](https://img.shields.io/github/stars/paintdotnet/release?style=flat&logo=github&label=release&color=%235f53f4&cacheSeconds=3600)](https://github.com/paintdotnet/release) [![Paint.NET on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Paint.NET)](https://awesome-privacy.xyz/creativity/image-editors/paint.net) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/paintdotnet/release)ㅤ
- **[icon PixlrX](https://pixlr.com/express)** - A free web-based image editor, with a modern UI. Also offers premium/paid features, such as AI-powered generation, touchup and editing -[…](https://awesome-privacy.xyz/creativity/image-editors/pixlrx "View full PixlrX report") + -
Stats - [![Privacy Policy](https://shields.tosdr.org/en_3240.svg)](https://tosdr.org/en/service/3240) [![PixlrX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PixlrX)](https://awesome-privacy.xyz/creativity/image-editors/pixlrx) -˙ + [![Privacy Policy](https://shields.tosdr.org/en_3240.svg)](https://tosdr.org/en/service/3240) [![PixlrX on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PixlrX)](https://awesome-privacy.xyz/creativity/image-editors/pixlrx)ㅤ
- **[icon RawTherapee](https://rawtherapee.com)** - A powerful raw photo processing system and editor, for non-destructive editing of raw digital photos -[…](https://awesome-privacy.xyz/creativity/image-editors/rawtherapee "View full RawTherapee report") + -
Stats - [![GitHub: Beep6581/RawTherapee](https://img.shields.io/github/stars/Beep6581/RawTherapee?style=flat&logo=github&label=RawTherapee&color=%235f53f4&cacheSeconds=3600)](https://github.com/Beep6581/RawTherapee) [![RawTherapee on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RawTherapee)](https://awesome-privacy.xyz/creativity/image-editors/rawtherapee) -📦 Open Source ˙ + [![GitHub: Beep6581/RawTherapee](https://img.shields.io/github/stars/Beep6581/RawTherapee?style=flat&logo=github&label=RawTherapee&color=%235f53f4&cacheSeconds=3600)](https://github.com/Beep6581/RawTherapee) [![RawTherapee on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=RawTherapee)](https://awesome-privacy.xyz/creativity/image-editors/rawtherapee) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/Beep6581/RawTherapee)ㅤ
- **[icon PhotoPea](https://photopea.com)** - A free online image editor, for both raster and vector graphics, with a very wide range of supported formats -[…](https://awesome-privacy.xyz/creativity/image-editors/photopea "View full PhotoPea report") + -
Stats - [![GitHub: photopea/photopea](https://img.shields.io/github/stars/photopea/photopea?style=flat&logo=github&label=photopea&color=%235f53f4&cacheSeconds=3600)](https://github.com/photopea/photopea) [![Privacy Policy](https://shields.tosdr.org/en_4105.svg)](https://tosdr.org/en/service/4105) [![PhotoPea on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PhotoPea)](https://awesome-privacy.xyz/creativity/image-editors/photopea) -💰 Accepts Anonymous Payment ˙ + [![GitHub: photopea/photopea](https://img.shields.io/github/stars/photopea/photopea?style=flat&logo=github&label=photopea&color=%235f53f4&cacheSeconds=3600)](https://github.com/photopea/photopea) [![Privacy Policy](https://shields.tosdr.org/en_4105.svg)](https://tosdr.org/en/service/4105) [![PhotoPea on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=PhotoPea)](https://awesome-privacy.xyz/creativity/image-editors/photopea) ![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white)ㅤ
- **[icon Krita](https://krita.org/en)** - Digital painting application. Free and open source (backed by KDE), with cross-platform support, Krita is popular among both professional and amateur artists -due to it's comprehensive feature set, and intuitive UI -[…](https://awesome-privacy.xyz/creativity/image-editors/krita "View full Krita report") +due to it's comprehensive feature set, and[…](https://awesome-privacy.xyz/creativity/image-editors/krita "View full Krita report") -
Stats - [![GitHub: KDE/krita](https://img.shields.io/github/stars/KDE/krita?style=flat&logo=github&label=krita&color=%235f53f4&cacheSeconds=3600)](https://github.com/KDE/krita) [![Krita on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Krita)](https://awesome-privacy.xyz/creativity/image-editors/krita) -📦 Open Source ˙ + [![GitHub: KDE/krita](https://img.shields.io/github/stars/KDE/krita?style=flat&logo=github&label=krita&color=%235f53f4&cacheSeconds=3600)](https://github.com/KDE/krita) [![Krita on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Krita)](https://awesome-privacy.xyz/creativity/image-editors/krita) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/KDE/krita)ㅤ
- **[icon DarkTable](https://www.darktable.org)** - A photography workflow application (similar to Adbobe Lightroom) Includes a non-destructive raw developer for raw images and managing digital negatives. -[…](https://awesome-privacy.xyz/creativity/image-editors/darktable "View full DarkTable report") + -
Stats - [![GitHub: darktable-org/darktable](https://img.shields.io/github/stars/darktable-org/darktable?style=flat&logo=github&label=darktable&color=%235f53f4&cacheSeconds=3600)](https://github.com/darktable-org/darktable) [![DarkTable on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DarkTable)](https://awesome-privacy.xyz/creativity/image-editors/darktable) -📦 Open Source ˙ + [![GitHub: darktable-org/darktable](https://img.shields.io/github/stars/darktable-org/darktable?style=flat&logo=github&label=darktable&color=%235f53f4&cacheSeconds=3600)](https://github.com/darktable-org/darktable) [![DarkTable on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=DarkTable)](https://awesome-privacy.xyz/creativity/image-editors/darktable) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/darktable-org/darktable)ㅤ
@@ -5208,76 +5145,65 @@ Includes a non-destructive raw developer for raw images and managing digital ne - **[icon Shotcut](https://shotcut.org)** - A free, open source, cross-platform video editor, using FFmpeg Shotcut supports a wide range of formats, and has a comprehensive feature set, -including 4K & 8k resolution, webcam + audio capture, batch opperations and -[much more](https://shotcut.org/features/) -[…](https://awesome-privacy.xyz/creativity/video-editors/shotcut "View full Shotcut report") +including 4K & 8k resolution, webcam + audio capture, batc[…](https://awesome-privacy.xyz/creativity/video-editors/shotcut "View full Shotcut report") -
Stats - [![GitHub: mltframework/shotcut](https://img.shields.io/github/stars/mltframework/shotcut?style=flat&logo=github&label=shotcut&color=%235f53f4&cacheSeconds=3600)](https://github.com/mltframework/shotcut) [![Shotcut on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Shotcut)](https://awesome-privacy.xyz/creativity/video-editors/shotcut) -📦 Open Source ˙ + [![GitHub: mltframework/shotcut](https://img.shields.io/github/stars/mltframework/shotcut?style=flat&logo=github&label=shotcut&color=%235f53f4&cacheSeconds=3600)](https://github.com/mltframework/shotcut) [![Shotcut on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Shotcut)](https://awesome-privacy.xyz/creativity/video-editors/shotcut) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/mltframework/shotcut)ㅤ
- **[icon OpenShot](https://www.openshot.org)** - A free, simple, cross-platform video editor. Great for trimming/slicing, video effects, adding titles, scene animations and [more](https://www.openshot.org/features/) -[…](https://awesome-privacy.xyz/creativity/video-editors/openshot "View full OpenShot report") + -
Stats - [![GitHub: OpenShot/openshot-qt](https://img.shields.io/github/stars/OpenShot/openshot-qt?style=flat&logo=github&label=openshot-qt&color=%235f53f4&cacheSeconds=3600)](https://github.com/OpenShot/openshot-qt) [![OpenShot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenShot)](https://awesome-privacy.xyz/creativity/video-editors/openshot) -📦 Open Source ˙ + [![GitHub: OpenShot/openshot-qt](https://img.shields.io/github/stars/OpenShot/openshot-qt?style=flat&logo=github&label=openshot-qt&color=%235f53f4&cacheSeconds=3600)](https://github.com/OpenShot/openshot-qt) [![OpenShot on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OpenShot)](https://awesome-privacy.xyz/creativity/video-editors/openshot) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/OpenShot/openshot-qt)ㅤ
- **[icon Kdenlive](https://kdenlive.org)** - KDE Non-Linear Video Editor, is an editor based on the MLT Framework, KDE and Qt, written using C++ and using FFmpeg -[…](https://awesome-privacy.xyz/creativity/video-editors/kdenlive "View full Kdenlive report") + -
Stats - [![GitHub: kdenlive/kdenlive](https://img.shields.io/github/stars/kdenlive/kdenlive?style=flat&logo=github&label=kdenlive&color=%235f53f4&cacheSeconds=3600)](https://github.com/kdenlive/kdenlive) [![Kdenlive on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kdenlive)](https://awesome-privacy.xyz/creativity/video-editors/kdenlive) -📦 Open Source ˙ + [![GitHub: kdenlive/kdenlive](https://img.shields.io/github/stars/kdenlive/kdenlive?style=flat&logo=github&label=kdenlive&color=%235f53f4&cacheSeconds=3600)](https://github.com/kdenlive/kdenlive) [![Kdenlive on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Kdenlive)](https://awesome-privacy.xyz/creativity/video-editors/kdenlive) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/kdenlive/kdenlive)ㅤ
- **[icon FlowBlade](https://jliljebl.github.io/flowblade)** - A multitrack non-linear video editor with a simple interface -[…](https://awesome-privacy.xyz/creativity/video-editors/flowblade "View full FlowBlade report") + -
Stats - [![GitHub: jliljebl/flowblade](https://img.shields.io/github/stars/jliljebl/flowblade?style=flat&logo=github&label=flowblade&color=%235f53f4&cacheSeconds=3600)](https://github.com/jliljebl/flowblade) [![FlowBlade on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FlowBlade)](https://awesome-privacy.xyz/creativity/video-editors/flowblade) -📦 Open Source ˙ + [![GitHub: jliljebl/flowblade](https://img.shields.io/github/stars/jliljebl/flowblade?style=flat&logo=github&label=flowblade&color=%235f53f4&cacheSeconds=3600)](https://github.com/jliljebl/flowblade) [![FlowBlade on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=FlowBlade)](https://awesome-privacy.xyz/creativity/video-editors/flowblade) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/jliljebl/flowblade)ㅤ
- **[icon Cinelerra GG Infinity](https://www.cinelerra-gg.org)** - Simple video editor, for applying transitions, effects and text as well as splicing video clips -[…](https://awesome-privacy.xyz/creativity/video-editors/cinelerra-gg-infinity "View full Cinelerra GG Infinity report") + -
Stats - [![GitHub: cinelerra-gg/cinelerra-gg](https://img.shields.io/github/stars/cinelerra-gg/cinelerra-gg?style=flat&logo=github&label=cinelerra-gg&color=%235f53f4&cacheSeconds=3600)](https://github.com/cinelerra-gg/cinelerra-gg) [![Cinelerra GG Infinity on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cinelerra_GG_Infinity)](https://awesome-privacy.xyz/creativity/video-editors/cinelerra-gg-infinity) -˙ + [![GitHub: cinelerra-gg/cinelerra-gg](https://img.shields.io/github/stars/cinelerra-gg/cinelerra-gg?style=flat&logo=github&label=cinelerra-gg&color=%235f53f4&cacheSeconds=3600)](https://github.com/cinelerra-gg/cinelerra-gg) [![Cinelerra GG Infinity on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Cinelerra_GG_Infinity)](https://awesome-privacy.xyz/creativity/video-editors/cinelerra-gg-infinity)ㅤ
- **[icon VitCutter](https://sourceforge.net/projects/vidcutter/)** - A simple Python-based cross-platform tool for cutting and splicing videos -[…](https://awesome-privacy.xyz/creativity/video-editors/vitcutter "View full VitCutter report") + -
Stats - [![GitHub: ozmartian/vidcutter](https://img.shields.io/github/stars/ozmartian/vidcutter?style=flat&logo=github&label=vidcutter&color=%235f53f4&cacheSeconds=3600)](https://github.com/ozmartian/vidcutter) [![VitCutter on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VitCutter)](https://awesome-privacy.xyz/creativity/video-editors/vitcutter) -˙ + [![GitHub: ozmartian/vidcutter](https://img.shields.io/github/stars/ozmartian/vidcutter?style=flat&logo=github&label=vidcutter&color=%235f53f4&cacheSeconds=3600)](https://github.com/ozmartian/vidcutter) [![VitCutter on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=VitCutter)](https://awesome-privacy.xyz/creativity/video-editors/vitcutter)ㅤ
- **[icon Natron](https://natrongithub.github.io)** - Free & open desktop node-graph based video compositing software. Similar in functionalities to Adobe After Effects. Features flexible rotoscoping, 2D & planner tracking, keying tools, -curve & dope-shift editor, GPU & network rendering, and is -easily extendable via community plugins, or by writing Python scripts -[…](https://awesome-privacy.xyz/creativity/video-editors/natron "View full Natron report") +curve & dope-shi[…](https://awesome-privacy.xyz/creativity/video-editors/natron "View full Natron report") -
Stats - [![GitHub: NatronGitHub/Natron](https://img.shields.io/github/stars/NatronGitHub/Natron?style=flat&logo=github&label=Natron&color=%235f53f4&cacheSeconds=3600)](https://github.com/NatronGitHub/Natron) [![Natron on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Natron)](https://awesome-privacy.xyz/creativity/video-editors/natron) -📦 Open Source ˙ + [![GitHub: NatronGitHub/Natron](https://img.shields.io/github/stars/NatronGitHub/Natron?style=flat&logo=github&label=Natron&color=%235f53f4&cacheSeconds=3600)](https://github.com/NatronGitHub/Natron) [![Natron on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Natron)](https://awesome-privacy.xyz/creativity/video-editors/natron) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/NatronGitHub/Natron)ㅤ
@@ -5290,17 +5216,11 @@ easily extendable via community plugins, or by writing Python scripts - **[icon Audacity](https://www.audacityteam.org)** - An easy-to-use, multi-track audio editor and recorder for desktops, great free alternative to Adobe Audition. Features recording from real and virtual devices, -import/export to a wide range of formats, high-quality processing -advanced multi-track editing, noise reduction, pitch correction, -audio restoration and much more. -It's easily extendable via community plugins, and -also supports cusotm macros and many scripting options -[…](https://awesome-privacy.xyz/creativity/audio-editors-and-recorders/audacity "View full Audacity report") +import/export to a wide range of formats[…](https://awesome-privacy.xyz/creativity/audio-editors-and-recorders/audacity "View full Audacity report") -
Stats - [![GitHub: audacity/audacity](https://img.shields.io/github/stars/audacity/audacity?style=flat&logo=github&label=audacity&color=%235f53f4&cacheSeconds=3600)](https://github.com/audacity/audacity) [![Privacy Policy](https://shields.tosdr.org/en_4516.svg)](https://tosdr.org/en/service/4516) [![Audacity on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Audacity)](https://awesome-privacy.xyz/creativity/audio-editors-and-recorders/audacity) -📦 Open Source ˙ + [![GitHub: audacity/audacity](https://img.shields.io/github/stars/audacity/audacity?style=flat&logo=github&label=audacity&color=%235f53f4&cacheSeconds=3600)](https://github.com/audacity/audacity) [![Privacy Policy](https://shields.tosdr.org/en_4516.svg)](https://tosdr.org/en/service/4516) [![Audacity on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Audacity)](https://awesome-privacy.xyz/creativity/audio-editors-and-recorders/audacity) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/audacity/audacity)ㅤ
@@ -5312,15 +5232,11 @@ also supports cusotm macros and many scripting options - **[icon OBS Studio](https://obsproject.com)** - Powerful desktop software for live streaming and screen recording. Free and open source software for video recording and live streaming. -Features real-time video/audio capturing, scene composition, encoding, -recording, and broadcasting. It supports a wide range of formats, -and is easily extendable via community plugins -[…](https://awesome-privacy.xyz/creativity/casting-and-streaming/obs-studio "View full OBS Studio report") +Features real-time video/audio capturing, scene composition, en[…](https://awesome-privacy.xyz/creativity/casting-and-streaming/obs-studio "View full OBS Studio report") -
Stats - [![GitHub: obsproject/obs-studio](https://img.shields.io/github/stars/obsproject/obs-studio?style=flat&logo=github&label=obs-studio&color=%235f53f4&cacheSeconds=3600)](https://github.com/obsproject/obs-studio) [![Privacy Policy](https://shields.tosdr.org/en_4227.svg)](https://tosdr.org/en/service/4227) [![OBS Studio on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OBS_Studio)](https://awesome-privacy.xyz/creativity/casting-and-streaming/obs-studio) -📦 Open Source ˙ + [![GitHub: obsproject/obs-studio](https://img.shields.io/github/stars/obsproject/obs-studio?style=flat&logo=github&label=obs-studio&color=%235f53f4&cacheSeconds=3600)](https://github.com/obsproject/obs-studio) [![Privacy Policy](https://shields.tosdr.org/en_4227.svg)](https://tosdr.org/en/service/4227) [![OBS Studio on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=OBS_Studio)](https://awesome-privacy.xyz/creativity/casting-and-streaming/obs-studio) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/obsproject/obs-studio)ㅤ
@@ -5339,25 +5255,20 @@ and is easily extendable via community plugins - **[icon Blender](https://www.blender.org)** - Free desktop 3D creation suite, with a wide range of tools for modeling, sculpting, texturing, rigging, animation, rendering, compositing, -motion tracking, and video editing. It's easily extendable via community plugins -[…](https://awesome-privacy.xyz/creativity/3d-graphics/blender "View full Blender report") +motion tracking, and video editing. It's easily extendable vi[…](https://awesome-privacy.xyz/creativity/3d-graphics/blender "View full Blender report") -
Stats - [![GitHub: blender/blender](https://img.shields.io/github/stars/blender/blender?style=flat&logo=github&label=blender&color=%235f53f4&cacheSeconds=3600)](https://github.com/blender/blender) [![Privacy Policy](https://shields.tosdr.org/en_8114.svg)](https://tosdr.org/en/service/8114) [![Blender on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blender)](https://awesome-privacy.xyz/creativity/3d-graphics/blender) -📦 Open Source 🛡️ Security Audited ˙ + [![GitHub: blender/blender](https://img.shields.io/github/stars/blender/blender?style=flat&logo=github&label=blender&color=%235f53f4&cacheSeconds=3600)](https://github.com/blender/blender) [![Privacy Policy](https://shields.tosdr.org/en_8114.svg)](https://tosdr.org/en/service/8114) [![Blender on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Blender)](https://awesome-privacy.xyz/creativity/3d-graphics/blender) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/blender/blender) ![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=&logoColor=white)ㅤ
- **[icon Wings3D](https://wings3d.com)** - A simple and easy-to-use subdivision 3D modeler with AutoUV facility for unfolding a models surface for painting/texturing. -Unlike Blender, it has no built-in animation capabilites, and it's feature set -is more limited, but it's a good choice for beginners. -[…](https://awesome-privacy.xyz/creativity/3d-graphics/wings3d "View full Wings3D report") +Unlike Blender, it has no built-in animation capabilites, and it's feature s[…](https://awesome-privacy.xyz/creativity/3d-graphics/wings3d "View full Wings3D report") -
Stats - [![GitHub: dgud/wings](https://img.shields.io/github/stars/dgud/wings?style=flat&logo=github&label=wings&color=%235f53f4&cacheSeconds=3600)](https://github.com/dgud/wings) [![Wings3D on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Wings3D)](https://awesome-privacy.xyz/creativity/3d-graphics/wings3d) -˙ + [![GitHub: dgud/wings](https://img.shields.io/github/stars/dgud/wings?style=flat&logo=github&label=wings&color=%235f53f4&cacheSeconds=3600)](https://github.com/dgud/wings) [![Wings3D on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Wings3D)](https://awesome-privacy.xyz/creativity/3d-graphics/wings3d)ㅤ
@@ -5367,12 +5278,11 @@ is more limited, but it's a good choice for beginners. ### Animation -- **[icon Aseprite](https://www.aseprite.org/)** - An animated sprite editor & pixel art tool for Windows, macOS and Linux.[…](https://awesome-privacy.xyz/creativity/animation/aseprite "View full Aseprite report") +- **[icon Aseprite](https://www.aseprite.org/)** - An animated sprite editor & pixel art tool for Windows, macOS and Linux. -
Stats - [![GitHub: https://github.com/aseprite/aseprite](https://img.shields.io/github/stars/https://github.com/aseprite/aseprite?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/aseprite/aseprite) [![Aseprite on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aseprite)](https://awesome-privacy.xyz/creativity/animation/aseprite) -📦 Open Source ˙ + [![GitHub: https://github.com/aseprite/aseprite](https://img.shields.io/github/stars/https://github.com/aseprite/aseprite?style=flat&logo=github&label=&color=%235f53f4&cacheSeconds=3600)](https://github.com/https://github.com/aseprite/aseprite) [![Aseprite on Awesome Privacy](https://img.shields.io/badge/View%20Report-FC60A8?style=flat&logo=awesomelists&label=Aseprite)](https://awesome-privacy.xyz/creativity/animation/aseprite) [![Open Source](https://img.shields.io/badge/-Open_Source-3DA639?style=flat&logo=opensourceinitiative&logoColor=white)](https://github.com/https://github.com/aseprite/aseprite)ㅤ
@@ -5569,6 +5479,13 @@ Huge thanks to the following sponsors, for their ongoing support 💖 HeliXZz + + + Zero-Tail +
+ ZeroTail +
+ undefined @@ -5576,13 +5493,6 @@ Huge thanks to the following sponsors, for their ongoing support 💖 Undefined - - - OlliVHH -
- HamburgerJung -
- frankdez93 @@ -5607,17 +5517,31 @@ Huge thanks to the following sponsors, for their ongoing support 💖 - LambdaTest-Inc + LambdaTest-Inc
LambdaTest
+ + + hesreallyhim +
+ Really Him +
+ gl0bal01
Fab 💖 ↀ◡ↀ
+ + + + clj00321 +
+ Christian Løvgren Jensen +
@@ -5706,20 +5630,20 @@ This project exists thanks to all the people who've helped build and maintain it Kerbless - - - ksharizard -
- Kshamendra -
- - titanism
Titanism
+ + + + + ksharizard +
+ Kshamendra +
@@ -5771,6 +5695,13 @@ This project exists thanks to all the people who've helped build and maintain it Ash Scott + + + edent +
+ Terence Eden +
+ tschlotfeldt @@ -5791,15 +5722,15 @@ This project exists thanks to all the people who've helped build and maintain it
Ward
- + + Wesley-Ryan
Wesley-Ryan
- - + thezacharytaylor @@ -5834,13 +5765,6 @@ This project exists thanks to all the people who've helped build and maintain it
Cole
- - - - jxhn -
- Jxhn -
diff --git a/.github/workflows/check-domain.yml b/.github/workflows/check-domain.yml deleted file mode 100644 index 542dc77..0000000 --- a/.github/workflows/check-domain.yml +++ /dev/null @@ -1,42 +0,0 @@ -# Checks domain and SSL status, then raises an issue if either is expiring soon -name: 🌎 Check Domain Expiry -on: - workflow_dispatch: - schedule: - - cron: '0 5 * * 6' # Every Saturday morning. -jobs: - check-domain: - runs-on: ubuntu-latest - name: Check domain - strategy: - matrix: - domain: - - https://awesome-privacy.xyz - steps: - - name: Check domain SSL and registry expire date - id: check-domain - uses: codex-team/action-check-domain@v1 - with: - url: ${{ matrix.domain }} - - name: Raise issue if domain expiring soon - if: ${{ steps.check-domain.outputs.paid-till-days-left && steps.check-domain.outputs.paid-till-days-left < 30 }} - uses: rishabhgupta/git-action-issue@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - assignees: Lissy93 - title: '[WEBSITE] Domain Expiring Soon' - body: > - **Priority Notice** - Domain, ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.paid-till-days-left }} days. - @Lissy93 - Please take action immediately to prevent any downtime - - name: Raise issue if SSL Cert expiring soon - if: ${{ steps.check-domain.outputs.ssl-expire-days-left && steps.check-domain.outputs.ssl-expire-days-left < 14 }} - uses: rishabhgupta/git-action-issue@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - assignees: Lissy93 - title: '[WEBSITE] SSL Cert Expiring Soon' - body: > - **Priority Notice** - The SSL Certificate for ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.ssl-expire-days-left }} days, on ${{ steps.check-domain.outputs.ssl-expire-date }}. - @Lissy93 - Please take action immediately to prevent any downtime diff --git a/.github/workflows/compile-pdf.yml b/.github/workflows/compile-pdf.yml deleted file mode 100644 index 81b202d..0000000 --- a/.github/workflows/compile-pdf.yml +++ /dev/null @@ -1,44 +0,0 @@ -# Generates and saved a PDF document from the main markdown file -# Easier to read on certain devices, or for users with accesibility needs - -name: 📁 Compile PDF Document -on: - workflow_dispatch: # Manual dispatch - schedule: - - cron: '0 5 * * 6' # Every Saturday morning. -jobs: - # Job #1 - Generate an embedded SVG asset, showing all contributors - compile-pdf: - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 - - name: Make PDF 📄 - uses: baileyjm02/markdown-to-pdf@v1.1.0 - with: - input_dir: . - output_dir: .github/assets/ - build_pdf: true - build_html: false - table_of_contents: false - - name: Upload Artifact 📤 - uses: actions/upload-artifact@v3 - with: - name: awesome-privacy-pdf - path: .github/assets/README.pdf - - name: Commit file ✅ - run: | - git config --local user.email "alicia-gh-bot@mail.as93.net" - git config --local user.name "liss-bot" - git add .github/assets/*.pdf - if ! git diff-index --quiet HEAD; then - git commit -m "Generate PDF file" - else - echo "Nothing to do" - fi - - name: Push changes ➡️ - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - branch: ${{ github.ref }} - diff --git a/.github/workflows/credits.yml b/.github/workflows/credits.yml deleted file mode 100644 index 84aad69..0000000 --- a/.github/workflows/credits.yml +++ /dev/null @@ -1,34 +0,0 @@ -# Inserts list of contributors and community members into ./docs/credits.md -name: 📊 Generate Contributor Credits -on: - workflow_dispatch: # Manual dispatch - schedule: - - cron: '0 5 * * 6' # Every Saturday morning. -jobs: - # Job #1 - Inserts sponsors into README - insert-sponsors: - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 - - name: Generate Sponsors in Credits 💖 - uses: JamesIves/github-sponsors-readme-action@1.0.5 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - file: '.github/README.md' - # Job #2 - Inserts contributors into README - insert-credits: - runs-on: ubuntu-latest - name: Inserts contributors into credits.md - steps: - - name: Contribute List - Credits Page - uses: akhilmhdh/contributors-readme-action@v2.2 - env: - GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - with: - image_size: 80 - readme_path: .github/README.md - columns_per_row: 6 - commit_message: 'Updates contributors list' - committer_username: liss-bot - committer_email: liss-bot@d0h.co diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml new file mode 100644 index 0000000..c7c0a62 --- /dev/null +++ b/.github/workflows/mirror.yml @@ -0,0 +1,16 @@ +# Syncs repo to the Codeberg mirror +name: 🪞 Mirror +on: + schedule: [{ cron: '0 5 * * 0' }] + push: { tags: ['v*'] } + workflow_dispatch: +jobs: + mirror: + runs-on: ubuntu-latest + steps: + - uses: lissy93/repo-mirror-action@main + with: + ssh_key: ${{ secrets.CODEBERG_SSH }} + host: git@codeberg.org + user: alicia + repo: awesome-privacy diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml new file mode 100644 index 0000000..de9394d --- /dev/null +++ b/.github/workflows/pr-check.yml @@ -0,0 +1,166 @@ +name: PR Check + +on: + pull_request: + branches: [main] + types: [opened, edited, synchronize, reopened] + paths: + - 'awesome-privacy.yml' + - '.github/README.md' + +permissions: + contents: read + pull-requests: read + +jobs: + pr-compliance: + name: PR Compliance + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: git fetch --depth=1 origin ${{ github.event.pull_request.base.sha }} + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Check README edits + id: readme + continue-on-error: true + run: python lib/checks/check-readme-edits.py --base-ref ${{ github.event.pull_request.base.sha }} + - name: Check PR metadata + id: meta + env: + PR_TITLE: ${{ github.event.pull_request.title }} + PR_BODY: ${{ github.event.pull_request.body }} + PR_DRAFT: ${{ github.event.pull_request.draft }} + BASE_REF: ${{ github.event.pull_request.base.sha }} + README_FAILED: ${{ steps.readme.outcome == 'failure' && 'true' || 'false' }} + run: python lib/checks/check-pr-meta.py + - name: Upload findings + if: always() + uses: actions/upload-artifact@v4 + with: + name: findings-compliance + path: /tmp/findings-compliance.json + if-no-files-found: ignore + - name: Fail if critical + if: steps.readme.outcome == 'failure' || steps.meta.outcome == 'failure' + run: exit 1 + + data-validation: + name: Data Validation + runs-on: ubuntu-latest + outputs: + yaml_changed: ${{ steps.changes.outputs.yaml_changed }} + steps: + - uses: actions/checkout@v4 + - run: git fetch --depth=1 origin ${{ github.event.pull_request.base.sha }} + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Detect changes + id: changes + run: python lib/checks/detect-changes.py --base-ref ${{ github.event.pull_request.base.sha }} + - name: Install dependencies + if: steps.changes.outputs.yaml_changed == 'true' + run: pip install -q -r lib/requirements.txt + - name: Schema validation + if: steps.changes.outputs.yaml_changed == 'true' + id: schema + continue-on-error: true + run: make validate + - name: YAML diff + if: steps.changes.outputs.yaml_changed == 'true' + id: diff + continue-on-error: true + run: python lib/checks/check-yaml-diff.py --base-ref ${{ github.event.pull_request.base.sha }} + - name: Check additions + if: steps.changes.outputs.yaml_changed == 'true' + env: + SCHEMA_OUTCOME: ${{ steps.schema.outcome }} + run: python lib/checks/check-additions.py + - name: Upload diff data + if: always() + uses: actions/upload-artifact@v4 + with: + name: pr-diff + path: | + /tmp/pr-diff.json + /tmp/pr-diff-summary.md + if-no-files-found: ignore + - name: Upload findings + if: always() + uses: actions/upload-artifact@v4 + with: + name: findings-data + path: /tmp/findings-data.json + if-no-files-found: ignore + - name: Fail if critical + if: steps.changes.outputs.yaml_changed == 'true' && (steps.schema.outcome == 'failure' || steps.diff.outcome == 'failure') + run: exit 1 + + submission-eligibility: + name: Submission Eligibility + needs: data-validation + if: "!cancelled() && needs.data-validation.outputs.yaml_changed == 'true'" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install -q -r lib/requirements.txt + - name: Download diff data + uses: actions/download-artifact@v4 + with: + name: pr-diff + path: /tmp + continue-on-error: true + - name: Check project health + env: + PR_USER: ${{ github.event.pull_request.user.login }} + PR_BODY: ${{ github.event.pull_request.body }} + GITHUB_TOKEN: ${{ github.token }} + run: python lib/checks/check-project.py + - name: Upload findings + if: always() + uses: actions/upload-artifact@v4 + with: + name: findings-project + path: /tmp/findings-project.json + if-no-files-found: ignore + + summary: + name: Summary + if: always() + needs: [pr-compliance, data-validation, submission-eligibility] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Download all findings + uses: actions/download-artifact@v4 + with: + pattern: findings-* + path: /tmp/artifacts + merge-multiple: true + continue-on-error: true + - name: Download diff data + uses: actions/download-artifact@v4 + with: + name: pr-diff + path: /tmp/artifacts + continue-on-error: true + - name: Format comment + env: + PR_USER: ${{ github.event.pull_request.user.login }} + PR_NUMBER: ${{ github.event.pull_request.number }} + RUN_ID: ${{ github.run_id }} + run: python lib/checks/format-comment.py + - name: Upload PR metadata + if: always() + uses: actions/upload-artifact@v4 + with: + name: pr-meta + path: /tmp/pr-meta/ diff --git a/.github/workflows/pr-comment.yml b/.github/workflows/pr-comment.yml new file mode 100644 index 0000000..bbfb86e --- /dev/null +++ b/.github/workflows/pr-comment.yml @@ -0,0 +1,221 @@ +name: PR Comment + +on: + workflow_run: + workflows: ["PR Check"] + types: [completed] + pull_request_review: + types: [submitted] + +permissions: + actions: read + checks: read + contents: read + pull-requests: write + +jobs: + comment: + name: Post PR comment + runs-on: ubuntu-latest + if: github.event.workflow_run.event == 'pull_request' + + steps: + - uses: actions/checkout@v4 + + - name: Download PR metadata + id: download + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: pr-meta + path: pr-meta + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Resolve PR context + id: context + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + + // Determine the PR number + let prNumber; + const numberFile = 'pr-meta/number.txt'; + if (fs.existsSync(numberFile)) { + prNumber = parseInt(fs.readFileSync(numberFile, 'utf8').trim()); + } + if (!prNumber) { + const prs = context.payload.workflow_run.pull_requests; + if (prs && prs.length > 0) { + prNumber = prs[0].number; + } else { + const headSha = context.payload.workflow_run.head_sha; + const { data: prList } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + sort: 'updated', + direction: 'desc', + per_page: 100, + }); + const match = prList.find(pr => pr.head.sha === headSha); + if (!match) { + console.log(`No open PR found for SHA ${headSha} — skipping.`); + return; + } + prNumber = match.number; + } + } + + // Fetch existing bot comment (if any) and write to file for Python + const marker = ''; + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + per_page: 100, + }); + const existing = comments.find(c => c.body.includes(marker)); + if (existing) { + fs.mkdirSync('pr-meta', { recursive: true }); + fs.writeFileSync('pr-meta/existing-comment.md', existing.body); + fs.writeFileSync('pr-meta/existing-comment-id.txt', String(existing.id)); + } + + core.setOutput('pr_number', prNumber); + + - name: Prepare comment + if: steps.context.outputs.pr_number + env: + CHECK_RUN_ID: ${{ github.event.workflow_run.id }} + GITHUB_REPOSITORY: ${{ github.repository }} + run: python lib/checks/prepare-comment.py + + - name: Post or update comment + if: steps.context.outputs.pr_number + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const actionFile = 'pr-meta/action.txt'; + if (!fs.existsSync(actionFile)) return; + + const action = fs.readFileSync(actionFile, 'utf8').trim(); + if (action === 'skip') { + console.log('Nothing to do — skipping.'); + return; + } + + const bodyFile = 'pr-meta/final-comment.md'; + if (!fs.existsSync(bodyFile)) { + console.log('No comment body found — skipping.'); + return; + } + const body = fs.readFileSync(bodyFile, 'utf8').trim(); + const prNumber = parseInt('${{ steps.context.outputs.pr_number }}'); + + if (action === 'create') { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body, + }); + console.log('Created bot comment.'); + } else if (action === 'update') { + const commentId = parseInt(fs.readFileSync('pr-meta/existing-comment-id.txt', 'utf8').trim()); + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: commentId, + body, + }); + console.log('Updated bot comment.'); + } + + review-notify: + name: Notify maintainer + runs-on: ubuntu-latest + if: github.event_name == 'pull_request_review' + + steps: + - uses: actions/checkout@v4 + + - name: Fetch review and CI context + id: context + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const pr = context.payload.pull_request; + const { owner, repo } = context.repo; + + // Fetch reviews — extract user login and state + const { data: reviews } = await github.rest.pulls.listReviews({ + owner, repo, pull_number: pr.number, per_page: 100, + }); + const reviewData = reviews.map(r => ({ + user: r.user.login, + state: r.state, + })); + + // Fetch check runs for the PR head SHA + const { data: { check_runs } } = await github.rest.checks.listForRef({ + owner, repo, ref: pr.head.sha, per_page: 100, + }); + const checkData = check_runs.map(cr => ({ + status: cr.status, + conclusion: cr.conclusion, + })); + + // Check if we already posted the notification + const marker = ''; + const { data: comments } = await github.rest.issues.listComments({ + owner, repo, issue_number: pr.number, per_page: 100, + }); + const alreadyNotified = comments.some(c => c.body.includes(marker)); + + // Write data for Python + fs.mkdirSync('pr-meta', { recursive: true }); + fs.writeFileSync('pr-meta/reviews.json', JSON.stringify(reviewData)); + fs.writeFileSync('pr-meta/check-runs.json', JSON.stringify(checkData)); + fs.writeFileSync('pr-meta/already-notified.txt', String(alreadyNotified)); + + core.setOutput('pr_number', pr.number); + + - name: Check review readiness + run: python lib/checks/check-review-ready.py + + - name: Post notification + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const actionFile = 'pr-meta/action.txt'; + if (!fs.existsSync(actionFile)) return; + + const action = fs.readFileSync(actionFile, 'utf8').trim(); + if (action !== 'notify') { + console.log('Not ready for review — skipping.'); + return; + } + + const body = [ + '', + 'This PR is now ready to be merged, pending maintainer review. All checks are passing and it has been peer-reviewed.', + '', + '@Lissy93 - Please evaluate, and either merge or leave feedback.', + ].join('\n'); + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: parseInt('${{ steps.context.outputs.pr_number }}'), + body, + }); + console.log('Posted maintainer notification.'); diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml deleted file mode 100644 index 761e606..0000000 --- a/.github/workflows/pr-labeler.yml +++ /dev/null @@ -1,25 +0,0 @@ -# Applies labels based on the pull request category -name: 🏷️ PR Labeler -on: - pull_request: - types: [opened, edited] -jobs: - label-pr: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Apply Labels - if: "! contains(github.event.pull_request.body, 'Addition / Amendment / Removal / Spelling or Grammar / Website Update / Misc')" - uses: Naturalclar/issue-action@v2.0.2 - with: - title-or-body: both - github-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - parameters: > - [ - {"keywords": ["Addition"], "labels": ["Addition"] }, - {"keywords": ["Amendment"], "labels": ["Amendment"] }, - {"keywords": ["Removal"], "labels": ["Removal"] }, - {"keywords": ["Spelling or Grammar"], "labels": ["Grammar"] }, - {"keywords": ["Website Update"], "labels": ["Website"] }, - {"keywords": ["Misc"], "labels": ["Misc"] } - ] diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml deleted file mode 100644 index 9ddb46d..0000000 --- a/.github/workflows/spell-check.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Spell check newly added content, when PR opened and, put typo list as comment -name: ✏️ Spell Check -on: [pull_request] -jobs: - misspell: - name: runner / misspell - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 - - name: Run Spell Check 📝 - uses: reviewdog/action-misspell@v1 - with: - github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - locale: US - level: info - reporter: github-pr-review - path: . - filter_mode: added - fail_on_error: false diff --git a/.github/workflows/sync-mirror.yml b/.github/workflows/sync-mirror.yml deleted file mode 100644 index 672ab86..0000000 --- a/.github/workflows/sync-mirror.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Pushes the contents of the repo to the Codeberg mirror -name: 🪞 Mirror to Codeberg -on: - workflow_dispatch: # Manual dispatch - schedule: - - cron: '0 5 * * 6' -jobs: - codeberg: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - uses: pixta-dev/repository-mirroring-action@v1 - with: - target_repo_url: "git@codeberg.org:alicia/awesome-privacy.git" - ssh_private_key: ${{ secrets.CODEBERG_SSH }} diff --git a/.github/workflows/ticket-check.yml b/.github/workflows/ticket-check.yml deleted file mode 100644 index 12759a3..0000000 --- a/.github/workflows/ticket-check.yml +++ /dev/null @@ -1,40 +0,0 @@ -# Checks newly opened issues contain enough info, and follow the required format -name: 🎫 Issue Validator -on: - issues: - types: [opened, edited] -jobs: - check-title: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Check Default Title - if: "endsWith(github.event.issue.title, '')" - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.issue.number }} - body: | - Please ensure that your ticket has an appropriate title - - name: Check Title Contains Categroy - if: "!(startsWith(github.event.issue.title, '[') && contains(github.event.issue.title, ']'))" - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.issue.number }} - body: | - Please ensure that your ticket's title is preceded with a category. - For example, `[ADDITION]`, `[AMENDMENT]`, `[REMOVAL]` or `[QUESTION]`. - - name: Check Quality Checklist - if: "contains(github.event.issue.body, '[ ]') || !(contains(github.event.issue.body, '[X]') || contains(github.event.issue.body, '[x]'))" - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.issue.number }} - body: | - Please ensure that you've followed the issue template fully. - It's important that you complete the quality & transparency checklist. - - - - diff --git a/.github/workflows/validate-pr.yml b/.github/workflows/validate-pr.yml deleted file mode 100644 index 743cff5..0000000 --- a/.github/workflows/validate-pr.yml +++ /dev/null @@ -1,90 +0,0 @@ -# Checks that PR title conform to contributing standards (or at least !== Update README.md) -name: ⛳ Validate PR -on: - pull_request: - types: [opened, edited, synchronize, reopened] - -permissions: - pull-requests: write - -env: - BASE_MSG: >+ - Thanks for contributing to Awesome-Privacy! Your pull request will be reviewed shortly. - - In the meantime, please be sure that you have read, and complied with the guidelines outlined in the - [Contributing Docs](https://github.com/Lissy93/awesome-privacy/blob/main/.github/CONTRIBUTING.md). - -jobs: - validate: - runs-on: ubuntu-latest - steps: - - name: Validate Title is not Default - if: "contains(github.event.pull_request.title, 'Update README.md')" - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Hi @${{ github.actor }}, - Please update your pull request, to include a more descriptive title. - - - name: Validate Checklist is Completed - if: > - contains(github.event.pull_request.body, '[ ]') || - !(contains(github.event.pull_request.body, '[X]') || contains(github.event.pull_request.body, '[x]')) - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Hello @${{ github.actor }} 👋 - ${{ env.BASE_MSG }} - ⚠️ It looks like you've not complete the quality and transparency checklist. - - - name: Validate Affiliation Section is Present - if: > - !contains(github.event.pull_request.body, 'Affiliation') - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Hello @${{ github.actor }} 👋 - ${{ env.BASE_MSG }} - ⚠️ You must indicate if you are affiliated with any software modified by this PR. - If not applicable, you may set this field to N/A. - - - name: Validate Category - if: > - contains(github.event.pull_request.body, 'Addition / Amendment / Removal / Spelling or Grammar / Website Update / Misc') || - !( - contains(github.event.pull_request.body, 'Addition') || - contains(github.event.pull_request.body, 'Amendment') || - contains(github.event.pull_request.body, 'Removal') || - contains(github.event.pull_request.body, 'Spelling or Grammar') || - contains(github.event.pull_request.body, 'Website Update') || - contains(github.event.pull_request.body, 'Misc') - ) - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Hello @${{ github.actor }} 👋 - ${{ env.BASE_MSG }} - ⚠️ You must specify a category - Either: `Addition`, `Amendment`, `Removal`, `Spelling or Grammar`, `Website Update`, or `Misc`. - - - name: Validate Supporting Material is Present - if: > - !contains(github.event.pull_request.body, 'Supporting Material') - uses: peter-evans/create-or-update-comment@v2 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Hello @${{ github.actor }} 👋 - ${{ env.BASE_MSG }} - ⚠️ If applicable, please ensure you've provided supporting material. - - diff --git a/.github/workflows/web-checks.yml b/.github/workflows/web-checks.yml new file mode 100644 index 0000000..0736816 --- /dev/null +++ b/.github/workflows/web-checks.yml @@ -0,0 +1,96 @@ +name: Web Checks + +on: + pull_request: + paths: ['web/**'] + workflow_dispatch: + +permissions: + contents: read + +jobs: + lint: + name: 🧼 Lint + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: web/.nvmrc + cache: yarn + cache-dependency-path: web/yarn.lock + - run: yarn install --frozen-lockfile + - run: yarn lint + + format: + name: 💅 Format + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: web/.nvmrc + cache: yarn + cache-dependency-path: web/yarn.lock + - run: yarn install --frozen-lockfile + - run: yarn format:check + + typecheck: + name: 🧩 Typecheck + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: web/.nvmrc + cache: yarn + cache-dependency-path: web/yarn.lock + - run: yarn install --frozen-lockfile + - run: yarn typecheck + + test: + name: 🧪 Test + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: web/.nvmrc + cache: yarn + cache-dependency-path: web/yarn.lock + - run: yarn install --frozen-lockfile + - run: yarn test + + summary: + name: 💬 Summary + if: always() + needs: [lint, format, typecheck, test] + runs-on: ubuntu-latest + steps: + - name: Build results table + run: | + em() { if [ "$1" = "success" ]; then echo "pass ✅"; else echo "FAIL ❌"; fi; } + line() { echo "| $1 | \`$2\` | $(em "$3") |"; } + + { + echo "## Web Checks Summary" + echo "" + echo "| Check | Command | Result |" + echo "|-------|---------|--------|" + line "Lint" "yarn lint" "${{ needs.lint.result }}" + line "Format" "yarn format:check" "${{ needs.format.result }}" + line "Typecheck" "yarn typecheck" "${{ needs.typecheck.result }}" + line "Test" "yarn test" "${{ needs.test.result }}" + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/welcome-non-stargazers.yml b/.github/workflows/welcome-non-stargazers.yml deleted file mode 100644 index 57091ec..0000000 --- a/.github/workflows/welcome-non-stargazers.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: ⭐ Hello non-Stargazers -on: - issues: - types: [opened] -jobs: - check-user: - if: ${{ github.event.comment.author_association != 'CONTRIBUTOR' }} - runs-on: ubuntu-latest - name: Add comment to issues opened by non-stargazers - steps: - - name: comment - uses: qxip/please-star-light@v4 - with: - token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} - autoclose: false - message: | - If you're enjoying Awesome-Privacy, consider dropping us a ⭐<br> - _<sub>🤖 I'm a bot, and this message was automated</sub>_ diff --git a/Makefile b/Makefile index d22402a..d773886 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ WEB_DIR := web # Targets for lib/ install_lib_deps: - $(PYTHON) -m pip install -r $(LIB_DIR)/requirements.txt + $(PYTHON) -m pip install -q -r $(LIB_DIR)/requirements.txt gen_readme: install_lib_deps $(PYTHON) $(LIB_DIR)/awesome-privacy-readme-gen.py diff --git a/awesome-privacy.yml b/awesome-privacy.yml index 3827bd7..5ea4e5e 100644 --- a/awesome-privacy.yml +++ b/awesome-privacy.yml @@ -135,7 +135,7 @@ categories: Free for self-hosted data (or $3/ month hosted). Be aware that 1Password is not fully open source, but they do regularly publish results of their independent [security audits](https://support.1password.com/security-assessments), - and they have a solid reputation for transparently disclosing and fixing vulnerabilities + and they have a solid reputation for transparently disclosing and fixing vulnerabilities furtherInfo: > **Other Open Source PM**: [Buttercup](https://buttercup.pw), [Clipperz](https://clipperz.is), [Pass](https://www.passwordstore.org), [Padloc](https://padloc.app), [TeamPass](https://teampass.net), @@ -252,11 +252,39 @@ categories: iosApp: https://apps.apple.com/us/app/ente-auth/id6444121398 androidApp: io.ente.auth description: | - Ente Auth is a free and open-source app which stores and generates TOTP tokens. - It can be used with an online account to backup and sync your tokens across your - devices (and access them via a web interface) in a secure, end-to-end encrypted + Ente Auth is a free and open-source app which stores and generates TOTP tokens. + It can be used with an online account to backup and sync your tokens across your + devices (and access them via a web interface) in a secure, end-to-end encrypted fashion. It can also be used offline on a single device with no account necessary. + - name: Bitwarden Authenticator + url: https://bitwarden.com/products/authenticator/ + icon: https://avatars.githubusercontent.com/u/15990069 + openSource: true + github: bitwarden/ios + tosdrId: 5256 + iosApp: https://apps.apple.com/app/bitwarden-authenticator/id6497335175 + androidApp: com.bitwarden.authenticator + description: | + Bitwarden Authenticator is a free and open-source app which stores and generates + time-based codes for multi-factor authentication. It can be used with an online + account to backup and sync your tokens across your devices (and access them via + a web interface) in a secure, end-to-end encrypted fashion. It can also be used + offline on a single device with no account necessary. + + - name: Proton Authenticator + url: https://proton.me/authenticator + icon: https://raw.githubusercontent.com/protonpass/android-pass/refs/heads/main/metadata/en-US/images/icon.png + openSource: true + github: protonpass/android-authenticator + tosdrId: 491 + iosApp: https://apps.apple.com/us/app/proton-authenticator/id6741758667 + androidApp: proton.android.authenticator + description: | + Proton Authenticator is free, open source, and available for both iOS and Android. + A Proton account is required to use Proton Authenticator. + Existing 2FA codes can be imported from other popular apps such as Google Authenticator and LastPass. + furtherInfo: > Check which websites support multi-factor authentication: [2fa.directory](https://2fa.directory/) notableMentions: > @@ -265,7 +293,7 @@ categories: [Etopa](https://play.google.com/store/apps/details?id=de.ltheinrich.etopa) *(Android)*<br> For KeePass users, [TrayTop](https://keepass.info/plugins.html#traytotp) is a plugin for managing TOTP's - offline and compatible with Windows, Mac and Linux. - + ############################# ###### File Encryption ###### ############################# @@ -309,9 +337,10 @@ categories: - name: Picocrypt github: Picocrypt/Picocrypt icon: https://avatars.githubusercontent.com/u/171401041 + url: '' description: | Picocrypt is a very small (hence Pico), very simple, yet very secure encryption tools - that you can use to protect your files. It's designed to be the go-to tool for encryption, + that you can use to protect your files. It's designed to be the go-to tool for encryption, with a focus on security, simplicity, and reliability. wordOfWarning: > @@ -393,7 +422,7 @@ categories: Brave also has Tor built-in, when you open up a private tab/ window. - name: Firefox - url: https://www.mozilla.org/firefox + url: https://www.firefox.com/ icon: https://www.mozilla.org/media/protocol/img/logos/firefox/logo.fedb52c912d6.svg openSource: true tosdrId: 188 @@ -440,7 +469,7 @@ categories: After installing, check the privacy & security settings, and update the configuration to something that you are comfortable with. 12Bytes maintains a comprehensive guide on [Firefox Configuration for Privacy and Performance](https://codeberg.org/12bytes/firefox-config-guide) - + ############################ ###### Search Engines ###### ############################ @@ -511,6 +540,17 @@ categories: description: | British search engine providing independent and unbiased search results using its own crawler. Has a zero tracking policy (it is not open source) + + - name: Uruky + url: https://uruky.com + icon: https://uruky.com/public/images/favicon.svg + iosApp: https://apps.apple.com/us/app/uruky-private-ad-free-search/id6758864380 + description: | + Uruky is an ad-free, private search engine focused on personalization. It uses, + among other providers, Mojeek and Marginalia. It is EU-based and does not keep + or track any personal data (it is not 100% open source, but after 12 months as + a paying customer, you get a copy of the source code). + notableMentions: - name: MetaGear url: https://metager.org @@ -524,8 +564,8 @@ categories: and self-hostable, although using a [public instance](https://searx.space) has the benefit of not singling out your queries to the engines used. A fork of the original [Searx](https://searx.github.io/searx/). - - + + - name: Communication sections: ################################# @@ -581,10 +621,10 @@ categories: subreddit: SimpleXChat description: | Simplex is gaining popularity as a secure and private messaging app renowned - for its robust encryption protocol without user IDs or phone numbers and this improves your privacy. + for its robust encryption protocol without user IDs or phone numbers and this improves your privacy. Simplex offers instant messaging, supports media attachments and voice and video calls. - Additionally, it is cross-platform, open-source, and completely free, aligning with the modern user's - preferences for convenience, security, and accessibility. + Additionally, it is cross-platform, open-source, and completely free, aligning with the modern user's + preferences for convenience, security, and accessibility. Learn more about the [Security Policy](https://simplex.chat/security/). - name: XMPP @@ -615,7 +655,7 @@ categories: an open specification and Simple pragmatic RESTful HTTP/JSON API it makes it easy to integrates with existing 3rd party IDs to authenticate and discover users, as well as to build apps on top of it. - notableMentions: + notableMentions: - name: Chat Secure url: https://chatsecure.org - name: KeyBase @@ -649,7 +689,7 @@ categories: be used to communicate any sensitive data. [Wire](https://wire.com/) has also been removed, due to a [recent acquisition](https://blog.privacytools.io/delisting-wire/) - + ########################### ###### P2P Messaging ###### ########################### @@ -724,7 +764,7 @@ categories: url: https://github.com/Bitmessage/PyBitmessage - name: RetroShare url: https://retroshare.cc - + ############################# ###### Encrypted Email ###### ############################# @@ -792,11 +832,11 @@ categories: custom domains (starting at $3/month). Tuta [does not use OpenPGP](https://tuta.com/blog/posts/differences-email-encryption/) like other encrypted mail providers, instead they use a standardized, hybrid method - consisting of symmetrical and asymmetrical algorithms (with AES256, and RSA 2048 + consisting of symmetrical and asymmetrical algorithms (with AES256, and RSA 2048 or ECC (x25519) and Kyber-1024). This causes compatibility issues when communicating with contacts using PGP. But it does allow them to encrypt much more of the header data (body, attachments, subject lines, and sender names etc) which PGP mail providers cannot do. The recent upgrades - to Tuta's encryption algorithm makes data stored and sent with their service safe against attacks + to Tuta's encryption algorithm makes data stored and sent with their service safe against attacks posed by quantum computers. - name: Mailfence url: https://mailfence.com?src=digitald @@ -1104,7 +1144,7 @@ categories: url: https://www.smspool.net icon: https://i.ibb.co/2t4MBFj/apple-touch-icon.png description: | - Don't feel comfortable giving out your phone number? Protect your online identity by using our one-time-use non-VoIP phone numbers. + Don't feel comfortable giving out your phone number? Protect your online identity by using our one-time-use non-VoIP phone numbers. We support over 50+ countries and support over 300+ services. androidApp: com.smspool.app iosApp: https://apps.apple.com/app/smspool/id6474617801 @@ -1462,7 +1502,7 @@ categories: Displays a country flag depicting the location of the current website's server, which can be useful to know at a glance. Click icon for more tools such as site safety checks, whois, validation etc **Download**: [Firefox](https://addons.mozilla.org/en-US/firefox/addon/flagfox/) - + - name: Lightbeam url: https://mozilla.github.io/lightbeam/ github: mozilla/lightbeam-we @@ -1533,7 +1573,7 @@ categories: url: https://addons.mozilla.org/en-US/firefox/addon/crxviewer description: > A handy extension for viewing the source code of another browser extension, - which is a useful tool for verifying the code does what it says + which is a useful tool for verifying the code does what it says wordOfWarning: | - Having many extensions installed raises entropy, causing your fingerprint to be more unique, hence making tracking easier. - Much of the functionality of the above addons can be applied without installing anything, by configuring browser settings yourself. For Firefox this is done in the user.js @@ -2053,7 +2093,7 @@ categories: See [Streisand](https://github.com/StreisandEffect/streisand), to learn more, and get started with running a VPN. [Digital Ocean](https://m.do.co/c/3838338e7f79) provides flexible, secure and easy Linux VMs, (from $0.007/hour or $5/month), - Here is a [1-click install script](http://dovpn.carlfriess.com/)for + Here is a [1-click install script](http://dovpn.carlfriess.com/)for on [Digital Ocean](https://m.do.co/c/3838338e7f79), by Carl Friess. Recently distributed self-hosted solutions for running your own VPNs have @@ -2213,8 +2253,8 @@ categories: Tor, I2P and Freenet are all anonymity networks - but they work very differently and each is good for specific purposes. So a good and viable solution would be to use all of them, for different tasks. *You can read more about how I2P compares to Tor, [here](https://blokt.com/guides/what-is-i2p-vs-tor-browser)* - - + + ##################### ###### Proxies ###### ##################### @@ -2333,7 +2373,7 @@ categories: Mullvads public DNS with QNAME minimization and basic ad blocking. It has been audited by the security experts at Assured. You can use this privacy-enhancing service even if you don't use Mullvad. - + ######################### ###### DNS Clients ###### ######################### @@ -2653,7 +2693,7 @@ categories: Some VPNs have ad-tracking blocking features, such as [TrackStop with PerfectPrivacy](https://www.perfect-privacy.com/en/features/trackstop?a_aid=securitychecklist). - + [Private Internet Access](https://www.privateinternetaccess.com/), [CyberGhost](https://www.cyberghostvpn.com/), [PureVPN](https://www.anrdoezrs.net/click-9242873-13842740), @@ -2892,7 +2932,7 @@ categories: [5 eyes](https://en.wikipedia.org/wiki/Five_Eyes) (Australia, Canada, New Zealand, US and UK) and [other international cooperatives](https://en.wikipedia.org/wiki/Five_Eyes#Other_international_cooperatives) who have legal right to view your data. - + ############################### ###### Domain Registrars ###### ############################### @@ -2930,7 +2970,7 @@ categories: followWith: Web description: | Free DNS hosting provider designed with security in mind, and running - on purely open source software. deSEC is backed and funded by SSE. + on purely open source software. deSEC is backed and funded by SSE. ########################### @@ -3017,7 +3057,7 @@ categories: All notes are saved individually as .md files, making them easy to manage. No mobile app, built-in cloud-sync, encryption or web UI. But due to the structure of the files, it is easy to use your own cloud sync provider, and additional features are provided through extensions. - + - name: Joplin url: https://joplinapp.org github: laurent22/joplin @@ -3091,7 +3131,7 @@ categories: notableMentions: | If you are already tied into Evernote, One Note etc, then [SafeRoom](https://www.getsaferoom.com) - is a utility that encrypts your entire notebook, before it is uploaded to the cloud. + is a utility that encrypts your entire notebook, before it is uploaded to the cloud. [Org Mode](https://orgmode.org) is a mode for [GNU Emacs](https://www.gnu.org/software/emacs/) dedicated to working with the Org markup format. Org can be thought of as @@ -3151,6 +3191,17 @@ categories: A key benefit the wide range of plug-ins in the NextCloud App Store, maintained by the community. NextCloud was a hard fork off OwnCloud. + - name: bewCloud + url: https://bewcloud.com + icon: https://bewcloud.com/favicon.svg + followWith: Web + github: bewcloud/bewcloud + openSource: true + description: | + Modern and simpler alternative to Nextcloud/ownCloud crafted with TypeScript. + Unifies file management, sync, sharing, notes, RSS, expenses, calendars, + contacts, and photos, with MFA, WebDAV, CalDAV, CardDAV, SSO, and more. + notableMentions: | Alternatively, consider a headless utility such as [Duplicacy](https://duplicacy.com) or [Duplicity](http://duplicity.nongnu.org). @@ -3341,7 +3392,7 @@ categories: using [Web Torrent](https://webtorrent.io). For specifically transferring images, [Up1](https://github.com/Upload/Up1) is a good self-hosted option, with client-side encryption. - + Finally [PsiTransfer](https://github.com/psi-4ward/psitransfer) is a feature-rich, self-hosted file drop, using streams. @@ -3390,7 +3441,7 @@ categories: description: | Simple bookmark manager written in Go, intended to be a clone of Pocket, it has both a simple and clean web interface as well as a CLI. Shiori has easy import/ export, is portable and has webpage archiving features. - + notableMentions: | [Ymarks](https://ymarks.org) is a C-based self-hosted bookmark synchronization server and [Chrome](https://chrome.google.com/webstore/detail/ymarks/gefignhaigoigfjfbjjobmegihhaacfi) extension. @@ -3448,7 +3499,7 @@ categories: notableMentions: | [Apache OpenMeetings](https://openmeetings.apache.org) provides self-hosted video-conferencing, chat rooms, file server and tools for meetings. - + [together.brave.com](https://together.brave.com) is Brave's Jitsi Fork. For remote learning, [BigBlueButton](https://bigbluebutton.org) is self-hosted conference call software, @@ -3505,10 +3556,10 @@ categories: it is not open source, and although there is a free version, a license is required to access all features. VMWare performs very well when running on a server, with hundreds of hosts and users. - + For Mac users, [Parallels](https://www.parallels.com/uk/) is a popular option which performs really well, but again is not open source. - + For Windows users, there's [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v), which is a native Windows product, developed by Microsoft. @@ -3577,7 +3628,7 @@ categories: description: | iOS app for encrypting/ decrypting text. Has native keyboard integration, keychain support and app integrations which makes it quick to use in any app. - + - name: FlowCrypt url: https://flowcrypt.com @@ -3656,10 +3707,10 @@ categories: Alternatively, with [ImageMagic](https://imagemagick.org) installed, just run `convert -strip path/to/image.png` to remove all metadata. - + If you have [GIMP](https://www.gimp.org) installed, then just go to `File --> Export As --> Export --> Advanced Options --> Uncheck the "Save EXIF data" option`. - Often you need to perform meta data removal programmatically, as part of a script or automation process. + Often you need to perform meta data removal programmatically, as part of a script or automation process. - GoLang: [go-exif](https://github.com/dsoprea/go-exif) by @dsoprea - JS: [exifr](https://github.com/MikeKovarik/exifr) by @MikeKovarik - Python: [Piexif](https://github.com/hMatoba/Piexif) by @hMatoba @@ -3675,7 +3726,7 @@ categories: [not remove it](https://uk.norton.com/internetsecurity-privacy-is-my-personal-data-really-gone-when-its-deleted-from-a-device.html) from the disk, and recovering deleted files is a [simple task](https://www.lifewire.com/how-to-recover-deleted-files-2622870). - + Therefore, to protect your privacy, you should erase/ overwrite data from the disk, before you destroy, sell or give away a hard drive. services: @@ -3764,12 +3815,12 @@ categories: Or [badblocks](https://linux.die.net/man/8/badblocks) which is intended to search for all bad blocks, but can also be used to write zeros to a disk, by running `sudo badblocks -wsv /dev/sdd`. - + An effective method of erasing an SSD, it to use [hdparm](https://en.wikipedia.org/wiki/Hdparm) to issue a [secure erase](https://en.wikipedia.org/wiki/Parallel_ATA#HDD_passwords_and_security) command, to your target storage device, for this, see step-by-step instructions via: [wiki.kernel.org](https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase). - + Finally, [srm](https://www.systutorials.com/docs/linux/man/1-srm/) can be use to securely remove files or directories, just run `srm -zsv /path/to/file` for a single pass over. @@ -3787,7 +3838,7 @@ categories: If you are an Android user, your device has Google built-in at its core. [Google tracks you](https://digitalcontentnext.org/blog/2018/08/21/google-data-collection-research/), collecting a wealth of information, and logging your every move. - + A [custom ROM](https://en.wikipedia.org/wiki/List_of_custom_Android_distributions), is an open source, usually Google-free mobile OS that can be flashed to your device. services: @@ -3796,7 +3847,7 @@ categories: github: GrapheneOS/hardened_malloc icon: https://grapheneos.org/apple-touch-icon.png description: | - GrapheneOS is an open source privacy and security focused mobile OS with Android app compatibility. Developed by Daniel Micay. + GrapheneOS is an open source privacy and security focused mobile OS with Android app compatibility. Developed by Daniel Micay. GrapheneOS is a young project, and currently only supports Pixel devices, partially due to their strong hardware security. - name: CalyxOS @@ -3805,8 +3856,8 @@ categories: github: CalyxOS/calyxos tosdrId: 2558 description: | - CalyxOS is an free and open source Android mobile operating system that puts privacy and security into the hands of everyday users. - Plus, proactive security recommendations and automatic updates take the guesswork out of keeping your personal data personal. Also currently + CalyxOS is an free and open source Android mobile operating system that puts privacy and security into the hands of everyday users. + Plus, proactive security recommendations and automatic updates take the guesswork out of keeping your personal data personal. Also currently only supports Pixel devices and Xiaomi Mi A2 with Fairphone 4, OnePlus 8T, OnePlus 9 test builds available. Developed by the Calyx Foundation. - name: DivestOS @@ -3815,8 +3866,8 @@ categories: github: Divested-Mobile/DivestOS-Build tosdrId: 2550 description: | - DivestOS is a vastly diverged unofficial more secure and private soft fork of LineageOS. DivestOS primary goal is prolonging the life-span of - discontinued devices, enhancing user privacy, and providing a modest increase of security where/when possible. Project is developed and maintained + DivestOS is a vastly diverged unofficial more secure and private soft fork of LineageOS. DivestOS primary goal is prolonging the life-span of + discontinued devices, enhancing user privacy, and providing a modest increase of security where/when possible. Project is developed and maintained solely by Tad (SkewedZeppelin) since 2014. - name: LineageOS @@ -3825,17 +3876,17 @@ categories: github: LineageOS/android tosdrId: 7188 description: | - A free and open-source operating system for various devices, based on the Android mobile platform - Lineage is light-weight, well maintained, + A free and open-source operating system for various devices, based on the Android mobile platform - Lineage is light-weight, well maintained, supports a wide range of devices, and comes bundled with Privacy Guard. notableMentions: | [Replicant OS](https://www.replicant.us/) is a fully-featured distro, with an emphasis on freedom, privacy and security. - + [OmniRom](https://www.omnirom.org/), [Resurrection Remix OS](https://resurrectionremix.com/) and [Paranoid Android](http://paranoidandroid.co/) are also popular options. - + Alternatively, [Ubuntu Touch](https://ubports.com/) is a Linux (Ubuntu)- based OS. It is secure by design and runs on almost any device, - but it does fall short when it comes to the app store. @@ -4002,7 +4053,7 @@ categories: some technical knowledge to get started with, but once setup should perform just as any other Windows 10 system. Note that you should only download the LTSC ISO from the Microsoft's - [official page](https://www.microsoft.com/en-in/evalcenter/evaluate-windows-10-enterprise) + [official page](https://www.microsoft.com/en-in/evalcenter/evaluate-windows-10-enterprise) #### Improve the Security and Privacy of your current OS @@ -4231,8 +4282,8 @@ categories: and check reviews/ forums. Create a system restore point, before making any significant changes to your OS (such as disabling core features). - - From a security and privacy perspective, Linux may be a better option. + + From a security and privacy perspective, Linux may be a better option. notableMentions: | See also these lists: @@ -4305,7 +4356,7 @@ categories: that offer free solutions, even if you pay for the premium package. This includes (but not limited to) Avast, AVG, McAfee and Kasperky. For AV to be effective, it needs intermate access to all areas of your PC, - so it is important to go with a trusted vendor, and monitor its activity closely. + so it is important to go with a trusted vendor, and monitor its activity closely. - name: Development @@ -4360,7 +4411,7 @@ categories: [reputation](https://srlabs.de/bites/smart-spies) when it comes to protecting consumers privacy, there have been [many recent breaches](https://www.theverge.com/2019/10/21/20924886/alexa-google-home-security-vulnerability-srlabs-phishing-eavesdropping). - + For that reason it is recommended not to have these devices in your house. The following are open source AI voice assistants, that aim to provide a human voice interface while also protecting your privacy and security @@ -4396,7 +4447,7 @@ categories: [LinTO](https://linto.ai), [Jovo](https://www.jovo.tech) and [Snips](https://snips.ai) are private-by-design voice assistant frameworks that can be built on by developers, or used by enterprises. - + [Jasper](https://jasperproject.github.io), [Stephanie](https://github.com/SlapBot/stephanie-va) and [Hey Athena](https://github.com/rcbyron/hey-athena-client) are Python-based voice assistant, but neither is under active development anymore. @@ -4413,7 +4464,7 @@ categories: description: | An open source privacy-respecting Home Assistant, compatible with a wide range of devices including Raspberry Pi, desktop computers, or NAS systems. - Actively developed, with good french community and various integrations + Actively developed, with good french community and various integrations (Zigbee, Philips, Camera, Tuya, MQTT, Telegram, ...). url: https://gladysassistant.com/ github: gladysassistant/gladys @@ -4456,7 +4507,7 @@ categories: notableMentions: | Other privacy-focused cryptocurrencies include: [PIVX](https://pivx.org), - [Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/). + [Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/). wordOfWarning: | Not all cryptocurrencies are anonymous, and without using a privacy-focused coin, a record of your transaction will live on a publicly available distributed ledger, forever. @@ -4593,7 +4644,7 @@ categories: [BitMex](https://www.bitmex.com/) has more advanced trading features, but ID verification is required for higher value trades involving Fiat currency. - + For buying and selling alt-coins, [Binance](https://www.binance.com/en/register?ref=X2BHKID1) has a wide range of currencies, ~and ID verification is not needed for small-value trades~ but ID verification is required in most countries. @@ -4717,9 +4768,8 @@ categories: [Smart Wallet](https://apps.apple.com/app/smart-wallet/id1378013954) (iOS), [My-Budget](https://rezach.github.io/my-budget) (Desktop), [MoneyManager EX](https://www.moneymanagerex.org), - [Skrooge](https://skrooge.org), - [kMyMoney](https://kmymoney.org) and - [Budget Zen](https://budgetzen.net) (a simple E2E encrypted budget manager) + [Skrooge](https://skrooge.org), and + [kMyMoney](https://kmymoney.org). - name: Social @@ -4730,7 +4780,7 @@ categories: Over the past decade, social networks have revolutionized the way we communicate and bought the world closer together - but it came at the [cost of our privacy](https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services). - + Social networks are built on the principle of sharing - but you, the user should be able to choose with whom you share what, and that is what the following sites aim to do. @@ -4761,12 +4811,12 @@ categories: - name: nostr description: | - nostr stands for Notes and other stuff transmitted by relays. - It is an open protocol, not merely a platform. - This distinction enables truly censorship-resistant and global value-for-value publishing on the web. - With the power to replace data-greedy applications like Twitter and Instagram, - nostr offers a promising alternative for users seeking a more private and secure online experience - without algorithmic manipulations. ".... I feel like I’m looking at the future." that is what [Snowden](https://x.com/Snowden/status/1617623779626352640) wrote about nostr. + nostr stands for Notes and other stuff transmitted by relays. + It is an open protocol, not merely a platform. + This distinction enables truly censorship-resistant and global value-for-value publishing on the web. + With the power to replace data-greedy applications like Twitter and Instagram, + nostr offers a promising alternative for users seeking a more private and secure online experience + without algorithmic manipulations. ".... I feel like I’m looking at the future." that is what [Snowden](https://x.com/Snowden/status/1617623779626352640) wrote about nostr. url: https://github.com/nostr-protocol/nostr github: https://github.com/nostr-protocol @@ -4885,7 +4935,7 @@ categories: then [Listed.to](https://listed.to) is a public blogging platform with strong privacy features. It lets you publish posts directly through the Standard Notes app or web interface. - + Other minimalistic platforms include [Notepin.co](https://notepin.co) and [Pen.io](http://pen.io). Want to write a simple text post and promote it yourself? @@ -4967,7 +5017,7 @@ categories: url: https://newpipe.schabi.org description: An open source, privacy-respecting YouTube client for Android. # tosdrId: 2568 - - name: FreeTube + - name: FreeTube url: https://freetubeapp.io description: | An open source YouTube client for Windows, MacOS and Linux, providing @@ -4976,7 +5026,10 @@ categories: # tosdrId: 3996 wordOfWarning: | When proxies are involved - only use reputable services, and **never** enter any personal information - + furtherInfo: | + *[alternative-front-ends](https://github.com/mendel5/alternative-front-ends) provides information on + dozens of alternative front-end options for popular platforms, such as YouTube, Twitter, Reddit, + TikTok, and more.* - name: Media sections: @@ -5006,7 +5059,17 @@ categories: services: [] - name: File Converters alternativeTo: ['format factory', 'handbrake', 'freemake video converter', 'any video converter', 'online-convert.com'] - services: [] + services: + - name: FFmpeg + url: https://ffmpeg.org/ + icon: https://ffmpeg.org/favicon.ico + openSource: true + github: FFmpeg/FFmpeg + description: | + A complete, cross-platform solution to record, convert, and stream audio and + video. It's the industry standard multimedia framework, handling a vast range + of formats. As a command-line tool, it guarantees that all processing is done + locally on your machine. - name: Creativity sections: @@ -5097,7 +5160,7 @@ categories: - name: Video Editors alternativeTo: ['adobe premiere pro', 'final cut pro', 'davinci resolve', 'imovie', 'sony vegas pro'] - services: + services: - name: Shotcut followWith: Windows, Mac OS, Linux description: | @@ -5162,7 +5225,7 @@ categories: github: NatronGitHub/Natron icon: https://natrongithub.github.io/img/Natron_icon.svg openSource: true - + - name: Audio Editors & Recorders alternativeTo: ['adobe audition', 'garageband', 'fl studio', 'ableton live'] services: @@ -5173,16 +5236,16 @@ categories: great free alternative to Adobe Audition. Features recording from real and virtual devices, import/export to a wide range of formats, high-quality processing - advanced multi-track editing, noise reduction, pitch correction, + advanced multi-track editing, noise reduction, pitch correction, audio restoration and much more. - It's easily extendable via community plugins, and + It's easily extendable via community plugins, and also supports cusotm macros and many scripting options url: https://www.audacityteam.org github: audacity/audacity icon: https://www.audacityteam.org/_astro/Audacity_Logo.63b57726.svg openSource: true tosdrId: 4516 - + - name: Casting & Streaming alternativeTo: ['xsplit', 'streamlabs obs', 'twitch studio', 'wirecast'] services: @@ -5199,11 +5262,11 @@ categories: icon: https://obsproject.com/assets/images/new_icon_small-r.png openSource: true tosdrId: 4227 - + - name: Screenshot Tools alternativeTo: ['snagit', 'greenshot', 'lightshot', 'gyazo', 'sharex'] services: [] - + - name: 3D Graphics alternativeTo: ['blender', 'autodesk maya', 'cinema 4d', '3ds max', 'sketchup'] services: @@ -5229,7 +5292,7 @@ categories: url: https://wings3d.com github: dgud/wings icon: https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Wings3d.png/120px-Wings3d.png - + - name: Animation alternativeTo: ['adobe after effects', 'animate cc', 'toon boom harmony', 'moho (anime studio)', 'pencil2d'] services: diff --git a/lib/.gitignore b/lib/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/lib/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/lib/awesome-privacy-readme-gen.py b/lib/awesome-privacy-readme-gen.py index 396006c..9c6d623 100644 --- a/lib/awesome-privacy-readme-gen.py +++ b/lib/awesome-privacy-readme-gen.py @@ -1,13 +1,13 @@ """ Reads app list from awesome-privacy.yml, -formats into markdown, and inserts into README.md +formats into markdown, and inserts into README.md """ import os import re import yaml import logging -from urllib.parse import urlparse +from urllib.parse import urlparse, quote # Configure Logging LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() @@ -44,14 +44,32 @@ def tosElement(tosdrId): return "" return f"[![Privacy Policy](https://shields.tosdr.org/en_{tosdrId}.svg)](https://tosdr.org/en/service/{tosdrId})" -def statsElement(isOpenSource, isSecurityAudited, isAcceptsCrypto): +def statsElement(app, categoryName, sectionName): statsStr = "" - if isOpenSource == True: - statsStr += "📦 Open Source " - if isSecurityAudited == True: - statsStr += "🛡️ Security Audited " - if isAcceptsCrypto == True: - statsStr += "💰 Accepts Anonymous Payment " + if app.get('openSource') == True: + github = app.get('github') + if github: + link = f"https://github.com/{github}" + elif app.get('url'): + link = app.get('url') + else: + link = f"https://awesome-privacy.xyz/{slugify(categoryName)}/{slugify(sectionName)}/{slugify(app.get('name'))}" + statsStr += ( + f"[![Open Source](https://img.shields.io/badge/-Open_Source-3DA639" + f"?style=flat&logo=opensourceinitiative&logoColor=white)]({link}) " + ) + if app.get('securityAudited') == True: + statsStr += ( + "![Security Audited](https://img.shields.io/badge/-Security_Audited-3DA639" + "?style=flat&logo=data:image/svg+xml;base64," + "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=" + "&logoColor=white) " + ) + if app.get('acceptsCrypto') == True: + statsStr += ( + "![Accepts Anonymous Payment](https://img.shields.io/badge/-Anon_Payment_Accepted" + "%EF%B8%8F-3DA639?style=flat&logo=bitcoincash&logoColor=white) " + ) return statsStr def slugify(title): @@ -63,6 +81,11 @@ def slugify(title): title = title.replace('?', '') return title +def shieldsEncode(text): + if not text: return '' + text = text.strip().replace('-', '--').replace('_', '__').replace(' ', '_') + return quote(text, safe='_-.') + def awesomePrivacyReport(categoryName, sectionName, serviceName): if not serviceName: return "" @@ -72,12 +95,74 @@ def awesomePrivacyReport(categoryName, sectionName, serviceName): f"(https://awesome-privacy.xyz/{slugify(categoryName)}/{slugify(sectionName)}/{slugify(serviceName)})" ) -def makeStatsCard(): - return ( - f"\t- <details><summary>Stats</summary>\n\n" - f"" - f"\n\n</details>" - ) +def playStoreBadge(name, androidApp): + if not androidApp: return "" + encoded = shieldsEncode(name) + return ( + f"[![{name} on Google Play](https://img.shields.io/badge/-{encoded}-3bd47f" + f"?style=flat&logo=android&logoColor=white)]" + f"(https://play.google.com/store/apps/details?id={androidApp}) " + ) + +def appStoreBadge(name, iosApp): + if not iosApp: return "" + encoded = shieldsEncode(name) + return ( + f"[![{name} on App Store](https://img.shields.io/badge/-{encoded}-0D96F6" + f"?style=flat&logo=appstore&logoColor=white)]" + f"({iosApp}) " + ) + +def redditBadge(subreddit): + if not subreddit or not subreddit.strip(): return "" + sub = subreddit.strip() + return ( + f"[![r/{sub} on Reddit](https://img.shields.io/badge/-{sub}-FF4500" + f"?style=flat&logo=reddit&logoColor=white)]" + f"(https://reddit.com/r/{sub}) " + ) + +def discordBadge(name, discordInvite): + if not discordInvite or not discordInvite.strip(): return "" + invite = discordInvite.strip() + encoded = shieldsEncode(name) + link = invite if invite.startswith('https://') else f"https://discord.gg/{invite}" + return ( + f"[![{name} on Discord](https://img.shields.io/badge/-{encoded}-5865F2" + f"?style=flat&logo=discord&logoColor=white)]" + f"({link}) " + ) + +_MD_PATTERNS = [ + re.compile(r'\[([^\]]*)\]\([^)]*\)'), # [text](url) — group 1 = visible text + re.compile(r'\*\*(.+?)\*\*'), # **bold** + re.compile(r'`([^`]+)`'), # `code` + re.compile(r'(?<!\*)\*([^*]+)\*(?!\*)'), # *italic* +] + +def truncateMarkdown(text, maxLen=200): + """Returns (truncated_text, was_truncated) preserving markdown constructs.""" + if len(text) <= maxLen: + return text, False + + result = [] + visible = 0 + i = 0 + + while i < len(text) and visible < maxLen: + for pattern in _MD_PATTERNS: + m = pattern.match(text, i) + if m: + result.append(m.group(0)) + visible += len(m.group(1)) + i = m.end() + break + else: + result.append(text[i]) + visible += 1 + i += 1 + + return ''.join(result).rstrip(), True def makeHref(text): if not text: return "#" @@ -116,21 +201,32 @@ def makeAwesomePrivacy(): ) # For each service, list it's name, icon, url, and description for app in section.get('services') or []: + description, was_truncated = truncateMarkdown(app.get('description', '')) + ap_link = ( + f"https://awesome-privacy.xyz/" + f"{slugify(category.get('name'))}/{slugify(section.get('name'))}/{slugify(app.get('name'))}" + ) + ellipsis = f"[…]({ap_link} \"View full {app.get('name')} report\")" if was_truncated else "" markdown += ( f"- **[{iconElement(app.get('url'), app.get('icon'))} {app.get('name')}]" - f"({app.get('url')})** - {app.get('description')}" - f"[…](https://awesome-privacy.xyz/" - f"{slugify(category.get('name'))}/{slugify(section.get('name'))}/{slugify(app.get('name'))} \"View full {app.get('name')} report\") \n" - + (( - f"\t- <details>\n\t\t<summary>Stats</summary>\n\n\t\t" - f"{repoElement(app.get('github'))} " - f"{tosElement(app.get('tosdrId'))} " - f"{awesomePrivacyReport(category.get('name'), section.get('name'), app.get('name'))} \n" - f"{statsElement(app.get('openSource'), app.get('securityAudited'), app.get('acceptsCrypto'))}˙ \n" - f"\n\t\t</details>\n" - ) - if app.get('github') or app.get('tosdrId') else '') + f"({app.get('url')})** - {description}{ellipsis} \n" ) + badges = ' '.join(filter(None, [ + repoElement(app.get('github')), + tosElement(app.get('tosdrId')), + awesomePrivacyReport(category.get('name'), section.get('name'), app.get('name')), + statsElement(app, category.get('name'), section.get('name')).rstrip(), + playStoreBadge(app.get('name'), app.get('androidApp')).rstrip(), + appStoreBadge(app.get('name'), app.get('iosApp')).rstrip(), + redditBadge(app.get('subreddit')).rstrip(), + discordBadge(app.get('name'), app.get('discordInvite')).rstrip(), + ])) + if badges: + markdown += ( + f"\t- <details>\n\t\t<summary>Stats</summary>\n\n\t\t" + f"{badges}ㅤ \n" + f"\n\t\t</details>\n" + ) markdown += "\n" # If word of warning exists, append it if section.get('wordOfWarning'): @@ -145,7 +241,7 @@ def makeAwesomePrivacy(): markdown += f"> - [{mention.get('name')}]({mention.get('url')})" + ( f" - {mention.get('description')}" if mention.get('description') else "\n" ) - else: + else: notable_mentions = section.get('notableMentions').replace('\n', '\n> ') markdown += f"> {notable_mentions}" @@ -170,7 +266,7 @@ def update_content_between_markers(content, start_marker, end_marker, new_conten logger.info(f"Updating content between {start_marker} and {end_marker} markers...") start_index = content.find(start_marker) end_index = content.find(end_marker) - + if start_index != -1 and end_index != -1: before_section = content[:start_index + len(start_marker)] after_section = content[end_index:] diff --git a/lib/checks/check-additions.py b/lib/checks/check-additions.py new file mode 100644 index 0000000..b2cf8b4 --- /dev/null +++ b/lib/checks/check-additions.py @@ -0,0 +1,291 @@ +"""Validates data quality for added/modified services using the diff JSON.""" + +import json +import os +import sys + +import yaml + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +DATA_PATH = os.path.join(PROJECT_ROOT, "awesome-privacy.yml") +DIFF_PATH = "/tmp/pr-diff.json" +FINDINGS_PATH = "/tmp/findings-data.json" + +REQUIRED_FIELDS = ("name", "description", "url", "icon") + +CONTRIBUTING = "https://github.com/Lissy93/awesome-privacy/blob/main/.github/CONTRIBUTING.md" + +SCHEMA_MSG = ( + "Some of the schema checks have failed. Please check that your addition" + " contains all the required fields, with acceptable values, nothing" + " additional and that it is following valid YAML syntax" +) +MULTIPLE_MSG = "Please make just one addition per pull request" +MISSING_TPL = ( + "Did you include all required fields? Looks like {fields} is missing or" + f" invalid. Please see the [required fields]({CONTRIBUTING}#service-fields)" + " for available fields." +) +POSITION_MSG = ( + "New entries must be added to the end of the section, unless otherwise requested" +) +OPENSOURCE_MSG = ( + "You indicated this app/service is not open source. This will likely make" + " it ineligible for listing on Awesome Privacy in accordance with our" + f" [Requirements]({CONTRIBUTING}#requirements)." + " Please ensure that this is justified in your PR body." +) +DUPLICATE_NAME_MSG = ( + "A service named `{name}` already exists (in {location})." + " If this is a different service, please clarify in your PR description" +) +DUPLICATE_URL_MSG = ( + "The URL `{url}` is already associated with `{existing}`." + " Please check this isn't a duplicate submission" +) +DESC_LENGTH_MSG = ( + "Description length ({length} chars) is outside the recommended 50\u2013250" + f" character range. Please see our [Contributing Guidelines]({CONTRIBUTING}#description)" +) +OPENSOURCE_GITHUB_MSG = ( + "You marked this service as open source but didn't include a `github` field." + " Please add the repository link" +) + + +def load_json(path): + """Load JSON from a file, returning None on any error.""" + try: + with open(path) as f: + return json.load(f) + except Exception: + return None + + +def load_yaml_data(path): + """Load YAML from a file, returning None on any error.""" + try: + with open(path) as f: + return yaml.safe_load(f) + except Exception: + return None + + +def find_section_services(head, category, section): + """Return the services list for a category/section pair, or None.""" + for cat in head.get("categories", []): + if cat.get("name") == category: + for sec in cat.get("sections", []): + if sec.get("name") == section: + return sec.get("services", []) + return None + + +def find_service_fields(head, category, section, service_name): + """Look up a service's fields in the head YAML.""" + services = find_section_services(head, category, section) + if services: + for svc in services: + if svc.get("name") == service_name: + return svc + return None + + +def check_required_fields(diff, head): + """Return a finding if any added/modified service is missing required fields.""" + missing = set() + for svc in diff.get("services", {}).get("added", []): + fields = svc.get("fields", {}) + for f in REQUIRED_FIELDS: + if fields.get(f) is None: + missing.add(f) + for svc in diff.get("services", {}).get("modified", []): + if not head: + continue + changed = svc.get("changed_fields", []) + fields = find_service_fields( + head, svc["category"], svc["section"], svc["service"] + ) + if fields: + for f in REQUIRED_FIELDS: + if f in changed and fields.get(f) is None: + missing.add(f) + if missing: + names = ", ".join(f"`{f}`" for f in sorted(missing)) + return MISSING_TPL.format(fields=names) + return None + + +def check_position(diff, head): + """Return a finding if a newly added service is not at the end of its section.""" + if not head: + return None + for svc in diff.get("services", {}).get("added", []): + services = find_section_services(head, svc["category"], svc["section"]) + if services and services[-1].get("name") != svc["service"]: + return POSITION_MSG + return None + + +def check_open_source(diff): + """Return a finding if an added service has openSource missing or not true.""" + for svc in diff.get("services", {}).get("added", []): + fields = svc.get("fields", {}) + if fields.get("openSource") is not True and not fields.get("github"): + return OPENSOURCE_MSG + return None + + +def check_single_entry(diff): + """Return a finding if the diff adds multiple new services or sections.""" + services = diff.get("services", {}) + added_count = len(services.get("added", [])) + if added_count > 1: + return MULTIPLE_MSG + if added_count == 0: + added_sections = [s for s in diff.get("sections", []) + if s.get("change_type") == "added_section"] + if len(added_sections) > 1: + return MULTIPLE_MSG + return None + + +def _added_keys(diff): + """Build a set of (category, section, lowercase_name) for added services.""" + keys = set() + for svc in diff.get("services", {}).get("added", []): + name = svc.get("fields", {}).get("name", "").lower().strip() + keys.add((svc.get("category", ""), svc.get("section", ""), name)) + return keys + + +def build_name_index(head, diff): + """Build {lowercase_name: "category > section"} from all services, excluding additions.""" + index = {} + if not head: + return index + exclude = _added_keys(diff) + for cat in head.get("categories", []): + cn = cat.get("name", "") + for sec in cat.get("sections", []): + sn = sec.get("name", "") + for svc in sec.get("services", []): + name = svc.get("name", "").lower().strip() + if name and (cn, sn, name) not in exclude: + index[name] = f"{cn} > {sn}" + return index + + +def build_url_index(head, diff): + """Build {url: service_name} from all services, excluding additions.""" + index = {} + if not head: + return index + exclude = _added_keys(diff) + for cat in head.get("categories", []): + cn = cat.get("name", "") + for sec in cat.get("sections", []): + sn = sec.get("name", "") + for svc in sec.get("services", []): + name = svc.get("name", "").lower().strip() + if (cn, sn, name) in exclude: + continue + url = svc.get("url", "") + if url: + index[url] = svc.get("name", "") + return index + + +def check_duplicate_name(diff, name_index): + """Return a finding if an added service name already exists in the YAML.""" + for svc in diff.get("services", {}).get("added", []): + name = svc.get("fields", {}).get("name", "").lower().strip() + if name and name in name_index: + return DUPLICATE_NAME_MSG.format( + name=svc["fields"]["name"], location=name_index[name], + ) + return None + + +def check_duplicate_url(diff, url_index): + """Return a finding if an added service URL already exists in the YAML.""" + for svc in diff.get("services", {}).get("added", []): + url = svc.get("fields", {}).get("url", "") + if url and url in url_index: + return DUPLICATE_URL_MSG.format(url=url, existing=url_index[url]) + return None + + +def check_description_length(diff): + """Return a finding if an added service description is outside 50-250 chars.""" + for svc in diff.get("services", {}).get("added", []): + desc = svc.get("fields", {}).get("description", "") + length = len(desc) + if length < 50 or length > 280: + return DESC_LENGTH_MSG.format(length=length) + return None + + +def check_opensource_github(diff): + """Return a finding if an added service is open source but has no github field.""" + for svc in diff.get("services", {}).get("added", []): + fields = svc.get("fields", {}) + if fields.get("openSource") is True and not fields.get("github"): + return OPENSOURCE_GITHUB_MSG + return None + + +def main(): + findings = [] + try: + if os.environ.get("SCHEMA_OUTCOME") == "failure": + findings.append(SCHEMA_MSG) + + diff = load_json(DIFF_PATH) + head = load_yaml_data(DATA_PATH) + + if diff: + finding = check_single_entry(diff) + if finding: + findings.append(finding) + + finding = check_required_fields(diff, head) + if finding: + findings.append(finding) + + finding = check_position(diff, head) + if finding: + findings.append(finding) + + finding = check_open_source(diff) + if finding: + findings.append(finding) + + name_index = build_name_index(head, diff) + url_index = build_url_index(head, diff) + + finding = check_duplicate_name(diff, name_index) + if finding: + findings.append(finding) + + finding = check_duplicate_url(diff, url_index) + if finding: + findings.append(finding) + + finding = check_description_length(diff) + if finding: + findings.append(finding) + + finding = check_opensource_github(diff) + if finding: + findings.append(finding) + except Exception: + pass + + with open(FINDINGS_PATH, "w") as f: + json.dump(findings, f) + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/check-pr-meta.py b/lib/checks/check-pr-meta.py new file mode 100644 index 0000000..513ff84 --- /dev/null +++ b/lib/checks/check-pr-meta.py @@ -0,0 +1,172 @@ +"""Checks PR metadata: title format, draft status, template completeness, and checkboxes.""" + +import json +import os +import re +import subprocess +import sys + +FINDINGS_PATH = "/tmp/findings-compliance.json" + +BAD_TITLES = {"update readme.md", "update awesome-privacy.yml"} + +TITLE_MSG = ( + "The pull request title does not follow the format defined in our guidelines." + " Please rename it to `[Add/Remove/Update] [software name] in [software section]`" +) +DRAFT_MSG = ( + "Please avoid opening WIP pull requests." + " Your PR should be 100% ready and complete before submitting" +) +TEMPLATE_MSG = ( + "Please fill in pull request template in full." + " You can find a copy of this" + " [here](https://github.com/Lissy93/awesome-privacy/blob/main/.github/PULL_REQUEST_TEMPLATE.md)" +) +CHECKBOX_MSG = ( + "Ensure you have completed the checklist (put a tick the checkboxes with `[x]`)," + " to confirm that you've read the contributing guidelines, checked your submission," + " indicated your affiliation and agree to follow our CoC" +) +README_MSG = ( + "Do not edit the README directly. This file is auto-generated from the" + " content in `awesome-privacy.yml`, and so your changes will be overridden!" + " Instead, only modify the YAML file, and be sure to follow our Contributing Guidelines." +) +BOT_MSG = ( + "Submissions are only accepted from humans." + " This PR appears to have been authored by a bot or AI assistant." +) + +_BOT_AUTHOR_RE = re.compile( + r"(?:noreply@anthropic\.com|devin-ai-integration|copilot-swe-agent|noreply@cursor\.com)", + re.IGNORECASE, +) + + +def extract_section(body, header): + """Extract content between a ### header and the next delimiter.""" + pattern = rf"###\s*{re.escape(header)}\s*\n(.*?)(?=\n---|\n###|\Z)" + match = re.search(pattern, body, re.DOTALL) + return match.group(1) if match else None + + +def strip_html_comments(text): + """Remove HTML comments from text.""" + return re.sub(r"<!--.*?-->", "", text, flags=re.DOTALL).strip() + + +def check_title(title): + """Return a finding if the PR title matches a known-bad pattern.""" + if title and title.strip().lower() in BAD_TITLES: + return TITLE_MSG + return None + + +def check_draft(draft_str): + """Return a finding if the PR is in draft state.""" + if str(draft_str).lower() == "true": + return DRAFT_MSG + return None + + +def check_template(body): + """Return a finding if required template sections are missing or empty.""" + for header in ("Type", "Changes", "Checklist"): + content = extract_section(body, header) + if content is None or not strip_html_comments(content): + return TEMPLATE_MSG + return None + + +def check_checkboxes(body): + """Return a finding if any checklist checkboxes are unchecked.""" + section = extract_section(body, "Checklist") + if section is None: + return None + checked = re.findall(r"- \[x\]", section, re.IGNORECASE) + unchecked = re.findall(r"- \[ \]", section) + if not checked and not unchecked: + return None + if unchecked: + return CHECKBOX_MSG + return None + + +def check_bot_coauthors(base_ref): + """Return a finding if any commit in the PR has a bot author or co-author.""" + if not base_ref: + return None + try: + result = subprocess.run( + ["git", "log", f"{base_ref}..HEAD", "--format=%aN <%aE>%n%B"], + capture_output=True, text=True, timeout=30, + ) + if result.returncode != 0: + return None + if _BOT_AUTHOR_RE.search(result.stdout): + return BOT_MSG + except Exception: + pass + return None + + +def check_readme(readme_failed): + """Return a finding if the README check reported a failure.""" + if readme_failed == "true": + return README_MSG + return None + + +def write_findings(findings): + """Write the findings list to the output JSON file.""" + with open(FINDINGS_PATH, "w") as f: + json.dump(findings, f) + + +def main(): + findings = [] + critical = False + try: + title = os.environ.get("PR_TITLE", "") + body = os.environ.get("PR_BODY", "") + draft = os.environ.get("PR_DRAFT", "false") + readme_failed = os.environ.get("README_FAILED", "false") + base_ref = os.environ.get("BASE_REF", "") + + finding = check_bot_coauthors(base_ref) + if finding: + findings.append(finding) + + finding = check_title(title) + if finding: + findings.append(finding) + + finding = check_draft(draft) + if finding: + findings.append(finding) + + if not body or not body.strip(): + findings.append(TEMPLATE_MSG) + critical = True + else: + finding = check_template(body) + if finding: + findings.append(finding) + critical = True + finding = check_checkboxes(body) + if finding: + findings.append(finding) + + finding = check_readme(readme_failed) + if finding: + findings.append(finding) + except Exception: + pass + + write_findings(findings) + sys.exit(1 if critical else 0) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/check-project.py b/lib/checks/check-project.py new file mode 100644 index 0000000..f80a5c3 --- /dev/null +++ b/lib/checks/check-project.py @@ -0,0 +1,400 @@ +"""Checks project health: URL reachability, GitHub repo stars, activity, and author match.""" + +import json +import os +import re +import sys +from datetime import datetime, timedelta, timezone + +import requests +import yaml + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +DATA_PATH = os.path.join(PROJECT_ROOT, "awesome-privacy.yml") +DIFF_PATH = "/tmp/pr-diff.json" +FINDINGS_PATH = "/tmp/findings-project.json" + +TIMEOUT = 10 +USER_AGENT = "awesome-privacy-ci/1.0" +MIN_STARS = 100 +INACTIVE_DAYS = 90 +MIN_AGE_DAYS = 120 +AI_COMMIT_RATIO = 0.2 +AI_BOT_AUTHORS = [ + "noreply@anthropic.com", + "devin-ai-integration[bot]", + "copilot-swe-agent.github.com", + "noreply@cursor.com", +] +SPAM_PR_THRESHOLD = 5 + +LINK_MSG = ( + "Our automated checks were unable to verify the link(s) you included" + " were reachable, so please double check this yourself" +) +AUTHOR_MSG = ( + "Looks like you are the author of this package. Please ensure that you" + " have clearly disclosed this in your PR body for transparency" +) +STARS_MSG = ( + "It looks like your submission is quite a small project without a lot of users yet." + " In some circumstances we may ask you to resubmit this once the project" + " is more mature and has a proven track record of good practices and maintenance." +) +ACTIVITY_MSG = ( + "Please confirm that the project you are adding is actively maintained," + " as it looks to not have had any recent updates in the past 3 months." +) +MATURITY_MSG = ( + "This project appears to be quite new (created less than 4 months ago)." + " Repositories should have a proven track record before listing." +) +AI_CODE_MSG = ( + "This project appears to contain AI-generated code." + " Additional care will be needed when reviewing the submission." +) +FORK_MSG = ( + "The GitHub link in this listing is a fork." + " Please confirm it's the correct (and actively maintained) repository" +) +LICENSE_MSG = ( + "There doesn't appear to be a license included in the project's GitHub repo" +) +ARCHIVED_MSG = ( + "The GitHub project linked has been archived." + " Additions must be actively maintained." +) +SECURITY_MSG = ( + "This project has open security vulnerabilities (critical or high severity)" + " flagged by GitHub Dependabot. Please verify these have been addressed" +) +SPAM_MSG = ( + "This user has opened up a large number of PRs to other awesome-* repos" + " in the past 24 hours, and appears to be spamming" +) + + +def load_diff(path): + """Load the diff JSON, returning None on any error.""" + try: + with open(path) as f: + return json.load(f) + except Exception: + return None + + +def check_url(url): + """Return True if the URL is reachable, True on any error (no false positives).""" + try: + resp = requests.head( + url, timeout=TIMEOUT, allow_redirects=True, + headers={"User-Agent": USER_AGENT}, + ) + if resp.status_code >= 400: + resp = requests.get( + url, timeout=TIMEOUT, allow_redirects=True, + headers={"User-Agent": USER_AGENT}, stream=True, + ) + resp.close() + return resp.status_code < 400 + except Exception: + return True + + +def parse_github_field(value): + """Parse a github field into (owner, repo), or (None, None) on failure.""" + if not value: + return None, None + if value.startswith("https://github.com/"): + parts = value.removeprefix("https://github.com/").strip("/").split("/") + if len(parts) >= 2: + return parts[0], parts[1] + return None, None + if "/" in value: + parts = value.split("/") + if len(parts) == 2: + return parts[0], parts[1] + return None, None + + +def fetch_repo(owner, repo, token): + """Fetch GitHub repo metadata, returning None on any error.""" + try: + headers = {"Accept": "application/vnd.github.v3+json", "User-Agent": USER_AGENT} + if token: + headers["Authorization"] = f"token {token}" + resp = requests.get( + f"https://api.github.com/repos/{owner}/{repo}", + headers=headers, timeout=TIMEOUT, + ) + if resp.status_code == 200: + return resp.json() + except Exception: + pass + return None + + +def load_yaml_data(): + """Load the head YAML, returning None on any error.""" + try: + with open(DATA_PATH) as f: + return yaml.safe_load(f) + except Exception: + return None + + +def find_service_in_head(head, category, section, service_name): + """Look up a service in the head YAML by path.""" + if not head: + return None + for cat in head.get("categories", []): + if cat.get("name") == category: + for sec in cat.get("sections", []): + if sec.get("name") == section: + for svc in sec.get("services", []): + if svc.get("name") == service_name: + return svc + return None + + +def get_services(diff, key): + """Safely extract a service list from the diff.""" + return diff.get("services", {}).get(key, []) + + +def check_links(diff, head): + """Return LINK_MSG if any service URL or icon URL is unreachable.""" + for svc in get_services(diff, "added"): + fields = svc.get("fields", {}) + url = fields.get("url") + if url and not check_url(url): + return LINK_MSG + icon = fields.get("icon") + if icon and not check_url(icon): + return LINK_MSG + for svc in get_services(diff, "modified"): + changed = svc.get("changed_fields", []) + if "url" not in changed and "icon" not in changed: + continue + head_svc = find_service_in_head( + head, svc["category"], svc["section"], svc["service"] + ) + if head_svc: + if "url" in changed: + url = head_svc.get("url") + if url and not check_url(url): + return LINK_MSG + if "icon" in changed: + icon = head_svc.get("icon") + if icon and not check_url(icon): + return LINK_MSG + return None + + +def _commit_has_bot(commit, bot_set): + """Check if a commit was authored or co-authored by a known AI bot.""" + author = commit.get("commit", {}).get("author", {}) + email = (author.get("email") or "").lower() + name = (author.get("name") or "").lower() + if email in bot_set or name in bot_set: + return True + message = (commit.get("commit", {}).get("message") or "").lower() + for line in message.splitlines(): + if line.strip().startswith("co-authored-by:"): + if any(bot in line for bot in bot_set): + return True + return False + + +def check_ai_commits(owner, repo, token): + """Return AI_CODE_MSG if recent commits contain significant AI bot activity.""" + try: + headers = {"Accept": "application/vnd.github.v3+json", "User-Agent": USER_AGENT} + if token: + headers["Authorization"] = f"token {token}" + resp = requests.get( + f"https://api.github.com/repos/{owner}/{repo}/commits", + headers=headers, timeout=TIMEOUT, params={"per_page": 100}, + ) + if resp.status_code != 200: + return None + commits = resp.json() + if not commits: + return None + bot_set = {a.lower() for a in AI_BOT_AUTHORS} + count = sum(1 for c in commits if _commit_has_bot(c, bot_set)) + if count / len(commits) >= AI_COMMIT_RATIO: + return AI_CODE_MSG + except Exception: + pass + return None + + +def check_security_alerts(owner, repo, token): + """Return SECURITY_MSG if the repo has open critical/high Dependabot alerts.""" + try: + headers = {"Accept": "application/vnd.github.v3+json", "User-Agent": USER_AGENT} + if token: + headers["Authorization"] = f"token {token}" + resp = requests.get( + f"https://api.github.com/repos/{owner}/{repo}/dependabot/alerts", + headers=headers, timeout=TIMEOUT, + params={"state": "open", "severity": "critical,high", "per_page": 1}, + ) + if resp.status_code == 200 and resp.json(): + return SECURITY_MSG + except Exception: + pass + return None + + +def check_spam_prs(pr_user, token): + """Return SPAM_MSG if the user has opened many PRs to other awesome-* repos recently.""" + if not pr_user or not token: + return None + try: + since = (datetime.now(timezone.utc) - timedelta(days=1)).strftime("%Y-%m-%d") + headers = {"Accept": "application/vnd.github.v3+json", "User-Agent": USER_AGENT} + headers["Authorization"] = f"token {token}" + resp = requests.get( + "https://api.github.com/search/issues", + headers=headers, timeout=TIMEOUT, + params={"q": f"type:pr author:{pr_user} created:>={since}"}, + ) + if resp.status_code != 200: + return None + items = resp.json().get("items", []) + this_repo = os.environ.get("GITHUB_REPOSITORY", "Lissy93/awesome-privacy").lower() + count = 0 + for item in items: + repo_url = item.get("repository_url", "") + # repository_url looks like https://api.github.com/repos/owner/repo-name + repo_full = "/".join(repo_url.rstrip("/").split("/")[-2:]).lower() + repo_name = repo_url.rstrip("/").split("/")[-1].lower() + if repo_name.startswith("awesome-") and repo_full != this_repo: + count += 1 + if count >= SPAM_PR_THRESHOLD: + return SPAM_MSG + except Exception: + pass + return None + + +_DISCLOSURE_RE = re.compile( + r"i am the author|i'm the author|my project|i created|i develop" + r"|i maintain|i built|my own project|i made|author of|maintainer of", + re.IGNORECASE, +) + + +def _pr_discloses_authorship(pr_body): + """Return True if the PR body already discloses the submitter is the author.""" + return bool(pr_body and _DISCLOSURE_RE.search(pr_body)) + + +def check_repo_signals(diff, pr_user, token, pr_body=""): + """Check GitHub repo author match, stars, and activity for added services.""" + findings = [] + if not token: + return findings + cache = {} + for svc in get_services(diff, "added"): + gh = svc.get("fields", {}).get("github") + owner, repo = parse_github_field(gh) + if not owner: + continue + cache_key = f"{owner}/{repo}" + if cache_key not in cache: + cache[cache_key] = fetch_repo(owner, repo, token) + data = cache[cache_key] + if not data: + continue + + repo_owner = data.get("owner", {}) + if ( + pr_user + and repo_owner.get("type") == "User" + and repo_owner.get("login", "").lower() == pr_user.lower() + and AUTHOR_MSG not in findings + and not _pr_discloses_authorship(pr_body) + ): + findings.append(AUTHOR_MSG) + + stars = data.get("stargazers_count", 0) + if stars < MIN_STARS and STARS_MSG not in findings: + findings.append(STARS_MSG) + + if data.get("fork") and FORK_MSG not in findings: + findings.append(FORK_MSG) + + if not data.get("license") and LICENSE_MSG not in findings: + findings.append(LICENSE_MSG) + + if data.get("archived") and ARCHIVED_MSG not in findings: + findings.append(ARCHIVED_MSG) + + pushed = data.get("pushed_at") + if pushed and ACTIVITY_MSG not in findings: + try: + pushed_dt = datetime.fromisoformat(pushed.replace("Z", "+00:00")) + now = datetime.now(timezone.utc) + if (now - pushed_dt).days > INACTIVE_DAYS: + findings.append(ACTIVITY_MSG) + except Exception: + pass + + created = data.get("created_at") + if created and MATURITY_MSG not in findings: + try: + created_dt = datetime.fromisoformat(created.replace("Z", "+00:00")) + now = datetime.now(timezone.utc) + if (now - created_dt).days < MIN_AGE_DAYS: + findings.append(MATURITY_MSG) + except Exception: + pass + + if AI_CODE_MSG not in findings: + finding = check_ai_commits(owner, repo, token) + if finding: + findings.append(finding) + + if SECURITY_MSG not in findings: + finding = check_security_alerts(owner, repo, token) + if finding: + findings.append(finding) + + return findings + + +def main(): + findings = [] + try: + diff = load_diff(DIFF_PATH) + if not diff: + with open(FINDINGS_PATH, "w") as f: + json.dump(findings, f) + sys.exit(0) + + head = load_yaml_data() + finding = check_links(diff, head) + if finding: + findings.append(finding) + + pr_user = os.environ.get("PR_USER", "") + pr_body = os.environ.get("PR_BODY", "") + token = os.environ.get("GITHUB_TOKEN", "") + findings.extend(check_repo_signals(diff, pr_user, token, pr_body)) + + finding = check_spam_prs(pr_user, token) + if finding: + findings.append(finding) + except Exception: + pass + + with open(FINDINGS_PATH, "w") as f: + json.dump(findings, f) + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/check-readme-edits.py b/lib/checks/check-readme-edits.py new file mode 100644 index 0000000..4aa5598 --- /dev/null +++ b/lib/checks/check-readme-edits.py @@ -0,0 +1,105 @@ +""" +Fails if the PR directly edits the auto-generated section of the README. +The generated section is between <!-- awesome-privacy-start --> and <!-- awesome-privacy-end -->. +""" + +import argparse +import os +import re +import subprocess +import sys + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +README_PATH = ".github/README.md" +README_ABS = os.path.join(PROJECT_ROOT, README_PATH) + +# Exit codes +EXIT_PASS = 0 +EXIT_FAIL = 1 +EXIT_RUNTIME_ERROR = 2 + +# ANSI color helpers +_use_color = sys.stderr.isatty() and not os.environ.get("NO_COLOR") +red = (lambda s: f"\033[31m{s}\033[0m") if _use_color else (lambda s: s) +green = (lambda s: f"\033[32m{s}\033[0m") if _use_color else (lambda s: s) + + +def get_changed_files(base_ref): + result = subprocess.run( + ["git", "diff", "--name-only", f"{base_ref}..HEAD"], + capture_output=True, text=True, check=True, + cwd=PROJECT_ROOT, + ) + return result.stdout.strip().splitlines() + + +def get_marker_lines(): + """Find the line numbers of the start/end markers in the README.""" + try: + with open(README_ABS, "r") as f: + lines = f.readlines() + except FileNotFoundError: + return None, None + + start_line = None + end_line = None + for i, line in enumerate(lines, start=1): + if "<!-- awesome-privacy-start -->" in line: + start_line = i + if "<!-- awesome-privacy-end -->" in line: + end_line = i + + return start_line, end_line + + +def get_changed_line_numbers(base_ref): + """Parse git diff hunk headers to find which lines were changed in the README.""" + result = subprocess.run( + ["git", "diff", "-U0", f"{base_ref}..HEAD", "--", README_PATH], + capture_output=True, text=True, check=True, + cwd=PROJECT_ROOT, + ) + + changed_lines = [] + for line in result.stdout.splitlines(): + # Match hunk headers like @@ -10,5 +12,7 @@ + match = re.match(r"^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@", line) + if match: + start = int(match.group(1)) + count = int(match.group(2)) if match.group(2) else 1 + for n in range(start, start + count): + changed_lines.append(n) + + return changed_lines + +def main(): + parser = argparse.ArgumentParser(description="Check for direct README edits to generated section") + parser.add_argument("--base-ref", required=True, help="Base git ref to diff against") + args = parser.parse_args() + + # Skip if README wasn't changed + changed_files = get_changed_files(args.base_ref) + if README_PATH not in changed_files: + print(green("README not modified, skipping.")) + sys.exit(EXIT_PASS) + + # Find marker lines + start_line, end_line = get_marker_lines() + if start_line is None or end_line is None: + print("Could not find generated-section markers in README, skipping check.") + sys.exit(EXIT_PASS) + + # Check if any changed lines fall within the generated section + changed_lines = get_changed_line_numbers(args.base_ref) + for line_num in changed_lines: + if start_line <= line_num <= end_line: + print(red("Direct edits to the generated section of the README are not allowed."), file=sys.stderr) + print(red("Edit awesome-privacy.yml instead and the README will be regenerated."), file=sys.stderr) + sys.exit(EXIT_FAIL) + + print(green("README changes are outside the generated section, OK.")) + sys.exit(EXIT_PASS) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/check-review-ready.py b/lib/checks/check-review-ready.py new file mode 100644 index 0000000..8437e5d --- /dev/null +++ b/lib/checks/check-review-ready.py @@ -0,0 +1,90 @@ +"""Decides whether a PR is ready for maintainer review. + +Conditions: 2+ approvals from external contributors AND all CI checks passing. + +Reads: + pr-meta/reviews.json — array of {user, state} from GitHub API + pr-meta/check-runs.json — array of {status, conclusion} from GitHub API + pr-meta/already-notified.txt — "true" if notification comment already exists + +Writes: + pr-meta/action.txt — "notify" or "skip" +""" + +import json +import os + +WORK_DIR = "pr-meta" +MAINTAINER = "Lissy93" +REQUIRED_APPROVALS = 2 +PASSING_CONCLUSIONS = {"success", "skipped", "neutral"} + + +def read_json(filename): + """Load a JSON file from the work directory, or empty list on error.""" + try: + with open(os.path.join(WORK_DIR, filename)) as f: + return json.load(f) + except Exception: + return [] + + +def count_external_approvals(reviews): + """Count unique non-maintainer users who approved.""" + approvers = { + r["user"] + for r in reviews + if r.get("state") == "APPROVED" + and r.get("user", "").lower() != MAINTAINER.lower() + } + return len(approvers) + + +def all_checks_passing(check_runs): + """Return True if every check run completed successfully.""" + if not check_runs: + return False + return all( + cr.get("status") == "completed" + and cr.get("conclusion") in PASSING_CONCLUSIONS + for cr in check_runs + ) + + +def already_notified(): + """Return True if the notification comment already exists on the PR.""" + try: + with open(os.path.join(WORK_DIR, "already-notified.txt")) as f: + return f.read().strip().lower() == "true" + except Exception: + return False + + +def write_action(action): + os.makedirs(WORK_DIR, exist_ok=True) + with open(os.path.join(WORK_DIR, "action.txt"), "w") as f: + f.write(action) + + +def main(): + if already_notified(): + write_action("skip") + return + + reviews = read_json("reviews.json") + approvals = count_external_approvals(reviews) + + if approvals < REQUIRED_APPROVALS: + write_action("skip") + return + + check_runs = read_json("check-runs.json") + if not all_checks_passing(check_runs): + write_action("skip") + return + + write_action("notify") + + +if __name__ == "__main__": + main() diff --git a/lib/checks/check-yaml-diff.py b/lib/checks/check-yaml-diff.py new file mode 100644 index 0000000..0ae7c40 --- /dev/null +++ b/lib/checks/check-yaml-diff.py @@ -0,0 +1,255 @@ +"""Analyzes the diff between base and head versions of awesome-privacy.yml. +Enforces the single-entry rule and outputs a JSON diff to /tmp/pr-diff.json. +""" + +import argparse +import json +import os +import subprocess +import sys + +import yaml + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +DATA_PATH = os.path.join(PROJECT_ROOT, "awesome-privacy.yml") +DIFF_OUTPUT_PATH = "/tmp/pr-diff.json" +SUMMARY_OUTPUT_PATH = "/tmp/pr-diff-summary.md" + +EXIT_PASS = 0 +EXIT_RULE_VIOLATION = 1 +EXIT_RUNTIME_ERROR = 2 + +_use_color = sys.stderr.isatty() and not os.environ.get("NO_COLOR") +red = (lambda s: f"\033[31m{s}\033[0m") if _use_color else (lambda s: s) +green = (lambda s: f"\033[32m{s}\033[0m") if _use_color else (lambda s: s) +yellow = (lambda s: f"\033[33m{s}\033[0m") if _use_color else (lambda s: s) + + +def load_base_yaml(base_ref): + """Load the YAML from the base ref using git show.""" + try: + result = subprocess.run( + ["git", "show", f"{base_ref}:awesome-privacy.yml"], + capture_output=True, text=True, check=True, cwd=PROJECT_ROOT, + ) + return yaml.safe_load(result.stdout) + except subprocess.CalledProcessError: + print(yellow("awesome-privacy.yml not found in base ref, treating as empty"), file=sys.stderr) + return {"categories": []} + except yaml.YAMLError as e: + print(red(f"Failed to parse base YAML: {e}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) + + +def load_head_yaml(): + """Load the YAML from the current working tree.""" + try: + with open(DATA_PATH) as f: + return yaml.safe_load(f) + except (FileNotFoundError, yaml.YAMLError) as e: + print(red(f"Failed to load head YAML: {e}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) + + +def build_index(data, depth): + """Build a keyed index at the given depth (3=services, 2=sections, 1=categories).""" + index = {} + for cat in data.get("categories", []): + cn = cat.get("name", "") + if depth == 1: + index[cn] = {k: v for k, v in cat.items() if k != "sections"} + continue + for sec in cat.get("sections", []): + sn = sec.get("name", "") + if depth == 2: + index[(cn, sn)] = {k: v for k, v in sec.items() if k != "services"} + continue + for svc in sec.get("services", []): + index[(cn, sn, svc.get("name", ""))] = svc + return index + + +def diff_index(base_idx, head_idx): + """Return (added_keys, removed_keys, modified_keys_with_changed_fields).""" + base_keys, head_keys = set(base_idx), set(head_idx) + added = sorted(head_keys - base_keys) + removed = sorted(base_keys - head_keys) + modified = [] + for key in sorted(base_keys & head_keys): + if base_idx[key] != head_idx[key]: + all_fields = set(base_idx[key]) | set(head_idx[key]) + changed = sorted(f for f in all_fields if base_idx[key].get(f) != head_idx[key].get(f)) + modified.append((key, changed)) + return added, removed, modified + + +def write_github_output(name, value): + """Write a value to $GITHUB_OUTPUT.""" + output_file = os.environ.get("GITHUB_OUTPUT") + if output_file: + with open(output_file, "a") as f: + f.write(f"{name}={value}\n") + + +def find_duplicate_names(data): + """Find duplicate service names within the same section.""" + duplicates = [] + for cat in data.get("categories", []): + cn = cat.get("name", "") + for sec in cat.get("sections", []): + sn = sec.get("name", "") + seen = {} + for svc in sec.get("services", []): + name = svc.get("name", "") + if name in seen: + duplicates.append((cn, sn, name)) + else: + seen[name] = True + return duplicates + + +def fmt_path(key): + """Format a tuple key as a readable path.""" + return " → ".join(key) if isinstance(key, tuple) else key + + +def format_diff_bullets(diff_result): + """Build bullet-point lines summarizing all changes. Returns list of strings or empty list.""" + bullets = [] + + for svc in diff_result["services"]["added"]: + bullets.append(f"- Added **{svc['service']}** in {svc['category']} → {svc['section']}") + for svc in diff_result["services"]["removed"]: + bullets.append(f"- Removed **{svc['service']}** from {svc['category']} → {svc['section']}") + for svc in diff_result["services"]["modified"]: + fields = ", ".join(f"`{f}`" for f in svc["changed_fields"]) + bullets.append(f"- Modified {fields} in {svc['category']} → {svc['section']} → {svc['service']}") + for change in diff_result["sections"]: + ct = change["change_type"] + path = f"{change['category']} → {change['section']}" + if ct == "added_section": + bullets.append(f"- Added section **{change['section']}** in {change['category']}") + elif ct == "removed_section": + bullets.append(f"- Removed section **{change['section']}** from {change['category']}") + else: + fields = ", ".join(f"`{f}`" for f in change.get("changed_fields", [])) + bullets.append(f"- Modified section metadata ({fields}) in {path}") + for change in diff_result["categories"]: + if change["change_type"] == "added_category": + bullets.append(f"- Added category **{change['category']}**") + else: + bullets.append(f"- Removed category **{change['category']}**") + for dup in diff_result.get("duplicates", []): + bullets.append( + f"- ⚠️ Duplicate service name **{dup['service']}** " + f"in {dup['category']} → {dup['section']}" + ) + + return bullets + + +def write_diff_summary(diff_result): + """Write the bullet-point summary to a file for downstream consumers.""" + bullets = format_diff_bullets(diff_result) + if bullets: + with open(SUMMARY_OUTPUT_PATH, "w") as f: + f.write("\n".join(bullets) + "\n") + + +def write_step_summary(diff_result): + """Write a bullet-point Markdown summary to $GITHUB_STEP_SUMMARY.""" + summary_file = os.environ.get("GITHUB_STEP_SUMMARY") + if not summary_file: + return + + bullets = format_diff_bullets(diff_result) + lines = ["## YAML Diff Analysis\n"] + if bullets: + lines.extend(bullets) + else: + lines.append("No changes detected in `awesome-privacy.yml`.") + + with open(summary_file, "a") as f: + f.write("\n".join(lines) + "\n") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--base-ref", required=True) + args = parser.parse_args() + + base = load_base_yaml(args.base_ref) + head = load_head_yaml() + + svc_added, svc_removed, svc_modified = diff_index( + build_index(base, 3), build_index(head, 3), + ) + sec_added, sec_removed, sec_modified = diff_index( + build_index(base, 2), build_index(head, 2), + ) + cat_added, cat_removed, _ = diff_index( + build_index(base, 1), build_index(head, 1), + ) + + added = [{"category": k[0], "section": k[1], "service": k[2], + "fields": build_index(head, 3)[k]} for k in svc_added] + removed = [{"category": k[0], "section": k[1], "service": k[2]} for k in svc_removed] + modified = [{"category": k[0], "section": k[1], "service": k[2], + "changed_fields": cf} for k, cf in svc_modified] + + sections = [] + for k in sec_added: + sections.append({"category": k[0], "section": k[1], "change_type": "added_section"}) + for k in sec_removed: + sections.append({"category": k[0], "section": k[1], "change_type": "removed_section"}) + for k, cf in sec_modified: + sections.append({"category": k[0], "section": k[1], + "change_type": "modified_section_metadata", "changed_fields": cf}) + + categories = [] + for k in cat_added: + categories.append({"category": k, "change_type": "added_category"}) + for k in cat_removed: + categories.append({"category": k, "change_type": "removed_category"}) + + duplicates = find_duplicate_names(head) + dup_entries = [{"category": d[0], "section": d[1], "service": d[2]} + for d in duplicates] + + diff_result = { + "services": {"added": added, "removed": removed, "modified": modified}, + "sections": sections, + "categories": categories, + "duplicates": dup_entries, + } + + with open(DIFF_OUTPUT_PATH, "w") as f: + json.dump(diff_result, f, indent=2) + + write_github_output("has_service_changes", str(bool(added or removed or modified)).lower()) + write_step_summary(diff_result) + write_diff_summary(diff_result) + + added_count = len(added) + if added_count > 1: + print(red(f"Single-entry rule violation: {added_count} service additions found."), file=sys.stderr) + sys.exit(EXIT_RULE_VIOLATION) + added_sections = [s for s in sections if s["change_type"] == "added_section"] + if added_count == 0 and len(added_sections) > 1: + print(red(f"Single-entry rule violation: {len(added_sections)} section additions found."), file=sys.stderr) + sys.exit(EXIT_RULE_VIOLATION) + + if duplicates: + names = ", ".join(f"{d[2]} (in {d[0]} → {d[1]})" for d in duplicates) + print(red(f"Duplicate service names found: {names}"), file=sys.stderr) + sys.exit(EXIT_RULE_VIOLATION) + + total = len(added) + len(removed) + len(modified) + print(green(f"Single-entry rule passed. {total} service " + f"({added_count} added), {len(sections)} section, " + f"{len(categories)} category change(s).")) + sys.exit(EXIT_PASS) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/detect-changes.py b/lib/checks/detect-changes.py new file mode 100644 index 0000000..9fa591d --- /dev/null +++ b/lib/checks/detect-changes.py @@ -0,0 +1,46 @@ +""" +Detects which files changed between the PR base and HEAD. +Sets GitHub Actions output: yaml_changed. +""" + +import argparse +import os +import subprocess +import sys + +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +YAML_FILE = "awesome-privacy.yml" + + +def write_github_output(name, value): + output_file = os.environ.get("GITHUB_OUTPUT") + if output_file: + with open(output_file, "a") as f: + f.write(f"{name}={value}\n") + + +def main(): + parser = argparse.ArgumentParser(description="Detect changed files in a PR") + parser.add_argument("--base-ref", required=True, help="Base git ref to diff against") + args = parser.parse_args() + + result = subprocess.run( + ["git", "diff", "--name-only", f"{args.base_ref}..HEAD"], + capture_output=True, text=True, check=True, + cwd=PROJECT_ROOT, + ) + + changed_files = [f for f in result.stdout.strip().splitlines() if f] + + print("Changed files:") + for f in changed_files: + print(f" {f}") + + yaml_changed = YAML_FILE in changed_files + write_github_output("yaml_changed", str(yaml_changed).lower()) + print(f"yaml_changed={yaml_changed}") + + +if __name__ == "__main__": + main() diff --git a/lib/checks/format-comment.py b/lib/checks/format-comment.py new file mode 100644 index 0000000..64b47d6 --- /dev/null +++ b/lib/checks/format-comment.py @@ -0,0 +1,126 @@ +"""Aggregates findings from all check jobs into a formatted PR comment.""" + +import json +import os +import sys + +ARTIFACTS_DIR = "/tmp/artifacts" +OUTPUT_DIR = "/tmp/pr-meta" + +REPO_URL = "https://github.com/Lissy93/awesome-privacy" +CONTRIBUTING = f"{REPO_URL}/blob/main/.github/CONTRIBUTING.md" +DIFF_SUMMARY_PATH = os.path.join(ARTIFACTS_DIR, "pr-diff-summary.md") + + +def load_findings(filename): + """Load a findings JSON array from the artifacts directory, or empty list on error.""" + try: + with open(os.path.join(ARTIFACTS_DIR, filename)) as f: + data = json.load(f) + return data if isinstance(data, list) else [] + except Exception: + return [] + + +def collect_findings(): + """Gather all findings in display order: compliance, data, project.""" + all_findings = [] + all_findings.extend(load_findings("findings-compliance.json")) + all_findings.extend(load_findings("findings-data.json")) + all_findings.extend(load_findings("findings-project.json")) + return all_findings + + +def load_diff_summary(): + """Load the pre-formatted diff summary, or None if unavailable.""" + try: + with open(DIFF_SUMMARY_PATH) as f: + content = f.read().strip() + return content if content else None + except Exception: + return None + + +def format_comment(findings, user, changes_summary, run_id): + """Build the markdown comment.""" + parts = [ + f"<!-- pr-check-bot -->\nHello @{user}\n", + f"Thank you for contributing to Awesome Privacy! We will review your " + f"submission shortly. In the meantime, please ensure all changes are " + f"correct and inline with our [Contributing Requirements]({CONTRIBUTING}).\n", + ] + + if findings: + bullet_list = "\n".join(f"- {f}" for f in findings) + parts.append( + f"Our automated checks detected some issues:\n\n{bullet_list}\n\n" + f"> [!NOTE]\n" + f"> I am a bot, and sometimes make mistakes in my suggestions. " + f"But a human will review your submission shortly!" + ) + else: + parts.append("> ✅ All our automated checks have passed.") + + if changes_summary: + parts.append( + f"<details><summary>Summary of Changes:</summary>\n\n" + f"{changes_summary}\n</details>" + ) + + if run_id: + parts.append( + f'<sup>For full details, please see workflow run ' + f'<a href="{REPO_URL}/actions/runs/{run_id}">{run_id}</a></sup>' + ) + + return "\n\n".join(parts) + "\n" + + +def write_step_summary(findings): + """Write a summary to GITHUB_STEP_SUMMARY.""" + summary_file = os.environ.get("GITHUB_STEP_SUMMARY") + if not summary_file: + return + lines = ["## PR Check Summary\n"] + if findings: + lines.append(f"⚠️ Found {len(findings)} issue(s):\n") + for f in findings: + lines.append(f"- {f}") + else: + lines.append("✅ All checks passed.\n") + with open(summary_file, "a") as f: + f.write("\n".join(lines) + "\n") + + +def main(): + try: + user = os.environ.get("PR_USER", "contributor") + pr_number = os.environ.get("PR_NUMBER", "") + run_id = os.environ.get("RUN_ID", "") + + os.makedirs(OUTPUT_DIR, exist_ok=True) + + if pr_number: + with open(os.path.join(OUTPUT_DIR, "number.txt"), "w") as f: + f.write(pr_number) + if run_id: + with open(os.path.join(OUTPUT_DIR, "run-id.txt"), "w") as f: + f.write(run_id) + + findings = collect_findings() + with open(os.path.join(OUTPUT_DIR, "findings-count.txt"), "w") as f: + f.write(str(len(findings))) + changes_summary = load_diff_summary() + write_step_summary(findings) + + comment = format_comment(findings, user, changes_summary, run_id) + with open(os.path.join(OUTPUT_DIR, "comment.md"), "w") as f: + f.write(comment) + except Exception: + pass + + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/lib/checks/prepare-comment.py b/lib/checks/prepare-comment.py new file mode 100644 index 0000000..da7b477 --- /dev/null +++ b/lib/checks/prepare-comment.py @@ -0,0 +1,169 @@ +"""Decides whether to create, update, or skip the PR bot comment. + +Reads: + pr-meta/comment.md — new comment from format-comment.py + pr-meta/findings-count.txt — number of findings (from format-comment.py) + pr-meta/existing-comment.md — current bot comment on the PR (from workflow) + +Writes: + pr-meta/action.txt — "create", "update", or "skip" + pr-meta/final-comment.md — the body to post or update with +""" + +import os +import re + +WORK_DIR = "pr-meta" + + +def read_file(path): + """Read a file and return its stripped content, or None if missing/empty.""" + try: + with open(path) as f: + content = f.read().strip() + return content if content else None + except Exception: + return None + + +def read_findings_count(new_body): + """Return the findings count from findings-count.txt, or by counting bullets.""" + raw = read_file(os.path.join(WORK_DIR, "findings-count.txt")) + if raw is not None: + try: + return int(raw) + except ValueError: + pass + # Fallback: count bullet lines before <details> (diff summary has its own bullets) + body_before_details = new_body.split("<details>")[0] + return len(re.findall(r"^- .+$", body_before_details, re.MULTILINE)) + + +def _was_already_passing(existing_body): + """Check if the most recent state in the comment is already all-clear.""" + # If there's a previous "all passing" edit, the last state was passing + if re.search(r"^(?:\*\*)?Edit(?: \d+)?(?:\*\*)?: (?:- )?All checks are (now passing|passing now)", existing_body, re.MULTILINE): + return True + # If there are no edits at all, check the original comment body + if not re.search(r"^(?:\*\*)?Edit(?: \d+)?(?:\*\*)?:", existing_body, re.MULTILINE): + return "All our automated checks have passed" in existing_body + return False + + +def _previous_failing_count(existing_body): + """Extract the findings count from the most recent state in the comment.""" + # Check edit lines first (most recent state) + matches = re.findall(r"^(?:\*\*)?Edit(?: \d+)?(?:\*\*)?: (?:- )?(\d+) checks? (?:is|are) still failing", existing_body, re.MULTILINE) + if matches: + return int(matches[-1]) + # No edits — count bullets in the original comment (before <details>) + if not re.search(r"^(?:\*\*)?Edit(?: \d+)?(?:\*\*)?:", existing_body, re.MULTILINE): + body_before_details = existing_body.split("<details>")[0] + bullets = re.findall(r"^- .+$", body_before_details, re.MULTILINE) + return len(bullets) if bullets else None + return None + + +def _extract_pr_author(existing_body): + """Extract the PR author username from the 'Hello @user' greeting.""" + match = re.search(r"Hello @([\w-]+)", existing_body) + return match.group(1) if match else None + + +def build_edit_line(existing_body, findings_count, check_run_id, repo): + """Build the edit line to append, or None if nothing to do.""" + run_tag = f"<!-- run:{check_run_id} -->" + + # Idempotency: this run was already processed + if run_tag in existing_body: + return None + + # Skip if the state hasn't changed + if findings_count == 0 and _was_already_passing(existing_body): + return None + if findings_count > 0 and _previous_failing_count(existing_body) == findings_count: + return None + + # Count previous edits to determine the next number + edits = re.findall(r"^(?:\*\*)?Edit(?: \d+)?(?:\*\*)?:", existing_body, re.MULTILINE) + edit_count = len(edits) + next_edit = edit_count + 1 + + run_url = f"https://github.com/{repo}/actions/runs/{check_run_id}" + + # Build resolved-issue prefix + prev_count = _previous_failing_count(existing_body) + resolved_prefix = "" + if prev_count is not None and prev_count > findings_count: + resolved = prev_count - findings_count + noun = "issue was" if resolved == 1 else "issues were" + resolved_prefix = f"{resolved} {noun} resolved, but " + + if findings_count == 0: + edit_label = "**Edit:**" if edit_count == 0 else f"**Edit {next_edit}:**" + line = f"{edit_label} - All checks are now passing \U0001f389, see [here]({run_url}) for details {run_tag}" + # Add thank-you when transitioning from failures to passing + if prev_count is not None and prev_count > 0: + author = _extract_pr_author(existing_body) + if author: + line += ( + f"\n\nThank you @{author} for fixing those issues! \U0001f607\n" + f"This PR is now ready for human review, looping in @Lissy93 \U0001fae1" + ) + return line + + verb = "check is" if findings_count == 1 else "checks are" + edit_label = f"**Edit {next_edit}:**" + return ( + f"{edit_label} - {resolved_prefix}{findings_count} {verb} still failing, " + f"see [here]({run_url}) for details {run_tag}" + ) + + +def write_output(action, body=""): + """Write action.txt and (optionally) final-comment.md.""" + os.makedirs(WORK_DIR, exist_ok=True) + with open(os.path.join(WORK_DIR, "action.txt"), "w") as f: + f.write(action) + if body: + with open(os.path.join(WORK_DIR, "final-comment.md"), "w") as f: + f.write(body) + + +def main(): + check_run_id = os.environ.get("CHECK_RUN_ID", "") + repo = os.environ.get("GITHUB_REPOSITORY", "") + + new_body = read_file(os.path.join(WORK_DIR, "comment.md")) + if not new_body: + write_output("skip") + return + + existing_body = read_file(os.path.join(WORK_DIR, "existing-comment.md")) + + # No existing comment — create a new one + if not existing_body: + write_output("create", new_body) + return + + # Existing comment — build an edit line to append + if not check_run_id: + write_output("skip") + return + + findings_count = read_findings_count(new_body) + edit_line = build_edit_line(existing_body, findings_count, check_run_id, repo) + + if not edit_line: + write_output("skip") + return + + if "### Updates" in existing_body: + updated = existing_body.rstrip() + "\n" + edit_line + else: + updated = existing_body.rstrip() + "\n\n---\n\n### Updates\n\n" + edit_line + write_output("update", updated) + + +if __name__ == "__main__": + main() diff --git a/lib/requirements.txt b/lib/requirements.txt index 5a0d1aa..f59b908 100644 --- a/lib/requirements.txt +++ b/lib/requirements.txt @@ -1,5 +1,3 @@ PyYAML==6.0.1 -requests==2.31.0 -jsonschema -pyyaml -termcolor +jsonschema==4.23.0 +requests==2.32.3 diff --git a/lib/schema.json b/lib/schema.json index 19ab787..2ca04d2 100644 --- a/lib/schema.json +++ b/lib/schema.json @@ -7,38 +7,64 @@ "items": { "type": "object", "properties": { - "name": { "type": "string" }, + "name": { "type": "string", "minLength": 1, "maxLength": 50 }, "sections": { "type": "array", "items": { "type": "object", "properties": { - "name": { "type": "string" }, + "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "services": { "type": "array", "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "url": { "type": "string" }, - "github": { "type": "string", "nullable": true }, - "icon": { "type": "string", "nullable": true }, - "followWith": { "type": "string", "nullable": true }, - "securityAudited": { "type": "boolean", "nullable": true }, - "openSource": { "type": "boolean", "nullable": true }, - "acceptsCrypto": { "type": "boolean", "nullable": true }, - "tosdrId": { "type": "number", "nullable": true }, - "iosApp": { "type": "string", "nullable": true }, - "androidApp": { "type": "string", "nullable": true }, - "discordInvite": { "type": "string", "nullable": true }, - "subreddit": { "type": "string", "nullable": true } + "name": { "type": "string", "minLength": 1, "maxLength": 100 }, + "description": { "type": "string", "minLength": 10, "maxLength": 1500 }, + "url": { + "type": "string", + "anyOf": [ + { "pattern": "^https?://" }, + { "maxLength": 0 } + ] + }, + "github": { + "type": ["string", "null"], + "pattern": "^([a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+|https://github\\.com/.+)$" + }, + "icon": { + "type": ["string", "null"], + "pattern": "^https?://.+" + }, + "followWith": { "type": ["string", "null"], "minLength": 1, "maxLength": 100 }, + "securityAudited": { "type": ["boolean", "null"] }, + "openSource": { "type": ["boolean", "null"] }, + "acceptsCrypto": { "type": ["boolean", "null"] }, + "tosdrId": { "type": ["integer", "null"], "minimum": 1 }, + "iosApp": { + "type": ["string", "null"], + "pattern": "^https://apps\\.apple\\.com/" + }, + "androidApp": { + "type": ["string", "null"], + "pattern": "^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$" + }, + "discordInvite": { + "type": ["string", "null"], + "pattern": "^(https://discord\\.gg/[a-zA-Z0-9]+|[a-zA-Z0-9]+|)$" + }, + "subreddit": { + "type": ["string", "null"], + "pattern": "^[a-zA-Z0-9_]+$", + "minLength": 1, + "maxLength": 50 + } }, "required": ["name", "description", "url"], "additionalProperties": false } }, - "intro": { "type": "string", "nullable": true }, + "intro": { "type": ["string", "null"], "minLength": 1 }, "notableMentions": { "oneOf": [ { @@ -46,24 +72,29 @@ "items": { "type": "object", "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "url": { "type": "string" } + "name": { "type": "string", "minLength": 1, "maxLength": 100 }, + "description": { "type": "string", "minLength": 1 }, + "url": { "type": "string", "pattern": "^https?://" } }, "required": ["name", "url"], "additionalProperties": false } }, - { "type": "string" } - ], - "nullable": true + { "type": "string", "minLength": 1 }, + { "type": "null" } + ] }, - "furtherInfo": { "type": "string", "nullable": true }, - "wordOfWarning": { "type": "string", "nullable": true }, + "furtherInfo": { "type": ["string", "null"], "minLength": 1 }, + "wordOfWarning": { "type": ["string", "null"], "minLength": 1 }, "alternativeTo": { - "type": "array", - "items": { "type": "string" }, - "nullable": true + "oneOf": [ + { + "type": "array", + "items": { "type": "string", "minLength": 1, "maxLength": 100 }, + "minItems": 1 + }, + { "type": "null" } + ] } }, "required": ["name", "services"], diff --git a/lib/validate-awesome-privacy.py b/lib/validate-awesome-privacy.py index 83b26cd..ea7fa35 100644 --- a/lib/validate-awesome-privacy.py +++ b/lib/validate-awesome-privacy.py @@ -1,85 +1,112 @@ import json import os import sys -import logging + import yaml -from termcolor import colored from jsonschema import Draft7Validator -# Configure Logging -LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() -logging.basicConfig(level=LOG_LEVEL) -logger = logging.getLogger(__name__) +# Paths (relative to project root) +PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATA_PATH = os.path.join(PROJECT_ROOT, "awesome-privacy.yml") +SCHEMA_PATH = os.path.join(PROJECT_ROOT, "lib/schema.json") + +# Exit codes +EXIT_VALID = 0 +EXIT_VALIDATION_ERRORS = 1 +EXIT_RUNTIME_ERROR = 2 + +MAX_ERRORS = 20 + +# ANSI color helpers (disabled when NO_COLOR is set or stderr is not a TTY) +_use_color = sys.stderr.isatty() and not os.environ.get("NO_COLOR") +red = (lambda s: f"\033[31m{s}\033[0m") if _use_color else (lambda s: s) +green = (lambda s: f"\033[32m{s}\033[0m") if _use_color else (lambda s: s) +yellow = (lambda s: f"\033[33m{s}\033[0m") if _use_color else (lambda s: s) +dim = (lambda s: f"\033[2m{s}\033[0m") if _use_color else (lambda s: s) -# Determine the project root based on the script's location -project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -awesome_privacy_path = os.path.join(project_root, 'awesome-privacy.yml') -schema_path = os.path.join(project_root, 'lib/schema.json') +def resolve_path(data, path_parts): + """Walk the data along path_parts, replacing indices with 'name' values.""" + segments = [] + current = data + for part in path_parts: + if isinstance(current, dict) and part in current: + current = current[part] + if isinstance(current, dict) and "name" in current: + segments.append(current["name"]) + elif not isinstance(part, int): + pass # skip dict keys like 'categories', 'sections', 'services' + elif isinstance(current, list) and isinstance(part, int) and part < len(current): + current = current[part] + if isinstance(current, dict) and "name" in current: + segments.append(current["name"]) + else: + segments.append(str(part)) + else: + segments.append(str(part)) + break + return " > ".join(segments) if segments else "(root)" -# Log method, accepts a message and optional log level -# and prints the output to the terminal in right color -def loggy(message: str, level: str = 'debug'): - if level == "info": - logger.info(colored(message, 'blue')) - elif level == "warning": - logger.warning(colored(message, 'yellow')) - elif level == "error": - logger.error(colored(message, 'red')) - elif level == "success": - logger.info(colored(message, 'green')) - elif level == "debug": - logger.debug(colored(message, 'grey')) - - -# Loads a given YAML file and returns the data -def load_yaml(yaml_path: str): - loggy(f"Loading YAML from {yaml_path}", "info") +def load_yaml(path): try: - with open(yaml_path, 'r') as file: - return yaml.safe_load(file) + with open(path, "r") as f: + return yaml.safe_load(f) + except FileNotFoundError: + print(red(f"File not found: {path}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) except yaml.YAMLError as e: - loggy(f"Failed to load YAML: {e}", "error") - sys.exit(1) + print(red(f"Failed to parse YAML: {e}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) -# Loads a given JSON Schema file and returns the data -def load_schema(schema_path: str): - loggy(f"Loading JSON Schema from {schema_path}", "info") +def load_schema(path): try: - with open(schema_path, 'r') as file: - return json.load(file) + with open(path, "r") as f: + return json.load(f) + except FileNotFoundError: + print(red(f"File not found: {path}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) except json.JSONDecodeError as e: - loggy(f"Failed to load JSON Schema: {e}", "error") - sys.exit(1) + print(red(f"Failed to parse JSON schema: {e}"), file=sys.stderr) + sys.exit(EXIT_RUNTIME_ERROR) -# Validates the given YAML data against the given JSON Schema -def validate_yaml(data, schema): - loggy("Beginning validation", "info") +def validate(data, schema): validator = Draft7Validator(schema) - errors = sorted(validator.iter_errors(data), key=lambda e: e.path) - if errors: - for error in errors: - error_location = "->".join(map(str, error.path)) - loggy(f"Validation error: {error.message} (at {error_location})", "warning") - return False - return True + errors = sorted(validator.iter_errors(data), key=lambda e: list(e.path)) + formatted = [] + for error in errors: + location = resolve_path(data, list(error.path)) + formatted.append(f"{location}: {error.message}") + return formatted -# Main method def main(): - loggy("Starting...", "info") - yaml_data = load_yaml(awesome_privacy_path) - schema = load_schema(schema_path) + data = load_yaml(DATA_PATH) + schema = load_schema(SCHEMA_PATH) + errors = validate(data, schema) - if validate_yaml(yaml_data, schema): - loggy("Validation successful!", "success") - sys.exit(0) - else: - loggy("Validation failed.", "error") - sys.exit(1) + if errors: + shown = errors[:MAX_ERRORS] + for msg in shown: + print(red("ERROR") + " " + msg, file=sys.stderr) + if len(errors) > MAX_ERRORS: + print(dim(f"...and {len(errors) - MAX_ERRORS} more"), file=sys.stderr) + print(red(f"Validation failed: {len(errors)} error(s)"), file=sys.stderr) + sys.exit(EXIT_VALIDATION_ERRORS) + + # Gather stats + categories = data.get("categories", []) + num_categories = len(categories) + num_sections = sum(len(c.get("sections", [])) for c in categories) + num_services = sum( + len(s.get("services", [])) + for c in categories + for s in c.get("sections", []) + ) + print(green(f"Valid! {num_categories} categories, {num_sections} sections, {num_services} services")) + sys.exit(EXIT_VALID) if __name__ == "__main__": diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..57bda5a --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true + +[*.astro] +indent_style = tab + +[*.{ts,js,svelte,scss,json}] +indent_style = space +indent_size = 2 diff --git a/web/.gitignore b/web/.gitignore index b8a4815..d333b9f 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -19,3 +19,5 @@ dist/ # macOS crap .DS_Store + +.vscode/ diff --git a/web/.nvmrc b/web/.nvmrc new file mode 100644 index 0000000..0a49261 --- /dev/null +++ b/web/.nvmrc @@ -0,0 +1 @@ +24.11.0 diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 0000000..21560d1 --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,17 @@ +dist/ +.astro/ +node_modules/ +.vercel/ +yarn.lock +public/ +*.md + +# Astro files with adjacent JSX elements that prettier-plugin-astro cannot parse +src/components/things/DockerDetailedInfo.astro +src/components/things/GitHubDetailedInfo.astro +src/components/things/IosAppDetailedInfo.astro +src/components/things/ItemGitHubMetrics.astro +src/components/things/PrivacyPolicyDetails.astro +src/components/things/WebsiteDetailedInfo.astro +src/pages/*section*.astro +src/pages/all.astro diff --git a/web/.prettierrc b/web/.prettierrc new file mode 100644 index 0000000..47f5a56 --- /dev/null +++ b/web/.prettierrc @@ -0,0 +1,22 @@ +{ + "useTabs": true, + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "plugins": ["prettier-plugin-astro", "prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + }, + { + "files": ["*.ts", "*.js", "*.svelte", "*.scss"], + "options": { + "useTabs": false, + "tabWidth": 2 + } + } + ] +} diff --git a/web/.vscode/extensions.json b/web/.vscode/extensions.json deleted file mode 100644 index 22a1505..0000000 --- a/web/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "recommendations": ["astro-build.astro-vscode"], - "unwantedRecommendations": [] -} diff --git a/web/.vscode/launch.json b/web/.vscode/launch.json deleted file mode 100644 index d642209..0000000 --- a/web/.vscode/launch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "command": "./node_modules/.bin/astro dev", - "name": "Development server", - "request": "launch", - "type": "node-terminal" - } - ] -} diff --git a/web/.yarnrc.yml b/web/.yarnrc.yml index 651c1d1..41a8cf6 100644 --- a/web/.yarnrc.yml +++ b/web/.yarnrc.yml @@ -1,9 +1,9 @@ npmScopes: fortawesome: npmAlwaysAuth: true - npmRegistryServer: "https://npm.fontawesome.com/" + npmRegistryServer: 'https://npm.fontawesome.com/' npmAuthToken: ECB95473-FBAF-463F-905C-C9ED4C00D519 awesome: npmAlwaysAuth: true - npmRegistryServer: "https://npm.fontawesome.com/" + npmRegistryServer: 'https://npm.fontawesome.com/' npmAuthToken: ECB95473-FBAF-463F-905C-C9ED4C00D519 diff --git a/web/astro.config.mjs b/web/astro.config.mjs index 496e7bc..471a2bf 100644 --- a/web/astro.config.mjs +++ b/web/astro.config.mjs @@ -4,6 +4,7 @@ import { defineConfig } from 'astro/config'; import svelte from '@astrojs/svelte'; import partytown from '@astrojs/partytown'; import sitemap from '@astrojs/sitemap'; +import { printSummary } from './src/utils/logger.ts'; // Adapters import vercelAdapter from '@astrojs/vercel/serverless'; @@ -21,17 +22,36 @@ const output = import.meta.env.OUTPUT || 'hybrid'; const site = import.meta.env.SITE_URL || 'https://awesome-privacy.xyz'; // Initialize Astro integrations -const integrations = [svelte(), partytown(), sitemap()]; +const buildLogger = { + name: 'build-logger', + hooks: { + 'astro:build:done': () => printSummary(), + }, +}; + +const integrations = [svelte(), partytown(), sitemap(), buildLogger]; // Set the appropriate adapter, based on the deploy target const adapter = { - vercel: vercelAdapter, - netlify: netlifyAdapter, - cloudflare: cloudflareAdapter, - node: nodeAdapter({ - mode: 'standalone', - }), + vercel: vercelAdapter, + netlify: netlifyAdapter, + cloudflare: cloudflareAdapter, + node: nodeAdapter({ + mode: 'standalone', + }), }[deployTarget](); // Export Astro configuration -export default defineConfig({ output, integrations, site, adapter }); +export default defineConfig({ + output, + integrations, + site, + adapter, + vite: { + css: { + preprocessorOptions: { + scss: { api: 'modern' }, + }, + }, + }, +}); diff --git a/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 0000000..f33aae6 --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,80 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintPluginAstro from 'eslint-plugin-astro'; +import eslintPluginSvelte from 'eslint-plugin-svelte'; +import svelteParser from 'svelte-eslint-parser'; +import eslintConfigPrettier from 'eslint-config-prettier'; +import globals from 'globals'; + +export default [ + // Global ignores + { ignores: ['dist/', '.astro/', 'node_modules/', '.vercel/'] }, + + // Base JS config + js.configs.recommended, + + // TypeScript + ...tseslint.configs.recommended, + + // Astro + ...eslintPluginAstro.configs.recommended, + + // Svelte — with TypeScript parser for <script lang="ts"> + ...eslintPluginSvelte.configs['flat/recommended'].map((config) => + config.files + ? { + ...config, + languageOptions: { + ...config.languageOptions, + parser: svelteParser, + parserOptions: { + ...config.languageOptions?.parserOptions, + parser: tseslint.parser, + }, + }, + } + : config, + ), + + // Global settings + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + '@typescript-eslint/no-unused-expressions': 'off', + 'no-console': 'off', + 'no-case-declarations': 'off', + 'no-useless-assignment': 'warn', + }, + }, + + // Allow triple-slash references in env.d.ts (Astro convention) + { + files: ['src/env.d.ts'], + rules: { + '@typescript-eslint/triple-slash-reference': 'off', + }, + }, + + // Lenient Svelte rules — existing code uses these patterns intentionally + { + files: ['**/*.svelte'], + rules: { + 'svelte/no-at-html-tags': 'warn', + 'svelte/require-each-key': 'warn', + 'svelte/no-dom-manipulating': 'warn', + }, + }, + + // Prettier must be last to override conflicting rules + eslintConfigPrettier, +]; diff --git a/web/package.json b/web/package.json index 5af9986..ef4393c 100644 --- a/web/package.json +++ b/web/package.json @@ -1,37 +1,70 @@ { - "name": "web", - "type": "module", - "version": "0.0.1", - "scripts": { - "dev": "astro dev", - "start": "astro preview", - "build": "astro check && astro build", - "astro": "astro" - }, - "dependencies": { - "@astrojs/check": "^0.5.4", - "@astrojs/netlify": "^5.1.2", - "@astrojs/partytown": "^2.0.4", - "@astrojs/sitemap": "^3.1.0", - "@astrojs/svelte": "^5.0.3", - "@astrojs/vercel": "^7.3.2", - "@fortawesome/fontawesome-pro": "^6.5.1", - "@fortawesome/fontawesome-svg-core": "^6.5.1", - "@fortawesome/free-brands-svg-icons": "^6.5.1", - "@fortawesome/pro-solid-svg-icons": "^6.5.1", - "@fortawesome/svelte-fontawesome": "^0.2.2", - "astro": "^4.3.6", - "fuse.js": "^7.0.0", - "js-yaml": "^4.1.0", - "marked": "^12.0.0", - "svelte": "^4.2.11", - "typescript": "^5.3.3" - }, - "devDependencies": { - "@astrojs/cloudflare": "^9.0.1", - "@astrojs/node": "^8.2.1", - "@types/js-yaml": "^4.0.9", - "@types/node": "^20.11.19", - "sass": "^1.70.0" - } + "name": "web", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro preview", + "build": "astro check && astro build", + "astro": "astro", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write .", + "format:check": "prettier --check .", + "typecheck": "astro check", + "test": "vitest run", + "test:watch": "vitest", + "check:all": "astro check && eslint . && prettier --check . && vitest run" + }, + "dependencies": { + "@astrojs/check": "^0.9.6", + "@astrojs/netlify": "^5.5.4", + "@astrojs/partytown": "^2.1.4", + "@astrojs/sitemap": "3.5.1", + "@astrojs/svelte": "^5.7.3", + "@astrojs/vercel": "^7.8.2", + "@fortawesome/fontawesome-pro": "^6.5.1", + "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", + "@fortawesome/pro-solid-svg-icons": "^6.5.1", + "@fortawesome/svelte-fontawesome": "^0.2.2", + "astro": "^4.16.19", + "fuse.js": "^7.0.0", + "js-yaml": "^4.1.1", + "marked": "^12.0.2", + "svelte": "^4.2.19", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@astrojs/cloudflare": "^11.2.0", + "@astrojs/node": "^8.3.4", + "@eslint/js": "^10.0.1", + "@types/js-yaml": "^4.0.9", + "@types/node": "^20.11.19", + "eslint": "^10.0.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^1.6.0", + "eslint-plugin-svelte": "^3.15.0", + "globals": "^17.3.0", + "prettier": "^3.8.1", + "prettier-plugin-astro": "^0.14.1", + "prettier-plugin-svelte": "^3.5.0", + "sass": "^1.97.3", + "svelte-eslint-parser": "^1.5.1", + "typescript-eslint": "^8.56.1", + "vitest": "^4.0.18" + }, + "resolutions": { + "braces": ">=3.0.3", + "micromatch": ">=4.0.8", + "minimatch": ">=3.1.3", + "prismjs": ">=1.30.0", + "mdast-util-to-hast": ">=13.2.1", + "dset": ">=3.1.4", + "esbuild": ">=0.25.0", + "undici": ">=6.23.0", + "lodash": ">=4.17.23", + "**/js-yaml": ">=4.1.1", + "brace-expansion": ">=2.0.1" + } } diff --git a/web/src/components/Card.astro b/web/src/components/Card.astro index 7b1e813..147f7ba 100644 --- a/web/src/components/Card.astro +++ b/web/src/components/Card.astro @@ -21,19 +21,18 @@ const { href, title, body } = Astro.props; </li> <style lang="scss"> .link-card { - color: var(--foreground); - background: var(--background); - border: 2px solid var(--box-outline); - box-shadow: 6px 6px 0 var(--box-outline); - font-family: "Lekton", sans-serif; - font-weight: 700; + color: var(--foreground); + background: var(--background); + border: 2px solid var(--box-outline); + box-shadow: 6px 6px 0 var(--box-outline); + font-family: 'Lekton', sans-serif; + font-weight: 700; transition: all ease-in-out 0.1s; list-style: none; &:hover { box-shadow: 8px 8px 0 var(--box-outline); background: var(--accent); color: var(--background); - } a { box-sizing: border-box; @@ -45,5 +44,4 @@ const { href, title, body } = Astro.props; margin: 0; } } - </style> diff --git a/web/src/components/Hero.astro b/web/src/components/Hero.astro index a0e9b7c..0c32133 100644 --- a/web/src/components/Hero.astro +++ b/web/src/components/Hero.astro @@ -1,61 +1,60 @@ --- -import FontAwesome from "@components/form/FontAwesome.svelte" -import ThemeSwitcher from "@components/form/ThemeSwitcher.svelte" +import FontAwesome from '@components/form/FontAwesome.svelte'; +import ThemeSwitcher from '@components/form/ThemeSwitcher.svelte'; --- <div class="theme-switcher"> -<ThemeSwitcher client:load /> + <ThemeSwitcher client:load /> </div> <div class="hero"> - <h1>Awesome Privacy</h1> - <p class="intro"> - Your guide to finding and comparing privacy-respecting alternatives to popular software and services. - </p> - <div class="github-link-wrap"> - <a href="https://github.com/lissy93/awesome-privacy"> - <FontAwesome iconName="github" /> - View on GitHub - </a> - </div> + <h1>Awesome Privacy</h1> + <p class="intro"> + Your guide to finding and comparing privacy-respecting alternatives to + popular software and services. + </p> + <div class="github-link-wrap"> + <a href="https://github.com/lissy93/awesome-privacy"> + <FontAwesome iconName="github" /> + View on GitHub + </a> + </div> </div> <nav class="top-right"> - <ul> - <li> - <a href="/">Home</a> - </li> - <li> - <a href="/search">Search</a> - </li> - <li> - <a href="/browse">Browse</a> - </li> - <li> - <a href="/about">About</a> - </li> - <li> - <a href="https://github.com/lissy93/awesome-privacy">Source</a> - </li> - <li> - <a href="https://as93.net">More Apps</a> - </li> - </ul> + <ul> + <li> + <a href="/">Home</a> + </li> + <li> + <a href="/search">Search</a> + </li> + <li> + <a href="/browse">Browse</a> + </li> + <li> + <a href="/about">About</a> + </li> + <li> + <a href="https://github.com/lissy93/awesome-privacy">Source</a> + </li> + <li> + <a href="https://as93.net">More Apps</a> + </li> + </ul> </nav> - <style lang="scss"> - .hero { - color: var(--accent-fg); - border-radius: var(--curve-sm); - padding: 2rem 4rem; - display: flex; - flex-direction: column; - gap: 2rem; - @media(max-width: 768px) { - padding: 2rem 1rem; - } + color: var(--accent-fg); + border-radius: var(--curve-sm); + padding: 2rem 4rem; + display: flex; + flex-direction: column; + gap: 2rem; + @media (max-width: 768px) { + padding: 2rem 1rem; + } } svg { position: absolute; @@ -65,98 +64,97 @@ import ThemeSwitcher from "@components/form/ThemeSwitcher.svelte" width: 220px; height: auto; opacity: 0.6; - display: none; + display: none; } h1 { - margin: 0; + margin: 0; font-size: 5rem; font-weight: 700; line-height: 1; text-align: center; - font-family: 'Libre Franklin', sans-serif; - color: var(--accent-3); - -webkit-text-fill-color: var(--accent-3); - -webkit-text-stroke-width: 2px; - -webkit-text-stroke-color: var(--box-outline); - text-shadow: 3px 3px 0 var(--box-outline); - @media(max-width: 768px) { - font-size: 4rem; - } + font-family: 'Libre Franklin', sans-serif; + color: var(--accent-3); + -webkit-text-fill-color: var(--accent-3); + -webkit-text-stroke-width: 2px; + -webkit-text-stroke-color: var(--box-outline); + text-shadow: 3px 3px 0 var(--box-outline); + @media (max-width: 768px) { + font-size: 4rem; + } + } + .intro { + text-align: center; + font-size: 1.6rem; + padding: 0.5rem 1rem; + color: var(--accent-fg); + background: var(--accent-3); + border: 2px solid var(--box-outline); + border-radius: var(--curve-sm); + box-shadow: 6px 6px 0 var(--box-outline); + font-family: 'Lekton', sans-serif; + font-weight: 700; + max-width: 735px; + margin: 0 auto; + } + .github-link-wrap { + font-family: 'Lekton', sans-serif; + max-width: 735px; + text-align: center; + margin: 0 auto; + border: 1px solid var(--box-outline); + box-shadow: 3px 3px 0 var(--box-outline); + background: var(--accent); + border-radius: 18px; + padding: 0.5rem 1rem; + a { + text-decoration: none; + color: var(--accent-fg); + font-size: 1.2rem; + font-family: 'Lekton', sans-serif; + font-weight: bold; + display: flex; + align-items: center; + :global(svg) { + width: 1.5rem; + height: 1.5rem; + color: var(--accent-fg); + margin-right: 0.5rem; + } + } } - .intro { - text-align: center; - font-size: 1.6rem; - padding: 0.5rem 1rem; - color: var(--accent-fg); - background: var(--accent-3); - border: 2px solid var(--box-outline); - border-radius: var(--curve-sm); - box-shadow: 6px 6px 0 var(--box-outline); - font-family: "Lekton", sans-serif; - font-weight: 700; - max-width: 735px; - margin: 0 auto; - } - .github-link-wrap { - font-family: "Lekton", sans-serif; - max-width: 735px; - text-align: center; - margin: 0 auto; - border: 1px solid var(--box-outline); - box-shadow: 3px 3px 0 var(--box-outline); - background: var(--accent); - border-radius: 18px; - padding: 0.5rem 1rem; - a { - text-decoration: none; - color: var(--accent-fg);; - font-size: 1.2rem; - font-family: "Lekton", sans-serif; - font-weight: bold; - display: flex; - align-items: center; - :global(svg) { - width: 1.5rem; - height: 1.5rem; - color: var(--accent-fg); - margin-right: 0.5rem; - } - } - } - .theme-switcher { - position: absolute; - right: 1rem; - top: 1rem; - } + .theme-switcher { + position: absolute; + right: 1rem; + top: 1rem; + } - .top-right { - position: absolute; - top: 0; - right: 1rem; - opacity: 0.8; - display: none; - &:hover { - opacity: 1; - } - ul { - list-style: none; - display: flex; - padding: 0; - gap: 0.5rem; - li { - &:not(:last-child) { - border-right: 1px solid var(--accent); - padding-right: 0.5rem; - } - } - li a { - text-decoration: none; - &:hover { - text-decoration: underline; - } - } - } - } - + .top-right { + position: absolute; + top: 0; + right: 1rem; + opacity: 0.8; + display: none; + &:hover { + opacity: 1; + } + ul { + list-style: none; + display: flex; + padding: 0; + gap: 0.5rem; + li { + &:not(:last-child) { + border-right: 1px solid var(--accent); + padding-right: 0.5rem; + } + } + li a { + text-decoration: none; + &:hover { + text-decoration: underline; + } + } + } + } </style> diff --git a/web/src/components/form/Button.astro b/web/src/components/form/Button.astro index a2d9a26..d449306 100644 --- a/web/src/components/form/Button.astro +++ b/web/src/components/form/Button.astro @@ -1,37 +1,30 @@ --- - -const { - text, - url, - className, - title, -} = Astro.props; - +const { text, url, className, title } = Astro.props; --- <div class={`button ${className || ''}`} title={title}> - <a href={url}>{text}<slot /></a> + <a href={url}>{text}<slot /></a> </div> <style lang="scss"> - .button { - font-family: "Lekton", sans-serif; - text-align: center; - border: 1px solid var(--box-outline); - box-shadow: 3px 3px 0 var(--box-outline); - background: var(--accent); - border-radius: 18px; - padding: 0.5rem 1rem; - transition: all 0.2s ease-in-out; - &:hover { - box-shadow: 4px 4px 0 var(--box-outline); - } - a { - text-decoration: none; - color: var(--accent-fg);; - font-size: 1.2rem; - font-family: "Lekton", sans-serif; - font-weight: bold; - } - } + .button { + font-family: 'Lekton', sans-serif; + text-align: center; + border: 1px solid var(--box-outline); + box-shadow: 3px 3px 0 var(--box-outline); + background: var(--accent); + border-radius: 18px; + padding: 0.5rem 1rem; + transition: all 0.2s ease-in-out; + &:hover { + box-shadow: 4px 4px 0 var(--box-outline); + } + a { + text-decoration: none; + color: var(--accent-fg); + font-size: 1.2rem; + font-family: 'Lekton', sans-serif; + font-weight: bold; + } + } </style> diff --git a/web/src/components/form/EditableTitle.svelte b/web/src/components/form/EditableTitle.svelte index ee9b999..816e9b2 100644 --- a/web/src/components/form/EditableTitle.svelte +++ b/web/src/components/form/EditableTitle.svelte @@ -41,25 +41,27 @@ } </script> -<svelte:window on:click={handleClickOutside}/> +<svelte:window on:click={handleClickOutside} /> <!-- svelte-ignore a11y-no-noninteractive-tabindex --> <div> -<h2 - contenteditable={true} - class:editable={editing} - on:click={() => editing = true} - on:keydown={handleKeydown} - on:blur={() => saveTitle(title)} - tabindex="0" ->{title}</h2> + <h2 + contenteditable={true} + class:editable={editing} + on:click={() => (editing = true)} + on:keydown={handleKeydown} + on:blur={() => saveTitle(title)} + tabindex="0" + > + {title} + </h2> -<small>Click the title, to edit your inventory name</small> + <small>Click the title, to edit your inventory name</small> </div> <style> h2 { - font-family: "Lekton", sans-serif; + font-family: 'Lekton', sans-serif; font-weight: bold; font-size: 3rem; margin: 0; diff --git a/web/src/components/form/FontAwesome.svelte b/web/src/components/form/FontAwesome.svelte index c18ff55..488e544 100644 --- a/web/src/components/form/FontAwesome.svelte +++ b/web/src/components/form/FontAwesome.svelte @@ -4,7 +4,6 @@ import * as brands from '@fortawesome/free-brands-svg-icons'; import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'; - export const iconMap: Record<string, IconDefinition> = { // Branding logo: solidIcons.faEyeSlash, @@ -83,13 +82,8 @@ }; export let iconName: string; - </script> {#if iconMap[iconName]} - <FontAwesomeIcon - class="fa-icon" - icon={iconMap[iconName]} /> + <FontAwesomeIcon class="fa-icon" icon={iconMap[iconName]} /> {/if} - - diff --git a/web/src/components/form/Icon.astro b/web/src/components/form/Icon.astro index bbc1623..bfcdc00 100644 --- a/web/src/components/form/Icon.astro +++ b/web/src/components/form/Icon.astro @@ -1,73 +1,84 @@ --- - interface IconProps { - icon: string; - color?: string; - class?: string; - width?: number; - height?: number; + icon: string; + color?: string; + class?: string; + width?: number; + height?: number; } const getSvgPath = (icon: string) => { - switch (icon) { - case 'star': - return { - vb: "0 0 24 24", - path: "M10 15l-5.5 3 1-5.5L0 7.5l5.6-0.5L10 2l2 5 5.5 0.5-4 4 1 5.5z", - }; - case 'mastodon': - return { - vb: "0 0 512 512", - path: "M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5 0 0 1 -.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.3V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z", - }; - case 'twitter': - return { - vb: "0 0 512 512", - path: "M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z", - }; - case 'hub': - return { - vb: "0 0 512 512", - path: "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z", - }; - case 'dev': - return { - vb: "0 0 512 512", - path: "M120.1 208.3c-3.9-2.9-7.8-4.4-11.7-4.4H91v104.5h17.5c3.9 0 7.8-1.5 11.7-4.4 3.9-2.9 5.8-7.3 5.8-13.1v-69.7c0-5.8-2-10.2-5.8-13.1zM404.1 32H43.9C19.7 32 .1 51.6 0 75.8v360.4C.1 460.4 19.7 480 43.9 480h360.2c24.2 0 43.8-19.6 43.9-43.8V75.8c-.1-24.2-19.7-43.8-43.9-43.8zM154.2 291.2c0 18.8-11.6 47.3-48.4 47.3h-46.4V173h47.4c35.4 0 47.4 28.5 47.4 47.3l0 70.9zm100.7-88.7H201.6v38.4h32.6v29.6H201.6v38.4h53.3v29.6h-62.2c-11.2 .3-20.4-8.5-20.7-19.7V193.7c-.3-11.2 8.6-20.4 19.7-20.7h63.2l0 29.5zm103.6 115.3c-13.2 30.8-36.9 24.6-47.4 0l-38.5-144.8h32.6l29.7 113.7 29.6-113.7h32.6l-38.5 144.8z", - }; - case 'linkedin': - return { - vb: "0 0 512 512", - path: "M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z", - }; - case 'essentials': - return { - vb: "0 0 512 512", - path: "M208 176c0-70.7 57.3-128 128-128s128 57.3 128 128s-57.3 128-128 128c-10.4 0-20.5-1.2-30.1-3.6c-8.1-2-16.7 .4-22.6 6.4L254.1 336H200c-13.3 0-24 10.7-24 24v40H136c-13.3 0-24 10.7-24 24v40H48V385.9L205.2 228.7c5.9-5.9 8.3-14.5 6.4-22.6c-2.3-9.6-3.6-19.7-3.6-30.1zM336 0C238.8 0 160 78.8 160 176c0 9.5 .7 18.8 2.2 27.9L7 359c-4.5 4.5-7 10.6-7 17V488c0 13.3 10.7 24 24 24H136c13.3 0 24-10.7 24-24V448h40c13.3 0 24-10.7 24-24V384h40c6.4 0 12.5-2.5 17-7l27.2-27.2c9.1 1.4 18.4 2.2 27.9 2.2c97.2 0 176-78.8 176-176S433.2 0 336 0zm32 176a32 32 0 1 0 0-64 32 32 0 1 0 0 64z", - }; - case 'communication': - return { - vb: "0 0 640 512", - path: "M48 72c0-13.3 10.7-24 24-24H344c13.3 0 24 10.7 24 24V248c0 13.3-10.7 24-24 24H216c-4.7 0-9.4 1.4-13.3 4L144 315.2V296c0-13.3-10.7-24-24-24H72c-13.3 0-24-10.7-24-24V72zM72 0C32.2 0 0 32.2 0 72V248c0 39.8 32.2 72 72 72H96v40c0 8.9 4.9 17 12.7 21.2s17.3 3.7 24.6-1.2l90-60H344c39.8 0 72-32.2 72-72V72c0-39.8-32.2-72-72-72H72zM256 376c0 39.8 32.2 72 72 72h88.7l90 60c7.4 4.9 16.8 5.4 24.6 1.2S544 496.9 544 488V448h24c39.8 0 72-32.2 72-72V200c0-39.8-32.2-72-72-72H448v48H568c13.3 0 24 10.7 24 24V376c0 13.3-10.7 24-24 24H520c-13.3 0-24 10.7-24 24v19.2L437.3 404c-3.9-2.6-8.6-4-13.3-4H328c-13.3 0-24-10.7-24-24V352H256v24z", - }; - case 'security-tools': - return { - vp: "0 0 512 512", - path: "M232 60.8V447.4c-66.9-37.8-108.8-94.3-134.1-152.6C71 232.9 63.1 169.5 64.1 126L232 60.8zm48 386.5V60.8L448 126c1 43.5-6.9 106.9-33.8 168.8C388.8 353.1 346.9 409.5 280 447.3zM495.5 113l-1.2-20.5L475.1 85 267.6 4.5 256 0 244.4 4.5 36.9 85 17.8 92.5 16.6 113c-2.9 49.9 4.9 126.3 37.3 200.9c32.7 75.2 91 150 189.4 192.6L256 512l12.7-5.5c98.4-42.6 156.7-117.3 189.4-192.6c32.4-74.7 40.2-151 37.3-200.9z" - }; - // Add more icons as needed... - default: - return { vb: "", path: "" }; // Default path or a placeholder icon - } + switch (icon) { + case 'star': + return { + vb: '0 0 24 24', + path: 'M10 15l-5.5 3 1-5.5L0 7.5l5.6-0.5L10 2l2 5 5.5 0.5-4 4 1 5.5z', + }; + case 'mastodon': + return { + vb: '0 0 512 512', + path: 'M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5 0 0 1 -.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.3V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z', + }; + case 'twitter': + return { + vb: '0 0 512 512', + path: 'M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z', + }; + case 'hub': + return { + vb: '0 0 512 512', + path: 'M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z', + }; + case 'dev': + return { + vb: '0 0 512 512', + path: 'M120.1 208.3c-3.9-2.9-7.8-4.4-11.7-4.4H91v104.5h17.5c3.9 0 7.8-1.5 11.7-4.4 3.9-2.9 5.8-7.3 5.8-13.1v-69.7c0-5.8-2-10.2-5.8-13.1zM404.1 32H43.9C19.7 32 .1 51.6 0 75.8v360.4C.1 460.4 19.7 480 43.9 480h360.2c24.2 0 43.8-19.6 43.9-43.8V75.8c-.1-24.2-19.7-43.8-43.9-43.8zM154.2 291.2c0 18.8-11.6 47.3-48.4 47.3h-46.4V173h47.4c35.4 0 47.4 28.5 47.4 47.3l0 70.9zm100.7-88.7H201.6v38.4h32.6v29.6H201.6v38.4h53.3v29.6h-62.2c-11.2 .3-20.4-8.5-20.7-19.7V193.7c-.3-11.2 8.6-20.4 19.7-20.7h63.2l0 29.5zm103.6 115.3c-13.2 30.8-36.9 24.6-47.4 0l-38.5-144.8h32.6l29.7 113.7 29.6-113.7h32.6l-38.5 144.8z', + }; + case 'linkedin': + return { + vb: '0 0 512 512', + path: 'M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z', + }; + case 'essentials': + return { + vb: '0 0 512 512', + path: 'M208 176c0-70.7 57.3-128 128-128s128 57.3 128 128s-57.3 128-128 128c-10.4 0-20.5-1.2-30.1-3.6c-8.1-2-16.7 .4-22.6 6.4L254.1 336H200c-13.3 0-24 10.7-24 24v40H136c-13.3 0-24 10.7-24 24v40H48V385.9L205.2 228.7c5.9-5.9 8.3-14.5 6.4-22.6c-2.3-9.6-3.6-19.7-3.6-30.1zM336 0C238.8 0 160 78.8 160 176c0 9.5 .7 18.8 2.2 27.9L7 359c-4.5 4.5-7 10.6-7 17V488c0 13.3 10.7 24 24 24H136c13.3 0 24-10.7 24-24V448h40c13.3 0 24-10.7 24-24V384h40c6.4 0 12.5-2.5 17-7l27.2-27.2c9.1 1.4 18.4 2.2 27.9 2.2c97.2 0 176-78.8 176-176S433.2 0 336 0zm32 176a32 32 0 1 0 0-64 32 32 0 1 0 0 64z', + }; + case 'communication': + return { + vb: '0 0 640 512', + path: 'M48 72c0-13.3 10.7-24 24-24H344c13.3 0 24 10.7 24 24V248c0 13.3-10.7 24-24 24H216c-4.7 0-9.4 1.4-13.3 4L144 315.2V296c0-13.3-10.7-24-24-24H72c-13.3 0-24-10.7-24-24V72zM72 0C32.2 0 0 32.2 0 72V248c0 39.8 32.2 72 72 72H96v40c0 8.9 4.9 17 12.7 21.2s17.3 3.7 24.6-1.2l90-60H344c39.8 0 72-32.2 72-72V72c0-39.8-32.2-72-72-72H72zM256 376c0 39.8 32.2 72 72 72h88.7l90 60c7.4 4.9 16.8 5.4 24.6 1.2S544 496.9 544 488V448h24c39.8 0 72-32.2 72-72V200c0-39.8-32.2-72-72-72H448v48H568c13.3 0 24 10.7 24 24V376c0 13.3-10.7 24-24 24H520c-13.3 0-24 10.7-24 24v19.2L437.3 404c-3.9-2.6-8.6-4-13.3-4H328c-13.3 0-24-10.7-24-24V352H256v24z', + }; + case 'security-tools': + return { + vp: '0 0 512 512', + path: 'M232 60.8V447.4c-66.9-37.8-108.8-94.3-134.1-152.6C71 232.9 63.1 169.5 64.1 126L232 60.8zm48 386.5V60.8L448 126c1 43.5-6.9 106.9-33.8 168.8C388.8 353.1 346.9 409.5 280 447.3zM495.5 113l-1.2-20.5L475.1 85 267.6 4.5 256 0 244.4 4.5 36.9 85 17.8 92.5 16.6 113c-2.9 49.9 4.9 126.3 37.3 200.9c32.7 75.2 91 150 189.4 192.6L256 512l12.7-5.5c98.4-42.6 156.7-117.3 189.4-192.6c32.4-74.7 40.2-151 37.3-200.9z', + }; + // Add more icons as needed... + default: + return { vb: '', path: '' }; // Default path or a placeholder icon + } }; - // Props are defined in the component's signature -const { icon, color = 'currentcolor', class: className = '', width = 80, height = 50 } = Astro.props as IconProps; +const { + icon, + color = 'currentcolor', + class: className = '', + width = 80, + height = 50, +} = Astro.props as IconProps; const svgStyle = { fill: color }; const { vb, path } = getSvgPath(icon); --- -<svg class={className} style={svgStyle} xmlns="http://www.w3.org/2000/svg" viewBox={vb} width={width} height={height ?? width}> - <path d={path} /> +<svg + class={className} + style={svgStyle} + xmlns="http://www.w3.org/2000/svg" + viewBox={vb} + width={width} + height={height ?? width} +> + <path d={path}></path> </svg> diff --git a/web/src/components/form/Social.astro b/web/src/components/form/Social.astro index 52d87b4..c40d5f1 100644 --- a/web/src/components/form/Social.astro +++ b/web/src/components/form/Social.astro @@ -1,12 +1,15 @@ --- - import Icon from '@components/form/FontAwesome.svelte'; -import { site, title as defaultTitle, description as defaultDescription } from '@utils/config'; +import { + site, + title as defaultTitle, + description as defaultDescription, +} from '@utils/config'; interface Props { - url?: string; - title?: string; - description?: string; + url?: string; + title?: string; + description?: string; } const url = Astro.props.url || site; @@ -18,109 +21,114 @@ const encodedTitle = encodeURIComponent(title); const encodedDescription = encodeURIComponent(description); const socialMedias = { - mastodon: { - url: `https://mastodon.social/share?text=${encodeURIComponent(`${title} ${description}`)}&url=${encodedUrl}`, - title: 'Mastodon', - icon: 'mastodon', - color: '#6364FF', - }, - twitter: { - url: `https://twitter.com/intent/tweet?text=${encodeURIComponent(`${title} ${description}`)}&url=${url}`, - title: 'Twitter', - icon: 'twitter', - color: '#444343' - }, - reddit: { - url: `https://reddit.com/submit?url=${encodedUrl}&title=${encodedTitle}`, - title: 'Reddit', - icon: 'reddit', - color: '#FF4500', - }, - linkedIn: { - url: `https://www.linkedin.com/shareArticle?mini=true&url=${encodedUrl}&title=${encodedTitle}&summary=${encodedDescription}`, - title: 'LinkedIn', - icon: 'linkedin', - color: '#0A66C2' - }, - pinterest: { - url: `https://pinterest.com/pin/create/button/?url=${encodedUrl}&description=${encodedTitle}`, - title: 'Pinterest', - icon: 'pinterest', - color: '#BD081C', - }, - telegram: { - url: `https://t.me/share/url?url=${encodedUrl}&text=${encodeURIComponent(`${title} ${description}`)}`, - title: 'Telegram', - icon: 'telegram', - color: '#26A5E4', - }, - whatsapp: { - url: `https://wa.me/?text=${encodedTitle} ${encodedUrl}`, - title: 'WhatsApp', - icon: 'whatsapp', - color: '#25D366', - }, - signal: { - url: `https://signal.me/#p/+${encodedUrl}`, - title: 'Signal', - icon: 'signal', - color: '#3A76F0', - }, - pocket: { - url: `https://getpocket.com/save?url=${encodedUrl}&title=${encodedTitle}`, - title: 'Pocket', - icon: 'pocket', - color: '#EF3F56', - }, + mastodon: { + url: `https://mastodon.social/share?text=${encodeURIComponent(`${title} ${description}`)}&url=${encodedUrl}`, + title: 'Mastodon', + icon: 'mastodon', + color: '#6364FF', + }, + twitter: { + url: `https://twitter.com/intent/tweet?text=${encodeURIComponent(`${title} ${description}`)}&url=${url}`, + title: 'Twitter', + icon: 'twitter', + color: '#444343', + }, + reddit: { + url: `https://reddit.com/submit?url=${encodedUrl}&title=${encodedTitle}`, + title: 'Reddit', + icon: 'reddit', + color: '#FF4500', + }, + linkedIn: { + url: `https://www.linkedin.com/shareArticle?mini=true&url=${encodedUrl}&title=${encodedTitle}&summary=${encodedDescription}`, + title: 'LinkedIn', + icon: 'linkedin', + color: '#0A66C2', + }, + pinterest: { + url: `https://pinterest.com/pin/create/button/?url=${encodedUrl}&description=${encodedTitle}`, + title: 'Pinterest', + icon: 'pinterest', + color: '#BD081C', + }, + telegram: { + url: `https://t.me/share/url?url=${encodedUrl}&text=${encodeURIComponent(`${title} ${description}`)}`, + title: 'Telegram', + icon: 'telegram', + color: '#26A5E4', + }, + whatsapp: { + url: `https://wa.me/?text=${encodedTitle} ${encodedUrl}`, + title: 'WhatsApp', + icon: 'whatsapp', + color: '#25D366', + }, + signal: { + url: `https://signal.me/#p/+${encodedUrl}`, + title: 'Signal', + icon: 'signal', + color: '#3A76F0', + }, + pocket: { + url: `https://getpocket.com/save?url=${encodedUrl}&title=${encodedTitle}`, + title: 'Pocket', + icon: 'pocket', + color: '#EF3F56', + }, }; - --- <ul class="social-share"> - {Object.entries(socialMedias).map(([platform, shareUrl]) => ( - <li style={`--color: ${shareUrl.color}`}> - <a title={`Share on ${platform}`} href={shareUrl.url} target="_blank" rel="noopener noreferrer"> - <Icon iconName={shareUrl.icon} /> - </a> - </li> - ))} + { + Object.entries(socialMedias).map(([platform, shareUrl]) => ( + <li style={`--color: ${shareUrl.color}`}> + <a + title={`Share on ${platform}`} + href={shareUrl.url} + target="_blank" + rel="noopener noreferrer" + > + <Icon iconName={shareUrl.icon} /> + </a> + </li> + )) + } </ul> <style lang="scss"> -.social-share { - list-style: none; - padding: 0; - display: flex; - gap: 0.5rem; - flex-wrap: wrap; - li { - padding: 0; - margin: 0; - opacity: 0.8; - border: 1px solid var(--box-outline); - box-shadow: 2px 2px 0 var(--box-outline); - border-radius: var(--curve-sm); - transition: all 0.2s ease-in-out; - background: var(--background-form); - a { - display: flex; - color: var(--foreground); - transition: all 0.2s ease-in-out; - padding: 4px; - :global(svg) { - width: 2rem; - height: 2rem; - } - } - &:hover { - box-shadow: 3px 3px 0 var(--box-outline); - border-radius: var(--curve-md); - opacity: 1; - a { - color: var(--color); - } - } - } -} + .social-share { + list-style: none; + padding: 0; + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + li { + padding: 0; + margin: 0; + opacity: 0.8; + border: 1px solid var(--box-outline); + box-shadow: 2px 2px 0 var(--box-outline); + border-radius: var(--curve-sm); + transition: all 0.2s ease-in-out; + background: var(--background-form); + a { + display: flex; + color: var(--foreground); + transition: all 0.2s ease-in-out; + padding: 4px; + :global(svg) { + width: 2rem; + height: 2rem; + } + } + &:hover { + box-shadow: 3px 3px 0 var(--box-outline); + border-radius: var(--curve-md); + opacity: 1; + a { + color: var(--color); + } + } + } + } </style> - diff --git a/web/src/components/form/ThemeSwitcher.svelte b/web/src/components/form/ThemeSwitcher.svelte index 3f5542a..3e7f7c8 100644 --- a/web/src/components/form/ThemeSwitcher.svelte +++ b/web/src/components/form/ThemeSwitcher.svelte @@ -28,7 +28,6 @@ } </script> - <!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-no-static-element-interactions --> <div class="theme-switcher" on:click={toggleTheme}> @@ -38,7 +37,6 @@ </div> </div> - <style lang="scss"> .theme-switcher { cursor: pointer; @@ -52,7 +50,7 @@ transition: background-color 0.3s ease; border: 2px solid var(--box-outline); box-shadow: 3px 3px 0 var(--box-outline); - + &:hover { background-color: rgba(255, 255, 255, 0.3); } @@ -96,5 +94,4 @@ display: flex; font-size: 1.5rem; } - </style> diff --git a/web/src/components/scafold/Footer.astro b/web/src/components/scafold/Footer.astro index 7e02fed..64fc513 100644 --- a/web/src/components/scafold/Footer.astro +++ b/web/src/components/scafold/Footer.astro @@ -1,23 +1,29 @@ +--- +const year = new Date().getFullYear(); +--- <footer> - <a href="/about">Awesome Privacy</a> is licensed - under <a href="https://github.com/Lissy93/awesome-privacy/blob/main/LICENSE">MIT</a> - © <a href="https://aliciasykes.com">Alicia Sykes</a> 2024 | - Source code available on <a href="https://github.com/Lissy93/awesome-privacy">GitHub</a> + <a href="/about">Awesome Privacy</a> is licensed under <a + href="https://github.com/Lissy93/awesome-privacy/blob/main/LICENSE" + >CC0 1.0 Universal</a + > + © <a href="https://aliciasykes.com">Alicia Sykes</a> 2018 - { + year || 'Present' + } | Source code available on <a + href="https://github.com/Lissy93/awesome-privacy">GitHub</a + > </footer> <style lang="scss"> - footer { - font-family: "Lekton", sans-serif; - font-weight: bold; - text-align: center; - padding: 0.5rem 0; - margin: 0 auto; - a { - font-family: "Lekton", sans-serif; - color: var(--accent); - } - - - } + footer { + font-family: 'Lekton', sans-serif; + font-weight: bold; + text-align: center; + padding: 0.5rem 0; + margin: 0 auto; + a { + font-family: 'Lekton', sans-serif; + color: var(--accent); + } + } </style> diff --git a/web/src/components/scafold/MainCard.astro b/web/src/components/scafold/MainCard.astro index 18e2c8e..ed2e997 100644 --- a/web/src/components/scafold/MainCard.astro +++ b/web/src/components/scafold/MainCard.astro @@ -1,7 +1,5 @@ - - <main> - <slot /> + <slot /> </main> <style lang="scss"> @@ -11,8 +9,8 @@ width: 1200px; max-width: calc(100% - 5rem); border: 2px solid var(--box-outline); - box-shadow: 6px 6px 0 var(--box-outline); + box-shadow: 6px 6px 0 var(--box-outline); background: var(--accent-fg); position: relative; - } + } </style> diff --git a/web/src/components/scafold/NavBar.astro b/web/src/components/scafold/NavBar.astro index 64ed300..fab5392 100644 --- a/web/src/components/scafold/NavBar.astro +++ b/web/src/components/scafold/NavBar.astro @@ -1,106 +1,111 @@ --- -import FontAwesome from "@components/form/FontAwesome.svelte" -import ThemeSwitcher from "@components/form/ThemeSwitcher.svelte" - +import FontAwesome from '@components/form/FontAwesome.svelte'; +import ThemeSwitcher from '@components/form/ThemeSwitcher.svelte'; --- <div class="nav"> - <a href="/" class="homepage"> - <FontAwesome iconName="logo" /> - <h1>Awesome Privacy</h1> - </a> - <nav> - <a href="/browse">Browse</a> - <a href="/search">Search</a> - <a href="/about">About</a> - <a href="https://github.com/lissy93/awesome-privacy">GitHub</a> - <div class="theme-switcher"> - <ThemeSwitcher client:load /> - </div> - </nav> + <a href="/" class="homepage"> + <FontAwesome iconName="logo" /> + <h1>Awesome Privacy</h1> + </a> + <nav> + <a href="/browse">Browse</a> + <a href="/search">Search</a> + <a href="/about">About</a> + <a href="https://github.com/lissy93/awesome-privacy">GitHub</a> + <div class="theme-switcher"> + <ThemeSwitcher client:load /> + </div> + </nav> </div> <style lang="scss"> - .nav { - background: var(--accent-fg); - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - gap: 1rem; - border-bottom: 2px solid var(--accent-3); - - .homepage { - text-decoration: none; - display: flex; - align-items: center; - padding: 0 0.5rem; - h1 { - margin: 0; - font-size: 2.4rem; - padding: 0 1rem; - color: var(--foreground); - font-family: "Lekton", sans-serif; - } - :global(svg) { - width: 2.5rem; - height: 2.5rem; - color: var(--accent-3); - transition: all 0.2s ease-in-out; - } - &:hover { - :global(svg) { - color: var(--accent); - transform: scale(1.05); - } - } - } + .nav { + background: var(--accent-fg); + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 1rem; + border-bottom: 2px solid var(--accent-3); - nav { - display: flex; - align-items: center; - height: 3rem; - a { - padding: 1rem; - font-size: 1.2rem; - font-family: "Lekton", sans-serif; - font-weight: bold; - color: var(--foreground); - transition: background 0.3s, transform 0.3s, box-shadow 0.3s; - transition-timing-function: ease-in-out; - &:hover { - background: var(--accent-3); - color: var(--accent-fg); - border-bottom: 2px solid var(--accent-3); - &:nth-child(4n+1) { - background-color: var(--accent); - } - &:nth-child(4n+2) { - background-color: var(--accent-2); - color: var(--foreground); - } - &:nth-child(4n+3) { - background-color: var(--accent-3); - } - &:nth-child(4n+4) { - background-color: var(--accent-4); - color: var(--foreground); - } - } - } - .theme-switcher { - transform: scale(0.7); - margin: 0.2rem auto; - @media(max-width: 768px) { - display: none; - } - } - } - .homepage, nav { - @media(max-width: 768px) { - margin: 0 auto; - a { border: none; } + .homepage { + text-decoration: none; + display: flex; + align-items: center; + padding: 0 0.5rem; + h1 { + margin: 0; + font-size: 2.4rem; + padding: 0 1rem; + color: var(--foreground); + font-family: 'Lekton', sans-serif; } - } - } + :global(svg) { + width: 2.5rem; + height: 2.5rem; + color: var(--accent-3); + transition: all 0.2s ease-in-out; + } + &:hover { + :global(svg) { + color: var(--accent); + transform: scale(1.05); + } + } + } + + nav { + display: flex; + align-items: center; + height: 3rem; + a { + padding: 1rem; + font-size: 1.2rem; + font-family: 'Lekton', sans-serif; + font-weight: bold; + color: var(--foreground); + transition: + background 0.3s, + transform 0.3s, + box-shadow 0.3s; + transition-timing-function: ease-in-out; + &:hover { + background: var(--accent-3); + color: var(--accent-fg); + border-bottom: 2px solid var(--accent-3); + &:nth-child(4n + 1) { + background-color: var(--accent); + } + &:nth-child(4n + 2) { + background-color: var(--accent-2); + color: var(--foreground); + } + &:nth-child(4n + 3) { + background-color: var(--accent-3); + } + &:nth-child(4n + 4) { + background-color: var(--accent-4); + color: var(--foreground); + } + } + } + .theme-switcher { + transform: scale(0.7); + margin: 0.2rem auto; + @media (max-width: 768px) { + display: none; + } + } + } + .homepage, + nav { + @media (max-width: 768px) { + margin: 0 auto; + a { + border: none; + } + } + } + } </style> diff --git a/web/src/components/things/AddNewService.svelte b/web/src/components/things/AddNewService.svelte index 48c8cc8..3e8aa7d 100644 --- a/web/src/components/things/AddNewService.svelte +++ b/web/src/components/things/AddNewService.svelte @@ -20,33 +20,42 @@ const serviceCrypto = writable(false); const additionalInfo = writable(''); - let codeBlock: any; + let codeBlock: HTMLElement | undefined; let interactiveActivated = false; - $: yamlText, updateHighlighting(); + $: (yamlText, updateHighlighting()); + /* eslint-disable svelte/no-dom-manipulating -- hljs requires direct DOM access for syntax highlighting */ function updateHighlighting() { if (codeBlock) { - codeBlock.textContent = yamlText + codeBlock.textContent = yamlText; codeBlock.dataset.highlighted && delete codeBlock.dataset.highlighted; - if (window && (window as any).hljs) { - (window as any).hljs.highlightElement(codeBlock); + const hljs = ( + window as Window & { + hljs?: { highlightElement: (el: HTMLElement) => void }; + } + ).hljs; + if (hljs) { + hljs.highlightElement(codeBlock); interactiveActivated = true; } } } + /* eslint-enable svelte/no-dom-manipulating */ - const filterEmptyValues = (obj: Record<string, any>) => { - const filteredObj: Record<string, any> = {}; - Object.keys(obj).forEach(key => { + const filterEmptyValues = (obj: Record<string, unknown>) => { + const filteredObj: Record<string, unknown> = {}; + Object.keys(obj).forEach((key) => { if (obj[key] || ['name', 'url', 'icon', 'description'].includes(key)) { filteredObj[key] = obj[key]; } }); return filteredObj; - } - - $: yamlText = yaml.dump([{ + }; + + $: yamlText = yaml.dump( + [ + { name: $serviceName, url: $serviceUrl, icon: $serviceIcon, @@ -60,9 +69,12 @@ openSource: $serviceOpenSource, securityAudited: $serviceSecurityAudited, acceptsCrypto: $serviceCrypto, - }].map(obj => filterEmptyValues(obj))); + }, + ].map((obj) => filterEmptyValues(obj)), + ); - $: issueUrl = makeAdditionRequest({ + $: issueUrl = makeAdditionRequest( + { listingCategory: $listingCategory, serviceName: $serviceName, serviceUrl: $serviceUrl, @@ -78,7 +90,9 @@ serviceSecurityAudited: $serviceSecurityAudited, serviceCrypto: $serviceCrypto, additionalInfo: $additionalInfo, - }, yamlText); + }, + yamlText, + ); // Form submission handler function handleSubmit() { @@ -87,29 +101,39 @@ </script> <svelte:head> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/an-old-hope.min.css"> -<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script> -<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js"></script> + <link + rel="stylesheet" + href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/an-old-hope.min.css" + /> + <script + src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" + ></script> + <script + src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js" + ></script> </svelte:head> <p> - Before completing this form, you must ensure that the service you are adding aligns - with the <a href="/about#creteria">Requirements</a> for Awesome Privacy. + Before completing this form, you must ensure that the service you are adding + aligns with the <a href="/about#creteria">Requirements</a> for Awesome + Privacy. <br /> You'll need a GitHub account in order to submit this form. </p> <form on:submit|preventDefault={handleSubmit}> - <h3>Basics</h3> - <p class="sub-title-description"> - All fields here are required. - </p> + <p class="sub-title-description">All fields here are required.</p> <!-- Category Dropdown --> <div class="form-row"> <label for="listing-category">Category</label> - <select bind:value={$listingCategory} id="listing-category" required autocomplete="off"> + <select + bind:value={$listingCategory} + id="listing-category" + required + autocomplete="off" + > <option value="">--Please choose an option--</option> <option value="Essentials">Essentials</option> <option value="Communication">Communication</option> @@ -126,45 +150,78 @@ <option value="Creativity">Creativity</option> </select> <p> - Choose the top-level category, which should align with - the <a href="/browse">one of these</a>. + Choose the top-level category, which should align with the <a + href="/browse">one of these</a + >. </p> </div> <!-- Listing Name --> <div class="form-row"> <label for="service-name">Listing Name</label> - <input type="text" bind:value={$serviceName} id="service-name" required autocomplete="off"> + <input + type="text" + bind:value={$serviceName} + id="service-name" + required + autocomplete="off" + /> <p>Enter the name of the app, software or service</p> </div> <!-- Listing URL --> <div class="form-row"> <label for="service-url">Listing URL</label> - <input type="url" bind:value={$serviceUrl} id="service-url" required autocomplete="off"> - <p>Enter the fully-qualified domain name of the homepage for this listing</p> + <input + type="url" + bind:value={$serviceUrl} + id="service-url" + required + autocomplete="off" + /> + <p> + Enter the fully-qualified domain name of the homepage for this listing + </p> </div> - + <!-- Listing Icon --> <div class="form-row"> <label for="service-icon">Listing Icon</label> - <input type="url" bind:value={$serviceIcon} id="service-icon" required autocomplete="off"> - <p>Paste a URL to a square logo for the service. Dimensions must be no less than 64x64, and no more than 512x512 pixels</p> + <input + type="url" + bind:value={$serviceIcon} + id="service-icon" + required + autocomplete="off" + /> + <p> + Paste a URL to a square logo for the service. Dimensions must be no less + than 64x64, and no more than 512x512 pixels + </p> </div> <!-- Listing Description --> <div class="form-row"> <label for="service-description">Listing Description</label> - <textarea bind:value={$serviceDescription} id="service-description" required autocomplete="off"></textarea> - <p>Please provide a description for this listing. Keep it factual and objective. Markdown is supported.</p> + <textarea + bind:value={$serviceDescription} + id="service-description" + required + autocomplete="off" + ></textarea> + <p> + Please provide a description for this listing. Keep it factual and + objective. Markdown is supported. + </p> </div> <!-- Section 2 --> <h3>Third-Party Referencing</h3> <p class="sub-title-description"> - In order to create a comprehensive listing, we combine the data inputted above with other sources, - to give additional context and help users make informed decisions. - Metrics from these services are fetched automatically at build-time from our API. + In order to create a comprehensive listing, we combine the data inputted + above with other sources, to give additional context and help users make + informed decisions. Metrics from these services are fetched automatically at + build-time from our API. <br /> All fields are optional, but the more information you provide, the better! </p> @@ -172,7 +229,13 @@ <!-- GitHub Repository --> <div class="form-row"> <label for="service-github">GitHub Repository</label> - <input type="text" bind:value={$serviceGithub} id="service-github" required autocomplete="off"> + <input + type="text" + bind:value={$serviceGithub} + id="service-github" + required + autocomplete="off" + /> <p> Share a link to where the project's source is located.<br /> Use the format [user]/[repo] e.g, lissy93/dashy @@ -182,18 +245,29 @@ <!-- ToS;DR ID --> <div class="form-row"> <label for="service-tosdr-id">ToS;DR ID</label> - <input type="number" bind:value={$serviceTosdrId} id="service-tosdr-id" autocomplete="off"> + <input + type="number" + bind:value={$serviceTosdrId} + id="service-tosdr-id" + autocomplete="off" + /> <p> - Has the Privacy policy been documented by <a href="https://tosdr.org/">tosdr.org</a>? - If so, please include the report reference below (this is a 3 or 4-digit numerical ID). - Skip section if not applicable. + Has the Privacy policy been documented by <a href="https://tosdr.org/" + >tosdr.org</a + >? If so, please include the report reference below (this is a 3 or + 4-digit numerical ID). Skip section if not applicable. </p> </div> <!-- Apple App Store URL --> <div class="form-row"> <label for="service-tosdr-id">iOS App</label> - <input type="url" bind:value={$serviceIosApp} id="service-ios-app" autocomplete="off"> + <input + type="url" + bind:value={$serviceIosApp} + id="service-ios-app" + autocomplete="off" + /> <p> Paste the link to the mobile app on the Apple App Store.<br /> E.g. https://apps.apple.com/us/app/bitwarden-password-manager/id1137397744 @@ -203,7 +277,12 @@ <!-- Google Play App Store URL --> <div class="form-row"> <label for="service-tosdr-id">Android App</label> - <input type="url" bind:value={$serviceAndroidApp} id="service-android-app" autocomplete="off"> + <input + type="url" + bind:value={$serviceAndroidApp} + id="service-android-app" + autocomplete="off" + /> <p> Paste the link to the mobile app on the Google Play Store.<br /> E.g. https://play.google.com/store/apps/details?id=com.x8bit.bitwarden @@ -213,17 +292,28 @@ <!-- Discord Server Invite Code --> <div class="form-row"> <label for="service-tosdr-id">Discord Invite</label> - <input type="text" bind:value={$serviceDiscordInvite} id="service-discord-invite" autocomplete="off"> + <input + type="text" + bind:value={$serviceDiscordInvite} + id="service-discord-invite" + autocomplete="off" + /> <p> Paste the invite code to the Discord server for this service.<br /> - E.g. If the invite URL is https://discord.com/invite/4JMAauFZBq the code is 4JMAauFZBq + E.g. If the invite URL is https://discord.com/invite/4JMAauFZBq the code is + 4JMAauFZBq </p> </div> <!-- Reddit sub name --> <div class="form-row"> <label for="service-tosdr-id">Subreddit</label> - <input type="text" bind:value={$serviceSubreddit} id="service-subreddit" autocomplete="off"> + <input + type="text" + bind:value={$serviceSubreddit} + id="service-subreddit" + autocomplete="off" + /> <p> If the service has a subreddit, please provide the name here.<br /> Don't include `r/` in the name, nor the full URL - just the sub name. @@ -233,70 +323,95 @@ <!-- Section 3 - Checklist and details --> <h3>Privacy Checklist</h3> <p class="sub-title-description"> - Finally, check the boxes that apply to the service you are submitting, - and then provide any additional information to back this up in the text area below. + Finally, check the boxes that apply to the service you are submitting, and + then provide any additional information to back this up in the text area + below. </p> - <!-- Open Source Checkbox --> + <!-- Open Source Checkbox --> <div class="form-row"> <label for="service-open-source">Is Open Source?</label> - <input type="checkbox" bind:checked={$serviceOpenSource} id="service-open-source"> - <p>Is this service fully open source? Aka, can it be compiled from source by the user, or self-hosted?</p> + <input + type="checkbox" + bind:checked={$serviceOpenSource} + id="service-open-source" + /> + <p> + Is this service fully open source? Aka, can it be compiled from source by + the user, or self-hosted? + </p> </div> <!-- Security Audited Checkbox --> <div class="form-row"> <label for="service-security-audited">Security Audited?</label> - <input type="checkbox" bind:checked={$serviceSecurityAudited} id="service-security-audited"> - <p>Has this service been independently security audited by an accredited auditor?</p> + <input + type="checkbox" + bind:checked={$serviceSecurityAudited} + id="service-security-audited" + /> + <p> + Has this service been independently security audited by an accredited + auditor? + </p> </div> <!-- Accepts Crypto Checkbox --> <div class="form-row"> <label for="service-crypto">Accepts Anon Payment?</label> - <input type="checkbox" bind:checked={$serviceCrypto} id="service-crypto"> - <p>If this is a hosted and paid for service, does it accept anonymous payment methods, including crypto (e.g., Monero)?</p> + <input type="checkbox" bind:checked={$serviceCrypto} id="service-crypto" /> + <p> + If this is a hosted and paid for service, does it accept anonymous payment + methods, including crypto (e.g., Monero)? + </p> </div> <div class="final-info"> - <p> - Finally, please provide any supporting material, including: - </p> + <p>Finally, please provide any supporting material, including:</p> <ul> <li> A justification of why this app/service should be included in the list </li> + <li>Links to any published security audit, if they exist</li> <li> - Links to any published security audit, if they exist + Links to the services privacy policy, terms of service and other + relevant documents where applicable </li> <li> - Links to the services privacy policy, terms of service and other relevant - documents where applicable + Your affiliation with the service. For transparency, you must disclose + if you are associated with them or any similar items in any way </li> <li> - Your affiliation with the service. - For transparency, you must disclose if you are associated - with them or any similar items in any way + Links to relevant discussions, past issues/PRs related to this service </li> - <li>Links to relevant discussions, past issues/PRs related to this service</li> </ul> - <textarea bind:value={$additionalInfo} id="additional-info" rows="5"></textarea> + <textarea bind:value={$additionalInfo} id="additional-info" rows="5" + ></textarea> </div> <button type="submit">Submit</button> - <a href={issueUrl} target="_blank" class="open-in-gh">Open in GitHub Issues</a> + <a href={issueUrl} target="_blank" class="open-in-gh">Open in GitHub Issues</a + > </form> <div class="output-yaml"> - <p>Below is the YAML content, which will be appended to the appropriate section - within <a href="github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml">awesome-privacy.yml</a> + <p> + Below is the YAML content, which will be appended to the appropriate section + within <a + href="github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml" + >awesome-privacy.yml</a + > upon approval. </p> {#if !interactiveActivated || !codeBlock} + <!-- eslint-disable-next-line svelte/no-at-html-tags -- yamlText is generated from user form input via yaml.dump, not arbitrary HTML --> <pre><code class="language-yaml">{@html yamlText}</code></pre> {/if} <pre><code bind:this={codeBlock} class="language-yaml"></code></pre> - <p>Your submission will need to be reviewed by a maintainer and the community before it can be merged.</p> + <p> + Your submission will need to be reviewed by a maintainer and the community + before it can be merged. + </p> </div> <style lang="scss"> @@ -332,7 +447,9 @@ } } - input, textarea, select { + input, + textarea, + select { width: 100%; border: 1px solid var(--accent-3); border-radius: var(--curve-md); @@ -347,15 +464,15 @@ } input { height: fit-content; - &[type="number"]::-webkit-outer-spin-button, - &[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; + &[type='number']::-webkit-outer-spin-button, + &[type='number']::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; } - &[type="number"] { - -moz-appearance: textfield; + &[type='number'] { + -moz-appearance: textfield; } - &[type="checkbox"] { + &[type='checkbox'] { width: 2rem; height: 2rem; background: var(--background-form); @@ -381,7 +498,7 @@ box-shadow: 3px 3px 0 var(--box-outline); border-radius: var(--curve-lg); font-size: 1.8rem; - font-family: "Lekton", sans-serif; + font-family: 'Lekton', sans-serif; margin: 1rem auto; display: flex; transition: all 0.2s ease-in-out; diff --git a/web/src/components/things/AndroidDetailedInfo.astro b/web/src/components/things/AndroidDetailedInfo.astro index 414de71..f4ad460 100644 --- a/web/src/components/things/AndroidDetailedInfo.astro +++ b/web/src/components/things/AndroidDetailedInfo.astro @@ -1,170 +1,178 @@ --- - import type { AndroidInfo } from '@utils/fetch-android-info'; -import { formatDate, timeAgo } from '@utils/dates-n-stuff'; -import FontAwesome from "@components/form/FontAwesome.svelte" - +import { formatDate } from '@utils/dates-n-stuff'; +import FontAwesome from '@components/form/FontAwesome.svelte'; interface Props { - androidData: AndroidInfo; -}; + androidData: AndroidInfo; +} const { androidData } = Astro.props; function permissionToReadable(permission: string): string { - return (permission - .split('.') - .pop() || '') - .replace(/_/g, ' ') - .toLowerCase() - .split(' ') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' ') + return (permission.split('.').pop() || '') + .replace(/_/g, ' ') + .toLowerCase() + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); } - - --- <div class="android-info-wrapper"> - <div class="left"> - <h4>Update Info</h4> - <ul class="list-table"> - <li> - <span class="lbl">App</span> - <span class="val"> - <!-- <img width="20" src={`https://reports.exodus-privacy.eu.org/en/reports/${androidData.version_code}/icon`} alt="Android Icon" /> --> - <a href={`https://play.google.com/store/apps/details?id=${androidData.handle}`}>{androidData.app_name}</a> - </span> - </li> - <li> - <span class="lbl">Creation Date</span> - <span class="val">{formatDate(androidData.created)}</span> - </li> - <li> - <span class="lbl">Last Updated</span> - <span class="val">{formatDate(androidData.updated)}</span> - </li> - <li> - <span class="lbl">Current Version</span> - <span class="val">{androidData.version_name}</span> - </li> - {androidData.creator && ( - <li> - <span class="lbl">Creator</span> - <span class="val">{androidData.creator}</span> - </li> - )} - {androidData.downloads && ( - <li> - <span class="lbl">Downloads</span> - <span class="val">{androidData.downloads}</span> - </li> - )} - </ul> + <div class="left"> + <h4>Update Info</h4> + <ul class="list-table"> + <li> + <span class="lbl">App</span> + <span class="val"> + <!-- <img width="20" src={`https://reports.exodus-privacy.eu.org/en/reports/${androidData.version_code}/icon`} alt="Android Icon" /> --> + <a + href={`https://play.google.com/store/apps/details?id=${androidData.handle}`} + >{androidData.app_name}</a + > + </span> + </li> + <li> + <span class="lbl">Creation Date</span> + <span class="val">{formatDate(androidData.created)}</span> + </li> + <li> + <span class="lbl">Last Updated</span> + <span class="val">{formatDate(androidData.updated)}</span> + </li> + <li> + <span class="lbl">Current Version</span> + <span class="val">{androidData.version_name}</span> + </li> + { + androidData.creator && ( + <li> + <span class="lbl">Creator</span> + <span class="val">{androidData.creator}</span> + </li> + ) + } + { + androidData.downloads && ( + <li> + <span class="lbl">Downloads</span> + <span class="val">{androidData.downloads}</span> + </li> + ) + } + </ul> - <h4>Trackers</h4> - {(androidData.trackers || []).length === 0 && ( - <p class="all-good"> - <FontAwesome iconName="noTrackers" /> - No trackers found - </p> - )} - <ul class="list"> - {(androidData.trackers || []).map((track) => ( - <li title={track.code_signature}>{track.name}</li> - ))} - </ul> - </div> + <h4>Trackers</h4> + { + (androidData.trackers || []).length === 0 && ( + <p class="all-good"> + <FontAwesome iconName="noTrackers" /> + No trackers found + </p> + ) + } + <ul class="list"> + { + (androidData.trackers || []).map((track) => ( + <li title={track.code_signature}>{track.name}</li> + )) + } + </ul> + </div> - <div class="right"> - <h4>Permissions</h4> - {(androidData.permissions || []).length === 0 && ( - <p class="all-good"> - <FontAwesome iconName="noTrackers" /> - No permissions required - </p> - )} - <ul class="list"> - {(androidData.permissions || []).map((perm) => ( - <li title={perm}>{permissionToReadable(perm)}</li> - ))} - </ul> - </div> + <div class="right"> + <h4>Permissions</h4> + { + (androidData.permissions || []).length === 0 && ( + <p class="all-good"> + <FontAwesome iconName="noTrackers" /> + No permissions required + </p> + ) + } + <ul class="list"> + { + (androidData.permissions || []).map((perm) => ( + <li title={perm}>{permissionToReadable(perm)}</li> + )) + } + </ul> + </div> </div> - <style lang="scss"> -.android-info-wrapper { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - gap: 1rem; - .left, .right { - width: calc(50% - 1rem); - @media screen and (max-width: 768px){ - width: 100%; - } - } -} + .android-info-wrapper { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + .left, + .right { + width: calc(50% - 1rem); + @media screen and (max-width: 768px) { + width: 100%; + } + } + } -h3 { - margin: 0; - font-size: 1.6rem; -} + h3 { + margin: 0; + font-size: 1.6rem; + } -h4 { - margin: 1rem 0 0 0; - font-size: 1.2rem; -} + h4 { + margin: 1rem 0 0 0; + font-size: 1.2rem; + } -ul { - padding-left: 0; - list-style: none; - max-height: 300px; - overflow-y: auto; - overflow-x: hidden; - img { - border-radius: var(--curve-sm); - } - .list-item { - display: flex; - flex-direction: column; - margin-bottom: 0.5rem; - } - &.list-table { - font-size: 0.9rem; - padding-left: 0; - li { - display: flex; - justify-content: space-between; - padding: 0.1rem 0; - .lbl { - font-weight: 400; - } - .val { - img { - margin-right: 0.5rem; - } - } - &:not(:last-child) { - border-bottom: 1px solid #5f53f440; - } - } - } - &.list { - list-style: circle; - padding-left: 1rem; - } -} - -.all-good { - color: var(--success); - display: flex; - align-items: center; - gap: 0.5rem; - :global(svg) { - width: 1.5rem; - } -} + ul { + padding-left: 0; + list-style: none; + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; + img { + border-radius: var(--curve-sm); + } + .list-item { + display: flex; + flex-direction: column; + margin-bottom: 0.5rem; + } + &.list-table { + font-size: 0.9rem; + padding-left: 0; + li { + display: flex; + justify-content: space-between; + padding: 0.1rem 0; + .lbl { + font-weight: 400; + } + .val { + img { + margin-right: 0.5rem; + } + } + &:not(:last-child) { + border-bottom: 1px solid #5f53f440; + } + } + } + &.list { + list-style: circle; + padding-left: 1rem; + } + } + .all-good { + color: var(--success); + display: flex; + align-items: center; + gap: 0.5rem; + :global(svg) { + width: 1.5rem; + } + } </style> diff --git a/web/src/components/things/Comments.svelte b/web/src/components/things/Comments.svelte index 1a69a52..554e416 100644 --- a/web/src/components/things/Comments.svelte +++ b/web/src/components/things/Comments.svelte @@ -1,19 +1,25 @@ <svelte:head> <script async lang="javascript"> - var remark_config = { - host: 'https://comments.as93.net', site_id: 'awesome-privacy.xyz', - components: ['embed'], show_rss_subsription: true, theme: 'dark', - }; - !(function (e, n) { - for (var o = 0; o < e.length; o++) { - var r = n.createElement('script'), d = n.head || n.body; - 'noModule' in r ? - (r.type = 'module', r.src = remark_config.host + '/web/' + e[o] + '.mjs') - : ( r.async = !0, r.defer = !0, r.src = remark_config.host + '/web/' + e[o] + '.js'), - d.appendChild(r); - } - })(remark_config.components || ['embed'], document); - + var remark_config = { + host: 'https://comments.as93.net', + site_id: 'awesome-privacy.xyz', + components: ['embed'], + show_rss_subsription: true, + theme: 'dark', + }; + !(function (e, n) { + for (var o = 0; o < e.length; o++) { + var r = n.createElement('script'), + d = n.head || n.body; + ('noModule' in r + ? ((r.type = 'module'), + (r.src = remark_config.host + '/web/' + e[o] + '.mjs')) + : ((r.async = !0), + (r.defer = !0), + (r.src = remark_config.host + '/web/' + e[o] + '.js')), + d.appendChild(r)); + } + })(remark_config.components || ['embed'], document); </script> </svelte:head> diff --git a/web/src/components/things/DataActions.svelte b/web/src/components/things/DataActions.svelte index 04ccad4..c519441 100644 --- a/web/src/components/things/DataActions.svelte +++ b/web/src/components/things/DataActions.svelte @@ -1,18 +1,23 @@ <script lang="ts"> - import { onMount } from "svelte"; - import { fetchSrcData, makeRemovalRequest, makeEditRequest } from '@utils/data-src-delete-n-edit'; + import { onMount } from 'svelte'; + import { + fetchSrcData, + makeRemovalRequest, + makeEditRequest, + } from '@utils/data-src-delete-n-edit'; import FontAwesome from '@components/form/FontAwesome.svelte'; export let categoryName: string; export let sectionName: string; export let serviceName: string; - let lineNumbers: { start: number, end: number } | null = null; + let lineNumbers: { start: number; end: number } | null = null; let yamlContent = ''; const getGitHubSrcFile = () => { if (lineNumbers) { - const baseFile = 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; + const baseFile = + 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; return `${baseFile}#L${lineNumbers.start}-L${lineNumbers.end}`; } return ''; @@ -21,56 +26,68 @@ const getIframeSrc = () => { const host = 'https://github-embed.as93.net'; const target = encodeURIComponent(getGitHubSrcFile()); - const opts = 'style=felipec&type=code&showBorder=on&showLineNumbers=on&showFileMeta=on&showFullPath=on&showCopy=on'; + const opts = + 'style=felipec&type=code&showBorder=on&showLineNumbers=on&showFileMeta=on&showFullPath=on&showCopy=on'; return `${host}/iframe.html?target=${target}&${opts}`; }; onMount(async () => { const results = await fetchSrcData(categoryName, sectionName, serviceName); - lineNumbers = results.lineNumbers + lineNumbers = results.lineNumbers; yamlContent = results.yamlContent; }); - </script> {#if lineNumbers} + <h4>Edit {serviceName} Data</h4> + <p> + You can view or edit this {serviceName}'s entry in + <a href={getGitHubSrcFile()}> this section </a> + of <code>awesome-privacy.yml</code> in our GitHub repo. + </p> -<h4>Edit {serviceName} Data</h4> -<p> - You can view or edit this {serviceName}'s entry in - <a href={getGitHubSrcFile()}> - this section - </a> - of <code>awesome-privacy.yml</code> in our GitHub repo. -</p> - -<h4>Origin Data</h4> -<iframe - frameborder="0" - scrolling="no" - class="yaml-embed" - allow="clipboard-write" - title="awesome-privacy.yml" - src={getIframeSrc()}></iframe> - -<h4>Modify Data</h4> -<div class="button-wrap"> - <a class="button-link" target="_blank" - href={makeRemovalRequest(categoryName, sectionName, serviceName, yamlContent)}> - <FontAwesome iconName="delete" /> Delete {serviceName} - </a> - <a class="button-link" target="_blank" - href={makeEditRequest(categoryName, sectionName, serviceName, yamlContent)}> - <FontAwesome iconName="edit" /> Submit Edit to {serviceName} - </a> - <a class="button-link" href="/submit"> - <FontAwesome iconName="add" /> Add alternative - </a> -</div> + <h4>Origin Data</h4> + <iframe + frameborder="0" + scrolling="no" + class="yaml-embed" + allow="clipboard-write" + title="awesome-privacy.yml" + src={getIframeSrc()} + ></iframe> + <h4>Modify Data</h4> + <div class="button-wrap"> + <a + class="button-link" + target="_blank" + href={makeRemovalRequest( + categoryName, + sectionName, + serviceName, + yamlContent, + )} + > + <FontAwesome iconName="delete" /> Delete {serviceName} + </a> + <a + class="button-link" + target="_blank" + href={makeEditRequest( + categoryName, + sectionName, + serviceName, + yamlContent, + )} + > + <FontAwesome iconName="edit" /> Submit Edit to {serviceName} + </a> + <a class="button-link" href="/submit"> + <FontAwesome iconName="add" /> Add alternative + </a> + </div> {/if} - <style lang="scss"> h4 { font-size: 1.4rem; @@ -85,7 +102,7 @@ gap: 1rem; justify-content: center; margin: 1rem auto; - @media(max-width: 768px) { + @media (max-width: 768px) { flex-direction: column; } } @@ -101,7 +118,7 @@ min-width: 15rem; display: inline-block; text-align: center; - font-family: "Lekton",sans-serif; + font-family: 'Lekton', sans-serif; font-size: 1.2rem; :global(svg) { width: 1rem; @@ -118,5 +135,4 @@ margin: 1rem auto; box-shadow: 3px 3px 0 var(--accent-3); } - </style> diff --git a/web/src/components/things/DeleteListing.svelte b/web/src/components/things/DeleteListing.svelte index 2e825d0..ac26b73 100644 --- a/web/src/components/things/DeleteListing.svelte +++ b/web/src/components/things/DeleteListing.svelte @@ -1,15 +1,17 @@ - <script lang="ts"> import FontAwesome from '@components/form/FontAwesome.svelte'; - import { fetchSrcData, makeRemovalRequest } from '@utils/data-src-delete-n-edit'; + import { + fetchSrcData, + makeRemovalRequest, + } from '@utils/data-src-delete-n-edit'; import { onMount } from 'svelte'; - export let categoryName: string; export let sectionName: string; export let serviceName: string; - const apYaml = 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; + const apYaml = + 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; let yamlContent = ''; let editLink = apYaml; @@ -19,43 +21,51 @@ yamlContent = results.yamlContent; const lineNumbers = results.lineNumbers || null; - const numberRange = lineNumbers ? `#L${lineNumbers.start}-L${lineNumbers.end}` : ''; - const yamlLink = 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; + const numberRange = lineNumbers + ? `#L${lineNumbers.start}-L${lineNumbers.end}` + : ''; + const yamlLink = + 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; editLink = `${yamlLink}${numberRange}`; }); - </script> <div class="actions"> - <a title="Edit" target="_blank" - href={editLink}> + <a title="Edit" target="_blank" href={editLink}> <FontAwesome iconName="edit" /> </a> - <a title="Delete" target="_blank" - href={makeRemovalRequest(categoryName, sectionName, serviceName, yamlContent)}> + <a + title="Delete" + target="_blank" + href={makeRemovalRequest( + categoryName, + sectionName, + serviceName, + yamlContent, + )} + > <FontAwesome iconName="delete" /> </a> </div> <style lang="scss"> -.actions { - position: absolute; - right: 3.5rem; - top: 1rem; - width: 2.8rem; - gap: 1rem; - opacity: 0; - display: flex; - transition: all 0.2s ease-in-out; - a { - color: var(--foreground); - width: 1rem; + .actions { + position: absolute; + right: 3.5rem; + top: 1rem; + width: 2.8rem; + gap: 1rem; + opacity: 0; + display: flex; transition: all 0.2s ease-in-out; - &:hover { - color: var(--accent-3); - opacity: 1; + a { + color: var(--foreground); + width: 1rem; + transition: all 0.2s ease-in-out; + &:hover { + color: var(--accent-3); + opacity: 1; + } } } - -} </style> diff --git a/web/src/components/things/DiscordDetailedInfo.astro b/web/src/components/things/DiscordDetailedInfo.astro index cbf47b8..7b0eb84 100644 --- a/web/src/components/things/DiscordDetailedInfo.astro +++ b/web/src/components/things/DiscordDetailedInfo.astro @@ -1,110 +1,111 @@ --- - import type { DiscordInfo } from '@utils/fetch-discord-info'; -import { formatDate, timeAgo } from '@utils/dates-n-stuff'; -import FontAwesome from "@components/form/FontAwesome.svelte" - interface Props { - discordData: DiscordInfo; -}; + discordData: DiscordInfo; +} const { discordData } = Astro.props; - - --- <div class="discord-info-wrapper"> + <h3>Discord</h3> - <h3>Discord</h3> + <ul class="list-table"> + <li> + <span class="lbl">Server Name</span> + <span class="val" + ><img src={discordData.icon} width="16" />{discordData.name}</span + > + </li> + <li> + <span class="lbl">Member Count</span> + <span class="val" + >{discordData.memberCount} ({discordData.memberOnlineCount} online)</span + > + </li> + <li> + <span class="lbl">Initial Channel</span> + <span class="val">{discordData.channel}</span> + </li> + <li> + <span class="lbl">Inviter</span> + <span class="val">{discordData.inviter || 'Anon'}</span> + </li> + <li> + <span class="lbl">Join Link</span> + <span class="val" + ><a href={`https://discord.com/invite/${discordData.inviteCode}`} + >discord.com/invite/{discordData.inviteCode}</a + ></span + > + </li> + </ul> - <ul class="list-table"> - <li> - <span class="lbl">Server Name</span> - <span class="val"><img src={discordData.icon} width="16" />{discordData.name}</span> - </li> - <li> - <span class="lbl">Member Count</span> - <span class="val">{discordData.memberCount} ({discordData.memberOnlineCount} online)</span> - </li> - <li> - <span class="lbl">Initial Channel</span> - <span class="val">{discordData.channel}</span> - </li> - <li> - <span class="lbl">Inviter</span> - <span class="val">{discordData.inviter || 'Anon'}</span> - </li> - <li> - <span class="lbl">Join Link</span> - <span class="val"><a href={`https://discord.com/invite/${discordData.inviteCode}`}>discord.com/invite/{discordData.inviteCode}</a></span> - </li> - </ul> - - { discordData.banner && (<img class="banner" width="300" src={discordData.banner} />)} - - + { + discordData.banner && ( + <img class="banner" width="300" src={discordData.banner} /> + ) + } </div> - <style lang="scss"> -.discord-info-wrapper { - display: flex; - flex-direction: column; - max-width: 400px; -} + .discord-info-wrapper { + display: flex; + flex-direction: column; + max-width: 400px; + } -h3 { - margin: 0; - font-size: 1.6rem; -} + h3 { + margin: 0; + font-size: 1.6rem; + } -h4 { - margin: 1rem 0 0 0; - font-size: 1.2rem; -} + h4 { + margin: 1rem 0 0 0; + font-size: 1.2rem; + } -ul { - padding-left: 0; - list-style: none; - max-height: 300px; - overflow-y: auto; - overflow-x: hidden; - img { - border-radius: var(--curve-sm); - } - .list-item { - display: flex; - flex-direction: column; - margin-bottom: 0.5rem; - } - &.list-table { - font-size: 0.9rem; - padding-left: 0; - li { - display: flex; - justify-content: space-between; - padding: 0.1rem 0; - .lbl { - font-weight: 400; - } - .val { - img { - margin-right: 0.5rem; - } - } - &:not(:last-child) { - border-bottom: 1px solid #5f53f440; - } - } - } -} - -.banner { - width: 80%; - margin: 1rem auto 0 auto; - display: flex; - border-radius: var(--curve-md); -} + ul { + padding-left: 0; + list-style: none; + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; + img { + border-radius: var(--curve-sm); + } + .list-item { + display: flex; + flex-direction: column; + margin-bottom: 0.5rem; + } + &.list-table { + font-size: 0.9rem; + padding-left: 0; + li { + display: flex; + justify-content: space-between; + padding: 0.1rem 0; + .lbl { + font-weight: 400; + } + .val { + img { + margin-right: 0.5rem; + } + } + &:not(:last-child) { + border-bottom: 1px solid #5f53f440; + } + } + } + } + .banner { + width: 80%; + margin: 1rem auto 0 auto; + display: flex; + border-radius: var(--curve-md); + } </style> diff --git a/web/src/components/things/GetSharableLink.svelte b/web/src/components/things/GetSharableLink.svelte index 0fcc694..5af0bdf 100644 --- a/web/src/components/things/GetSharableLink.svelte +++ b/web/src/components/things/GetSharableLink.svelte @@ -1,37 +1,39 @@ - <script lang="ts"> + import { slugify } from '@utils/fetch-data'; -import { slugify } from "@utils/fetch-data"; + let linkId = ''; + let done = false; + let error = false; -let linkId = ''; -let done = false; -let error = false; - -const save = async () => { - const savedServices = JSON.parse(localStorage.getItem('savedServices') || '[]'); - const inventoryTitle = localStorage.getItem('userTitle') || 'Anon\'s Inventory'; - const uniqueId = Math.random().toString(36).substring(2); - const saveKey = `${uniqueId}_${slugify(inventoryTitle)}`; - const url = 'https://awesome-privacy-share-api.as93.net'; - const data = { key: saveKey, services: savedServices }; - fetch(url, { + const save = async () => { + const savedServices = JSON.parse( + localStorage.getItem('savedServices') || '[]', + ); + const inventoryTitle = + localStorage.getItem('userTitle') || "Anon's Inventory"; + const uniqueId = Math.random().toString(36).substring(2); + const saveKey = `${uniqueId}_${slugify(inventoryTitle)}`; + const url = 'https://awesome-privacy-share-api.as93.net'; + const data = { key: saveKey, services: savedServices }; + fetch(url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), - }) - .then(response => response.json()) - .then(data => { - linkId = data.key; - done = true; - error = false; - navigator.clipboard.writeText(`https://awesome-privacy.xyz/inventory/${linkId}`); - }) - .catch(error => { - error = true; - console.error('Error:', error) - }); -}; - + }) + .then((response) => response.json()) + .then((data) => { + linkId = data.key; + done = true; + error = false; + navigator.clipboard.writeText( + `https://awesome-privacy.xyz/inventory/${linkId}`, + ); + }) + .catch((error) => { + error = true; + console.error('Error:', error); + }); + }; </script> <div class="share-container"> diff --git a/web/src/components/things/IosAppDetailedInfo.astro b/web/src/components/things/IosAppDetailedInfo.astro index 3884098..1979c08 100644 --- a/web/src/components/things/IosAppDetailedInfo.astro +++ b/web/src/components/things/IosAppDetailedInfo.astro @@ -1,7 +1,7 @@ --- import type { IoSApiResponse } from '@utils/fetch-ios-info'; -import { formatDate, timeAgo } from '@utils/dates-n-stuff'; +import { formatDate } from '@utils/dates-n-stuff'; import FontAwesome from "@components/form/FontAwesome.svelte" @@ -18,7 +18,7 @@ const makeRatingPercentage = (rating: number) => (rating / 5) * 100; const roundRatings = (rating: number) => Math.round(rating * 100) / 100; -const putCommaInNumber = (num: number | any) => { +const putCommaInNumber = (num: number | string | undefined) => { if (!num) return 'Unknown'; return typeof num === 'number' ? num.toLocaleString() : num; } diff --git a/web/src/components/things/ItemGitHubMetrics.astro b/web/src/components/things/ItemGitHubMetrics.astro index ff95855..b21d966 100644 --- a/web/src/components/things/ItemGitHubMetrics.astro +++ b/web/src/components/things/ItemGitHubMetrics.astro @@ -1,14 +1,21 @@ --- import FontAwesome from "@components/form/FontAwesome.svelte"; +import { error } from "@utils/logger"; const { github } = Astro.props; -// const [user, repo] = github.split("/"); +interface GitHubRepoData { + stargazers_count?: number; + forks_count?: number; + open_issues_count?: number; + language?: string; + license?: { spdx_id?: string; name?: string }; +} /** * For a given `user/repo` fetch repository stats from the GitHub API data * If API key is available through env var, use it to increase rate limit * Returns the response data and status code (200 == success) - * @param repo + * @param repo */ const fetchGitHubData = async (repo: string) => { const apiKey = import.meta.env.GITHUB_API_KEY; @@ -17,13 +24,13 @@ const fetchGitHubData = async (repo: string) => { headers.append("Authorization", `token ${apiKey}`); } - let data = {}; - let statusCode = 0; + let data: GitHubRepoData = {}; + let statusCode; const response = await fetch(`https://api.github.com/repos/${repo}`, { headers: headers, }).catch((e) => { - console.error(`Network error: ${e.message}`); + error('GitHub API', `Network error for ${repo}: ${e.message}`); // Return a placeholder response to handle this gracefully return null; }); @@ -39,7 +46,7 @@ const fetchGitHubData = async (repo: string) => { if (response.ok) { data = await response.json(); } else { - console.error(`HTTP error: Received status code ${response.status}`); + error('GitHub API', `HTTP ${response.status} for ${repo}`); } return { data, statusCode }; @@ -50,7 +57,7 @@ const fetchGitHubData = async (repo: string) => { * Given a license object, return SPDX ID, or a formatted name * @param license */ -const formatLicense = (license: { spdx_id?: string, name?: string }) => { +const formatLicense = (license?: { spdx_id?: string, name?: string }) => { if (!license) { return "Unknown"; } @@ -65,7 +72,8 @@ const formatLicense = (license: { spdx_id?: string, name?: string }) => { * E.g. If greater than thousand, then return in k format * @param num */ -const formatBigNumber = (num: number) => { +const formatBigNumber = (num: number | undefined) => { + if (num == null) return 0; if (num > 1000) { return `${(num / 1000).toFixed(1)}k`; } @@ -73,7 +81,7 @@ const formatBigNumber = (num: number) => { } // Initiate GitHub fetch, and make available to the component -const stats = (await fetchGitHubData(github)) as any; +const stats = await fetchGitHubData(github); const { stargazers_count, forks_count, open_issues_count, language, license, diff --git a/web/src/components/things/RedditDetailedInfo.astro b/web/src/components/things/RedditDetailedInfo.astro index 546e27b..e7776bb 100644 --- a/web/src/components/things/RedditDetailedInfo.astro +++ b/web/src/components/things/RedditDetailedInfo.astro @@ -1,172 +1,191 @@ --- - import type { RedditData } from '@utils/fetch-reddit-info'; -import { timestampToDate, timeAgo } from '@utils/dates-n-stuff'; -import FontAwesome from "@components/form/FontAwesome.svelte" - +import { timestampToDate } from '@utils/dates-n-stuff'; interface Props { - redditData: RedditData; -}; + redditData: RedditData; +} const { redditData } = Astro.props; - --- <div class="reddit-info-wrapper"> - <div class="left"> - <h3>Reddit</h3> - <p class="website-title"> - <img src={redditData.info.icon} width="16" /> - {redditData.info.title || redditData.info.name} - </p> - <p class="website-description">{redditData.info.description}</p> - {redditData.info.banner && (<img class="banner" width="300" src={redditData.info.banner} alt="Banner" />)} - <ul class="list-table"> - {redditData.info.dateCreated && ( - <li> - <span class="lbl">Created at</span> - <span class="val">{timestampToDate(redditData.info.dateCreated * 1000)}</span> - </li> - )} - <li> - <span class="lbl">Members</span> - <span class="val">{redditData.info.subscribers}</span> - </li> - <li> - <span class="lbl">Join</span> - <span class="val"><a href={`https://reddit.com/${redditData.info.name}`}>{redditData.info.name}</a></span> - </li> - </ul> - </div> - <div class="right"> - <h4>Posts</h4> - <ul class="posts"> - {redditData.posts.map((post) => ( - <li title={post.body}> - ○ <a href={post.url} target="_blank">{post.title}</a> - <span class="votes">(▲ {post.upVotes} ▼ {post.downVotes})</span> - </li> - ))} - </ul> - </div> + <div class="left"> + <h3>Reddit</h3> + <p class="website-title"> + <img src={redditData.info.icon} width="16" /> + {redditData.info.title || redditData.info.name} + </p> + <p class="website-description">{redditData.info.description}</p> + { + redditData.info.banner && ( + <img + class="banner" + width="300" + src={redditData.info.banner} + alt="Banner" + /> + ) + } + <ul class="list-table"> + { + redditData.info.dateCreated && ( + <li> + <span class="lbl">Created at</span> + <span class="val"> + {timestampToDate(redditData.info.dateCreated * 1000)} + </span> + </li> + ) + } + <li> + <span class="lbl">Members</span> + <span class="val">{redditData.info.subscribers}</span> + </li> + <li> + <span class="lbl">Join</span> + <span class="val" + ><a href={`https://reddit.com/${redditData.info.name}`} + >{redditData.info.name}</a + ></span + > + </li> + </ul> + </div> + <div class="right"> + <h4>Posts</h4> + <ul class="posts"> + { + redditData.posts.map((post) => ( + <li title={post.body}> + ○{' '} + <a href={post.url} target="_blank"> + {post.title} + </a> + <span class="votes"> + (▲ {post.upVotes} ▼ {post.downVotes}) + </span> + </li> + )) + } + </ul> + </div> </div> - <style lang="scss"> -.reddit-info-wrapper { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - gap: 1rem; - .left, .right { - width: calc(50% - 1rem); - @media screen and (max-width: 768px){ - width: 100%; - } - } -} + .reddit-info-wrapper { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + .left, + .right { + width: calc(50% - 1rem); + @media screen and (max-width: 768px) { + width: 100%; + } + } + } -.banner { - margin: 0.5rem auto; - border-radius: var(--curve-md); - width: 100%; -} + .banner { + margin: 0.5rem auto; + border-radius: var(--curve-md); + width: 100%; + } -h3 { - margin: 0 0 1rem 0; - font-size: 1.6rem; -} + h3 { + margin: 0 0 1rem 0; + font-size: 1.6rem; + } -h4 { - margin: 1rem 0 0 0; - font-size: 1.2rem; -} -p { - margin: 0; - display: flex; - align-items: center; - gap: 0.25rem; - :global(svg) { - width: 1rem; - } - img { - border-radius: var(--curve-sm); - } -} + h4 { + margin: 1rem 0 0 0; + font-size: 1.2rem; + } + p { + margin: 0; + display: flex; + align-items: center; + gap: 0.25rem; + :global(svg) { + width: 1rem; + } + img { + border-radius: var(--curve-sm); + } + } -ul { - padding-left: 0; - list-style: none; - max-height: 300px; - overflow-y: auto; - overflow-x: hidden; - img { - border-radius: var(--curve-sm); - } - .list-item { - display: flex; - flex-direction: column; - margin-bottom: 0.5rem; - } - &.list-table { - font-size: 0.9rem; - padding-left: 0; - li { - display: flex; - justify-content: space-between; - padding: 0.1rem 0; - .lbl { - font-weight: 400; - } - &:not(:last-child) { - border-bottom: 1px solid #5f53f440; - } - } - } -} - -.posts { - list-style: circle; - padding-left: 1rem; - font-size: 0.9rem; - li { - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - a { - max-width: 80%; - } - .votes { - font-size: 0.8rem; - opacity: 0.5; - } - } -} - -.website-title, .website-description { - font-size: 0.9rem; - opacity: 0.8; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - border-left: 2px solid var(--accent-3); - padding-left: 0.5rem; -} -.website-title { - font-weight: 500; -} -.website-description { - font-style: italic; - -webkit-line-clamp: 3; -} -.explainer { - font-size: 0.8rem; - opacity: 0.8; - font-style: italic; -} + ul { + padding-left: 0; + list-style: none; + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; + img { + border-radius: var(--curve-sm); + } + .list-item { + display: flex; + flex-direction: column; + margin-bottom: 0.5rem; + } + &.list-table { + font-size: 0.9rem; + padding-left: 0; + li { + display: flex; + justify-content: space-between; + padding: 0.1rem 0; + .lbl { + font-weight: 400; + } + &:not(:last-child) { + border-bottom: 1px solid #5f53f440; + } + } + } + } + .posts { + list-style: circle; + padding-left: 1rem; + font-size: 0.9rem; + li { + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + a { + max-width: 80%; + } + .votes { + font-size: 0.8rem; + opacity: 0.5; + } + } + } + .website-title, + .website-description { + font-size: 0.9rem; + opacity: 0.8; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + border-left: 2px solid var(--accent-3); + padding-left: 0.5rem; + } + .website-title { + font-weight: 500; + } + .website-description { + font-style: italic; + -webkit-line-clamp: 3; + } + .explainer { + font-size: 0.8rem; + opacity: 0.8; + font-style: italic; + } </style> diff --git a/web/src/components/things/SaveListing.svelte b/web/src/components/things/SaveListing.svelte index a725971..2ea7a90 100644 --- a/web/src/components/things/SaveListing.svelte +++ b/web/src/components/things/SaveListing.svelte @@ -1,7 +1,7 @@ <script lang="ts"> import { onMount } from 'svelte'; - import FontAwesome from "@components/form/FontAwesome.svelte"; - import { slugify } from "@utils/fetch-data"; + import FontAwesome from '@components/form/FontAwesome.svelte'; + import { slugify } from '@utils/fetch-data'; export let categoryName: string; export let sectionName: string; @@ -34,23 +34,24 @@ </script> <div class="wrapper-or-something"> -<button - class={`save-container ${isSaved ? 'saved' : ''} ${showLabel ? 'label-button' : ''}`} - title={`Save ${serviceName}`} - on:click={toggleSave}> - {#if showLabel } - <span> - {isSaved ? 'Saved' : 'Save'} - </span> - {/if} - <FontAwesome iconName="saveListing"/> -</button> + <button + class={`save-container ${isSaved ? 'saved' : ''} ${showLabel ? 'label-button' : ''}`} + title={`Save ${serviceName}`} + on:click={toggleSave} + > + {#if showLabel} + <span> + {isSaved ? 'Saved' : 'Save'} + </span> + {/if} + <FontAwesome iconName="saveListing" /> + </button> -{#if showLabel && isSaved } -<div class="done-msg"> - You can view all saved items in your <a href="/inventory">Inventory</a> -</div> -{/if} + {#if showLabel && isSaved} + <div class="done-msg"> + You can view all saved items in your <a href="/inventory">Inventory</a> + </div> + {/if} </div> <style lang="scss"> @@ -71,7 +72,7 @@ font-size: 1.2rem; opacity: 0.8; color: var(--foreground); - font-family: "Lekton"; + font-family: 'Lekton'; } :global(svg) { color: var(--foreground); @@ -98,9 +99,8 @@ box-shadow: 3px 3px 0 var(--box-outline); border: 1px solid var(--box-outline); background: var(--background-form); - + &:hover { - box-shadow: 4px 4px 0 var(--box-outline); } } @@ -110,7 +110,7 @@ max-width: 165px; font-size: 0.8rem; opacity: 0.6; - @media(max-width: 768px) { + @media (max-width: 768px) { display: none; } } diff --git a/web/src/components/things/SavedServices.svelte b/web/src/components/things/SavedServices.svelte index 214c498..393e908 100644 --- a/web/src/components/things/SavedServices.svelte +++ b/web/src/components/things/SavedServices.svelte @@ -1,48 +1,54 @@ <script lang="ts"> -import { onMount } from 'svelte'; -import { writable } from 'svelte/store'; + import { onMount } from 'svelte'; + import { writable } from 'svelte/store'; -import type { Category, Service } from '../../types/Service'; -import { slugify } from "@utils/fetch-data"; -import ServiceCard from './ServiceCard.svelte'; + import type { Category, Service } from '../../types/Service'; + import { slugify } from '@utils/fetch-data'; + import ServiceCard from './ServiceCard.svelte'; -export let allData: Category[]; -export let serviceList: string[] | null = null; + export let allData: Category[]; + export let serviceList: string[] | null = null; -interface SavedServices { - category: string; - section: string; - service: Service; -} + interface SavedServices { + category: string; + section: string; + service: Service; + } -const savedServices = writable<SavedServices[]>([]); + const savedServices = writable<SavedServices[]>([]); -onMount(async () => { - const results: SavedServices[] = []; - const saved = serviceList || JSON.parse(localStorage.getItem('savedServices') || '[]'); - saved.forEach((serviceId: string) => { - const parts = serviceId.split('/'); - const categoryName = parts[0]; - const sectionName = parts[1]; - const serviceName = parts[2]; + onMount(async () => { + const results: SavedServices[] = []; + const saved = + serviceList || JSON.parse(localStorage.getItem('savedServices') || '[]'); + saved.forEach((serviceId: string) => { + const parts = serviceId.split('/'); + const categoryName = parts[0]; + const sectionName = parts[1]; + const serviceName = parts[2]; - const category = allData.find((category) => slugify(category.name) === categoryName); - if (!category) return; - const section = category.sections.find((section) => slugify(section.name) === sectionName); - if (!section) return; - const service = section.services.find((service) => slugify(service.name) === serviceName); - if (!service) return; - results.push({ category: category.name, section: section.name, service}); + const category = allData.find( + (category) => slugify(category.name) === categoryName, + ); + if (!category) return; + const section = category.sections.find( + (section) => slugify(section.name) === sectionName, + ); + if (!section) return; + const service = section.services.find( + (service) => slugify(service.name) === serviceName, + ); + if (!service) return; + results.push({ category: category.name, section: section.name, service }); + }); + savedServices.set(results || []); }); - savedServices.set(results || []); -}); - </script> <div> {#if $savedServices.length > 0} <div class="saved-services"> - {#each $savedServices as thingy} + {#each $savedServices as thingy (thingy.service.name + thingy.section)} <ServiceCard categoryName={thingy.category} sectionName={thingy.section} @@ -52,10 +58,13 @@ onMount(async () => { </div> {:else if !serviceList} <div class="nothing-yet"> - <p>Here you'll find a list of all the software and services you've bookmarked.</p> + <p> + Here you'll find a list of all the software and services you've + bookmarked. + </p> <small> - All data is stored on-device, in your browser's local storage, - and not sent anywhere unless you choose to share it + All data is stored on-device, in your browser's local storage, and not + sent anywhere unless you choose to share it </small> <p class="nope">Nothing saved yet!</p> </div> diff --git a/web/src/components/things/Search.svelte b/web/src/components/things/Search.svelte index a90f76e..ddbcf59 100644 --- a/web/src/components/things/Search.svelte +++ b/web/src/components/things/Search.svelte @@ -2,16 +2,17 @@ import { onMount } from 'svelte'; import Fuse from 'fuse.js'; import { slugify } from '@utils/fetch-data'; - import type { Category, Section, Service, ShortService } from '../../types/Service'; + import type { Category } from '../../types/Service'; import { formatLink } from '@utils/parse-markdown'; import { prepareSearchItems, searchOptions } from '@utils/do-searchy-searchy'; + import type { SearchItem } from '@utils/do-searchy-searchy'; export let data: Category[]; export let previousSearch: string | undefined = undefined; - let fuse: Fuse<any>; + let fuse: Fuse<SearchItem>; let searchQuery = ''; - let results: any[] = []; + let results: SearchItem[]; // Initialize Fuse.js onMount(() => { @@ -20,9 +21,9 @@ }); const makeResultLink = (cat?: string, sec?: string, itm?: string) => { - if (!cat) return '/' - if (!sec) return `/${slugify(cat)}` - if (!itm) return `/${slugify(cat)}/${slugify(sec)}` + if (!cat) return '/'; + if (!sec) return `/${slugify(cat)}`; + if (!itm) return `/${slugify(cat)}/${slugify(sec)}`; return `/${slugify(cat)}/${slugify(sec)}/${slugify(itm)}`; }; @@ -40,7 +41,7 @@ const makeTitle = (typ: string, desc: string) => { if (desc && typ === 'Service') { - return `${desc.slice(0, 60)}...` + return `${desc.slice(0, 60)}...`; } return ''; }; @@ -59,7 +60,10 @@ // Watch for changes in the search query and update results $: if (searchQuery) { - results = fuse.search(searchQuery).map(result => result.item).splice(0, 25); + results = fuse + .search(searchQuery) + .map((result) => result.item) + .splice(0, 25); } else { results = []; } @@ -79,35 +83,48 @@ bind:value={searchQuery} on:keydown={handleKeyDown} /> - - + {#if searchQuery.length > 0} <div class="suggestions"> <ul> - {#each results as result} - <li class="result-row"> - <a - href={makeResultLink(result.category, result.sectionName, result.name)} - title={makeTitle(result.type, result.description)} + {#each results as result (result.name + result.category + result.sectionName)} + <li class="result-row"> + <a + href={makeResultLink( + result.category, + result.sectionName, + result.name, + )} + title={makeTitle(result.type, result.description)} > - <span class="name"> - {#if result.type === 'Service'} - <img src={makeLogoSrc(result.logo, result.url)} alt={result.name} width="20" height="20" loading="lazy" /> - {/if} - - {makeResultText(result.category, result.sectionName, result.name)} - - {#if result.itemCount} - <i>({result.itemCount})</i> - {/if} - </span> - <span class="path"> - {result.category ? `${result.category}` : ''} - {result.sectionName ? `➔ ${result.sectionName}` : ''} - {result.name ? `➔ ${result.name}` : ''} - </span> - </a> - </li> + <span class="name"> + {#if result.type === 'Service'} + <img + src={makeLogoSrc(result.logo, result.url)} + alt={result.name} + width="20" + height="20" + loading="lazy" + /> + {/if} + + {makeResultText( + result.category, + result.sectionName, + result.name, + )} + + {#if result.itemCount} + <i>({result.itemCount})</i> + {/if} + </span> + <span class="path"> + {result.category ? `${result.category}` : ''} + {result.sectionName ? `➔ ${result.sectionName}` : ''} + {result.name ? `➔ ${result.name}` : ''} + </span> + </a> + </li> {/each} </ul> </div> @@ -115,103 +132,101 @@ </div> <style lang="scss"> - -.search-wrap { - display: flex; - flex-direction: column; - position: relative; - margin: 1rem auto; - max-width: 900px; - margin: 0 auto; - width: 80vw; - label { - margin: 0.5rem 0; + .search-wrap { display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - .enter-hint { - font-size:0.8rem; - opacity: 0.7; + flex-direction: column; + position: relative; + margin: 1rem auto; + max-width: 900px; + margin: 0 auto; + width: 80vw; + label { + margin: 0.5rem 0; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + .enter-hint { + font-size: 0.8rem; + opacity: 0.7; + } } - } - input { - padding: 0.5rem 1rem; - font-size: 1.8rem; - border: 2px solid var(--box-outline); - border-radius: var(--curve-lg); - box-shadow: 3px 3px 0 var(--box-outline); - z-index: 4; - background: var(--accent-fg); - color: var(--foreground); - &:focus { - outline: none; - border-color: var(--accent); - box-shadow: 3px 3px 0 var(--accent); - } - } - - .suggestions { - ul { - position: absolute; - background: var(--background-form); - z-index: 3; - width: 100%; - - list-style: none; - padding: 0; - margin: 0; + input { + padding: 0.5rem 1rem; + font-size: 1.8rem; border: 2px solid var(--box-outline); - border-radius: 0 0 var(--curve-lg) var(--curve-lg); + border-radius: var(--curve-lg); box-shadow: 3px 3px 0 var(--box-outline); - transform: translateY(-0.5rem); - max-height: 500px; - overflow-y: scroll; - background: var(--background-form); - li.result-row { - padding: 0.5rem 1rem; - margin: 0.5rem 0; - a { - color: var(--foreground); - text-decoration: none; - display: flex; - justify-content: space-between; - flex-wrap: wrap; - .name { + z-index: 4; + background: var(--accent-fg); + color: var(--foreground); + &:focus { + outline: none; + border-color: var(--accent); + box-shadow: 3px 3px 0 var(--accent); + } + } + + .suggestions { + ul { + position: absolute; + background: var(--background-form); + z-index: 3; + width: 100%; + + list-style: none; + padding: 0; + margin: 0; + border: 2px solid var(--box-outline); + border-radius: 0 0 var(--curve-lg) var(--curve-lg); + box-shadow: 3px 3px 0 var(--box-outline); + transform: translateY(-0.5rem); + max-height: 500px; + overflow-y: scroll; + background: var(--background-form); + li.result-row { + padding: 0.5rem 1rem; + margin: 0.5rem 0; + a { + color: var(--foreground); + text-decoration: none; display: flex; - align-items: center; - gap: 0.5rem; - i { - color: var(--accent); - font-weight: bold; - font-style: normal; + justify-content: space-between; + flex-wrap: wrap; + .name { + display: flex; + align-items: center; + gap: 0.5rem; + i { + color: var(--accent); + font-weight: bold; + font-style: normal; + } + img { + border-radius: var(--curve-md); + width: 1.25rem; + height: 1.25rem; + font-size: 10px; + color: var(--accent); + overflow: hidden; + background: #f453974d; + padding: 1px; + } } - img { - border-radius: var(--curve-md); - width: 1.25rem; - height: 1.25rem; - font-size: 10px; - color: var(--accent); - overflow: hidden; - background: #f453974d; - padding: 1px; + .path { + font-size: 0.85rem; + opacity: 0.7; } } - .path { - font-size: 0.85rem; - opacity: 0.7; - } - } - &:hover { - background: var(--accent); - .name i { - color: var(--accent-fg); + &:hover { + background: var(--accent); + .name i { + color: var(--accent-fg); + } } } } } } -} - </style> diff --git a/web/src/components/things/SectionList.astro b/web/src/components/things/SectionList.astro index 76e9777..ad6e746 100644 --- a/web/src/components/things/SectionList.astro +++ b/web/src/components/things/SectionList.astro @@ -1,6 +1,4 @@ --- - - import FontAwesome from '@components/form/FontAwesome.svelte'; import { slugify } from '../../utils/fetch-data'; @@ -9,144 +7,161 @@ import type { Section } from '../../types/Service'; interface Props { title: string; sections: Section[]; - bigTitle?: boolean; + bigTitle?: boolean; } const { title, sections, bigTitle } = Astro.props; - --- <div class="wrap"> + { + bigTitle ? ( + <h2> + <FontAwesome iconName={slugify(title)} /> + {title}{' '} + </h2> + ) : ( + <a class="category-title" href={`/${slugify(title)}`}> + <h3>{title}</h3> + </a> + ) + } -{ bigTitle ? - <h2><FontAwesome iconName={slugify(title)} />{title} </h2> : - <a class="category-title" href={`/${slugify(title)}`}><h3>{title}</h3></a> -} + { + !bigTitle && ( + <span class="section-icon"> + <FontAwesome iconName={slugify(title)} /> + </span> + ) + } -{ !bigTitle && <span class="section-icon"><FontAwesome iconName={slugify(title)} /></span> } - -<ul> - {sections.map((section) => ( - <li class="section"> - <a href={`/${slugify(title)}/${slugify(section.name)}`}> - <span>{section.name}</span> - <span class="service-count">({section.services ? section.services.length : 0})</span> - </a> - </li> - ))} -</ul> + <ul> + { + sections.map((section) => ( + <li class="section"> + <a href={`/${slugify(title)}/${slugify(section.name)}`}> + <span>{section.name}</span> + <span class="service-count"> + ({section.services ? section.services.length : 0}) + </span> + </a> + </li> + )) + } + </ul> </div> - <style lang="scss"> + .wrap { + position: relative; + &:hover { + .section-icon :global(svg) { + opacity: 1; + transform: scale(1.2); + } + } + } -.wrap { - position: relative; - &:hover { - .section-icon :global(svg){ - opacity: 1; - transform: scale(1.2); - } - } -} + h2 { + font-family: 'Lekton', sans-serif; + font-size: 2rem; + margin: -2rem 0 2rem -2rem; + box-shadow: 6px 6px 0 var(--box-outline); + border: 2px solid var(--box-outline); + background: var(--accent); + color: var(--accent-fg); + width: fit-content; + padding: 0.25rem 0.5rem; + display: flex; + justify-content: center; + gap: 1rem; + :global(svg) { + width: 2rem; + height: 2rem; + color: var(--accent-fg); + } + } -h2 { - font-family: "Lekton", sans-serif; - font-size: 2rem; - margin: -2rem 0 2rem -2rem; - box-shadow: 6px 6px 0 var(--box-outline); - border: 2px solid var(--box-outline); - background: var(--accent); - color: var(--accent-fg); - width: fit-content; - padding: 0.25rem 0.5rem; - display: flex; - justify-content: center; - gap: 1rem; - :global(svg) { - width: 2rem; - height: 2rem; - color: var(--accent-fg); - } -} + .category-title { + text-decoration: none; + color: var(--foreground); + z-index: 2; + position: relative; + h3 { + font-family: 'Lekton', sans-serif; + font-weight: bold; + margin: 0; + font-size: 1.8rem; + position: relative; + &:after { + background: none repeat scroll 0 0 transparent; + bottom: 0; + content: ''; + display: block; + height: 3px; + left: 50%; + position: absolute; + background: var(--accent); + transition: + width 0.3s ease 0s, + left 0.3s ease 0s; + width: 0; + } + &:hover:after { + width: 80%; + left: 0; + } + } + } -.category-title { - text-decoration: none; - color: var(--foreground); - z-index: 2; - position: relative; - h3 { - font-family: "Lekton", sans-serif; - font-weight: bold; - margin: 0; - font-size: 1.8rem; - position: relative; - &:after { - background: none repeat scroll 0 0 transparent; - bottom: 0; - content: ""; - display: block; - height: 3px; - left: 50%; - position: absolute; - background: var(--accent); - transition: width 0.3s ease 0s, left 0.3s ease 0s; - width: 0; - } - &:hover:after { - width: 80%; - left: 0; - } - } - -} + ul { + list-style: circle; + padding-left: 1rem; + li { + margin: 0.5rem 0; + font-size: 1.25rem; + a { + text-decoration: none; + color: var(--foreground); + position: relative; + &:after { + background: none repeat scroll 0 0 transparent; + bottom: 0; + content: ''; + display: block; + height: 2px; + left: 50%; + position: absolute; + background: var(--accent-3); + transition: + width 0.15s ease 0s, + left 0.15s ease 0s; + width: 0; + } + &:hover:after { + text-decoration: underline; + width: 80%; + left: 0; + } + } + .service-count { + color: var(--accent-3); + } + } + } -ul { - list-style: circle; - padding-left: 1rem; - li { - margin: 0.5rem 0; - font-size: 1.25rem; - a { - text-decoration: none; - color: var(--foreground); - position: relative; - &:after { - background: none repeat scroll 0 0 transparent; - bottom: 0; - content: ""; - display: block; - height: 2px; - left: 50%; - position: absolute; - background: var(--accent-3); - transition: width 0.15s ease 0s, left 0.15s ease 0s; - width: 0; - } - &:hover:after { - text-decoration: underline; - width: 80%; - left: 0; - } - } - .service-count { - color: var(--accent-3); - } - } -} - -.section-icon { - position: absolute; - right: 0; - top: 0; - width: fit-content; - :global(svg) { - width: 2rem; - height: 2rem; - opacity: 0.5; - text-shadow: 3px 3px 0 black; - color: var(--accent-3); - transition: all 0.2s ease-in-out; - } -} + .section-icon { + position: absolute; + right: 0; + top: 0; + width: fit-content; + :global(svg) { + width: 2rem; + height: 2rem; + opacity: 0.5; + text-shadow: 3px 3px 0 black; + color: var(--accent-3); + transition: all 0.2s ease-in-out; + } + } </style> diff --git a/web/src/components/things/ServiceCard.astro b/web/src/components/things/ServiceCard.astro index f7756f5..312d0c0 100644 --- a/web/src/components/things/ServiceCard.astro +++ b/web/src/components/things/ServiceCard.astro @@ -1,5 +1,4 @@ --- - import { formatLink } from '@utils/parse-markdown'; import type { Service } from 'src/types/Service'; import FontAwesome from '@components/form/FontAwesome.svelte'; @@ -7,86 +6,91 @@ import SaveListing from '@components/things/SaveListing.svelte'; import { slugify } from '@utils/fetch-data'; interface Props { - service: Service; - categoryName: string; - sectionName: string; + service: Service; + categoryName: string; + sectionName: string; } -const { - service, - sectionName, - categoryName, -} = Astro.props; - +const { service, sectionName, categoryName } = Astro.props; --- <script> - document.addEventListener('DOMContentLoaded', () => { - const serviceIcons = document.querySelectorAll<HTMLImageElement>('.service-icon'); - const broke = '/broken-image.png'; + document.addEventListener('DOMContentLoaded', () => { + const serviceIcons = + document.querySelectorAll<HTMLImageElement>('.service-icon'); + const broke = '/broken-image.png'; - serviceIcons.forEach(function(icon) { - icon.onerror = function() { - const imgElement = this as HTMLImageElement; - const serviceUrl = imgElement.getAttribute('data-service-url'); - const newSrcAttribute = (imgElement.src.includes('on.ho') ? broke : `https://icon.horse/icon/${serviceUrl}`); - imgElement.src = imgElement.src !== newSrcAttribute ? newSrcAttribute : broke; - imgElement.onerror = null; - }; - }); -}); + serviceIcons.forEach(function (icon) { + icon.onerror = function () { + const imgElement = this as HTMLImageElement; + const serviceUrl = imgElement.getAttribute('data-service-url'); + const newSrcAttribute = imgElement.src.includes('on.ho') + ? broke + : `https://icon.horse/icon/${serviceUrl}`; + imgElement.src = + imgElement.src !== newSrcAttribute ? newSrcAttribute : broke; + imgElement.onerror = null; + }; + }); + }); </script> - - <div class="service" id={slugify(service.name)}> - <div class="service-head"> - <a class="service-title" href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`}> - <h4>{service.name}</h4> - </a> - {service.followWith && <p class="follow-with">({service.followWith})</p> } - </div> + <div class="service-head"> + <a + class="service-title" + href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`} + > + <h4>{service.name}</h4> + </a> + {service.followWith && <p class="follow-with">({service.followWith})</p>} + </div> - <div class="save-listing"> - <SaveListing client:visible - categoryName={categoryName} - sectionName={sectionName} - serviceName={service.name} - /> - </div> + <div class="save-listing"> + <SaveListing + client:visible + categoryName={categoryName} + sectionName={sectionName} + serviceName={service.name} + /> + </div> - <div class="service-body"> - <img - width="40" - height="40" - loading="lazy" - decoding="async" - class="service-icon" - alt={`${service.name} Icon`} - data-service-url={formatLink(service.url)} - src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} - /> - <div class="service-body"> - <p set:html={service.description}></p> - </div> - </div> + <div class="service-body"> + <img + width="40" + height="40" + loading="lazy" + decoding="async" + class="service-icon" + alt={`${service.name} Icon`} + data-service-url={formatLink(service.url)} + src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} + /> + <div class="service-body"> + <p set:html={service.description} /> + </div> + </div> - <div class="service-links"> - <a class="link" href={service.url}> - <FontAwesome iconName="website"/> <span>{formatLink(service.url)}</span> - </a> - {service.github && - <a class="link" href={`https://github.com/${service.github}`}> - <FontAwesome iconName="sourceCode"/> GitHub - </a> - } - <a href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`}> - <FontAwesome iconName="viewReport" /> View Report ➔ - </a> + <div class="service-links"> + <a class="link" href={service.url}> + <FontAwesome iconName="website" /> + <span>{formatLink(service.url)}</span> + </a> + { + service.github && ( + <a class="link" href={`https://github.com/${service.github}`}> + <FontAwesome iconName="sourceCode" /> GitHub + </a> + ) + } + <a + href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`} + > + <FontAwesome iconName="viewReport" /> View Report ➔ + </a> + </div> +</div> - </div> - </div> - - <style lang="scss"> - @import './service-card.scss'; - </style> +<style lang="scss"> + @use './service-card.scss'; +</style> diff --git a/web/src/components/things/ServiceCard.svelte b/web/src/components/things/ServiceCard.svelte index d76be99..3b06ed1 100644 --- a/web/src/components/things/ServiceCard.svelte +++ b/web/src/components/things/ServiceCard.svelte @@ -17,7 +17,10 @@ <div class="service" id={serviceRef}> <div class="service-head"> - <a class="service-title" href={`/${categorySlug}/${sectionSlug}/${serviceRef}`}> + <a + class="service-title" + href={`/${categorySlug}/${sectionSlug}/${serviceRef}`} + > <h4>{service.name}</h4> </a> {#if service.followWith} @@ -26,11 +29,7 @@ </div> <div class="save-listing"> - <SaveListing - categoryName={categoryName} - sectionName={sectionName} - serviceName={service.name} - /> + <SaveListing {categoryName} {sectionName} serviceName={service.name} /> </div> <div class="service-body"> @@ -45,6 +44,7 @@ src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} /> <div class="service-body"> + <!-- eslint-disable-next-line svelte/no-at-html-tags -- description is from curated YAML data, not user input --> <p>{@html service.description}</p> </div> </div> @@ -65,5 +65,5 @@ </div> <style lang="scss"> - @import './service-card.scss'; + @use './service-card.scss'; </style> diff --git a/web/src/components/things/ServiceList.astro b/web/src/components/things/ServiceList.astro index db4f69b..2be6a08 100644 --- a/web/src/components/things/ServiceList.astro +++ b/web/src/components/things/ServiceList.astro @@ -1,5 +1,4 @@ --- - import Button from '@components/form/Button.astro'; import { parseMarkdown, formatLink } from '@utils/parse-markdown'; import type { Service } from 'src/types/Service'; @@ -11,326 +10,387 @@ import GitHubMetrics from '@components/things/ItemGitHubMetrics.astro'; import SaveListing from '@components/things/SaveListing.svelte'; interface Props { - services: Service[]; - subHeading?: boolean; - buttonLink?: string; - noGitHubMetrics?: boolean; - sectionName: string; - categoryName: string; + services: Service[]; + subHeading?: boolean; + buttonLink?: string; + noGitHubMetrics?: boolean; + sectionName: string; + categoryName: string; } const { - services, - subHeading, - buttonLink, - noGitHubMetrics, - sectionName, - categoryName, + services, + subHeading, + buttonLink, + noGitHubMetrics, + sectionName, + categoryName, } = Astro.props; - --- <script> - document.addEventListener('DOMContentLoaded', () => { - const serviceIcons = document.querySelectorAll<HTMLImageElement>('.service-icon'); - const broke = '/broken-image.png'; + document.addEventListener('DOMContentLoaded', () => { + const serviceIcons = + document.querySelectorAll<HTMLImageElement>('.service-icon'); + const broke = '/broken-image.png'; - serviceIcons.forEach(function(icon) { - icon.onerror = function() { - const imgElement = this as HTMLImageElement; - const serviceUrl = imgElement.getAttribute('data-service-url'); - const newSrcAttribute = (imgElement.src.includes('on.ho') ? broke : `https://icon.horse/icon/${serviceUrl}`); - imgElement.src = imgElement.src !== newSrcAttribute ? newSrcAttribute : broke; - imgElement.onerror = null; - }; - }); -}); + serviceIcons.forEach(function (icon) { + icon.onerror = function () { + const imgElement = this as HTMLImageElement; + const serviceUrl = imgElement.getAttribute('data-service-url'); + const newSrcAttribute = imgElement.src.includes('on.ho') + ? broke + : `https://icon.horse/icon/${serviceUrl}`; + imgElement.src = + imgElement.src !== newSrcAttribute ? newSrcAttribute : broke; + imgElement.onerror = null; + }; + }); + }); </script> - - <section> - {services && services.length > 0 ? ( - <ul> - {services.map((service: Service) => ( - <li id={slugify(service.name)}> - <DeleteListing client:load categoryName={categoryName} sectionName={sectionName} serviceName={service.name} /> - <div class="save-listing"> - <SaveListing client:visible - categoryName={categoryName} - sectionName={sectionName} - serviceName={service.name} - /> - </div> - <div class="service-head"> - <img - width="40" - height="40" - loading="lazy" - decoding="async" - class="service-icon" - alt={`${service.name} Icon`} - data-service-url={formatLink(service.url)} - src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} - /> + { + services && services.length > 0 ? ( + <ul> + {services.map((service: Service) => ( + <li id={slugify(service.name)}> + <DeleteListing + client:load + categoryName={categoryName} + sectionName={sectionName} + serviceName={service.name} + /> + <div class="save-listing"> + <SaveListing + client:visible + categoryName={categoryName} + sectionName={sectionName} + serviceName={service.name} + /> + </div> + <div class="service-head"> + <img + width="40" + height="40" + loading="lazy" + decoding="async" + class="service-icon" + alt={`${service.name} Icon`} + data-service-url={formatLink(service.url)} + src={ + service.icon || + `https://icon.horse/icon/${formatLink(service.url)}` + } + /> - <a class="service-title" href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`}> - {subHeading ? <h4>{service.name}</h4> : <h3>{service.name}</h3>} - </a> - {service.followWith && <p class="follow-with">({service.followWith})</p> } - <a class="service-link" href={service.url}>{formatLink(service.url)}</a> - </div> - <div class="service-body"> - <p set:html={parseMarkdown(service.description)}></p> - <div class="service-stats"> - <div class="left"> - { service.securityAudited && ( - <span class="meta-item great" title={`${service.name} has been security audited by an accredited auditor, with results published publicly`}> - <FontAwesome iconName="securityAudited" /> Security Audited - </span> - )} - { service.acceptsCrypto && ( - <span class="meta-item great" title={`${service.name} accepts anonymous payment methods`}> - <FontAwesome iconName="cryptoAccepted" /> Crypto Payments Accepted - </span> - )} - { service.securityAudited === false && ( - <span class="meta-item warning" title={`${service.name} has not been audited`}> - <FontAwesome iconName="notSecurityAudited" /> No Security Audit - </span> - )} - { (service.openSource === false) && ( - <span class="warning"> - <FontAwesome iconName="closedSource" /> - Not Open Source - </span> - )} - { service.openSource || (service.github && service.openSource !== false) ? ( - <span class="meta-item great" title={`${service.name} is open source`}> - <FontAwesome iconName="openSource" /> Open Source - </span> - ) : null } - { service.github && !noGitHubMetrics && <GitHubMetrics github={service.github} /> } - { service.github && noGitHubMetrics && ( - <span class="meta-item" title={`View ${service.name} on GitHub`}> - <a href={`https://github.com/${service.github}`} target="_blank"> - <FontAwesome iconName="github" /> {service.github} - </a> - </span> - ) } - </div> - <div class="view-service"> - <a href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`}>View {service.name} Report</a> - </div> - </div> - </div> - </li> - ))} - </ul> - ) : ( - <p class="nothing-yet"> - <strong>⚠️ This section is still a work in progress ⚠️</strong><br /> - Check back soon, or help us complete it by submiting a pull request on GitHub. - <br /> - <span class="quick-submit">Or submit an entry <a href="/submit">here</a></span> - </p> - )} + <a + class="service-title" + href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`} + > + {subHeading ? <h4>{service.name}</h4> : <h3>{service.name}</h3>} + </a> + {service.followWith && ( + <p class="follow-with">({service.followWith})</p> + )} + <a class="service-link" href={service.url}> + {formatLink(service.url)} + </a> + </div> + <div class="service-body"> + <p set:html={parseMarkdown(service.description)} /> + <div class="service-stats"> + <div class="left"> + {service.securityAudited && ( + <span + class="meta-item great" + title={`${service.name} has been security audited by an accredited auditor, with results published publicly`} + > + <FontAwesome iconName="securityAudited" /> Security + Audited + </span> + )} + {service.acceptsCrypto && ( + <span + class="meta-item great" + title={`${service.name} accepts anonymous payment methods`} + > + <FontAwesome iconName="cryptoAccepted" /> Crypto Payments + Accepted + </span> + )} + {service.securityAudited === false && ( + <span + class="meta-item warning" + title={`${service.name} has not been audited`} + > + <FontAwesome iconName="notSecurityAudited" /> No Security + Audit + </span> + )} + {service.openSource === false && ( + <span class="warning"> + <FontAwesome iconName="closedSource" /> + Not Open Source + </span> + )} + {service.openSource || + (service.github && service.openSource !== false) ? ( + <span + class="meta-item great" + title={`${service.name} is open source`} + > + <FontAwesome iconName="openSource" /> Open Source + </span> + ) : null} + {service.github && !noGitHubMetrics && ( + <GitHubMetrics github={service.github} /> + )} + {service.github && noGitHubMetrics && ( + <span + class="meta-item" + title={`View ${service.name} on GitHub`} + > + <a + href={`https://github.com/${service.github}`} + target="_blank" + > + <FontAwesome iconName="github" /> {service.github} + </a> + </span> + )} + </div> + <div class="view-service"> + <a + href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`} + > + View {service.name} Report + </a> + </div> + </div> + </div> + </li> + ))} + </ul> + ) : ( + <p class="nothing-yet"> + <> + <strong>⚠️ This section is still a work in progress ⚠️</strong> + <br /> + </> + Check back soon, or help us complete it by submiting a pull request on + GitHub. + <br /> + <span class="quick-submit"> + Or submit an entry <a href="/submit">here</a> + </span> + </p> + ) + } - {buttonLink && ( - <Button title={`View all ${categoryName}`} className="view-all" text="View More..." url={buttonLink} /> - )} + { + buttonLink && ( + <Button + title={`View all ${categoryName}`} + className="view-all" + text="View More..." + url={buttonLink} + /> + ) + } </section> - <style lang="scss"> + section { + padding: 1rem 0; + position: relative; + &:not(:last-child) { + border-bottom: 2px solid var(--accent-3); + } + } - section { - padding: 1rem 0; - position: relative; - &:not(:last-child) { - border-bottom: 2px solid var(--accent-3); - } - } - - .nothing-yet { - font-size: 1.4rem; - opacity: 0.8; - font-style: italic; - text-align: center; - margin-bottom: 3rem; - .quick-submit { - margin-top: 1rem; - font-size: 0.8rem; - opacity: 0.8; - } - } - - ul { - list-style: none; - padding: 0; - margin: 0 0 3rem 0; - li { - margin-bottom: 1rem; - position: relative; - .save-listing { - position: absolute; - right: 1rem; - top: 1rem; - } - .service-head { - display: flex; - align-items: center; - gap: 0.5rem; - flex-wrap: wrap; - .service-title { - text-decoration: none; - color: var(--foreground); - h3, h4 { - margin: 0; - font-size: 1.6rem; - } + .nothing-yet { + font-size: 1.4rem; + opacity: 0.8; + font-style: italic; + text-align: center; + margin-bottom: 3rem; + .quick-submit { + margin-top: 1rem; + font-size: 0.8rem; + opacity: 0.8; + } + } - position: relative; - &:after { - background: none repeat scroll 0 0 transparent; - bottom: 0; - content: ""; - display: block; - height: 3px; - left: 50%; - position: absolute; - background: var(--accent-3); - transition: width 0.3s ease 0s, left 0.3s ease 0s; - width: 0; - } - &:hover:after { - width: 100%; - left: 0; - } - } - - .service-icon { - width: 2.5rem; - height: 2.5rem; - border-radius: var(--curve-sm); + ul { + list-style: none; + padding: 0; + margin: 0 0 3rem 0; + li { + margin-bottom: 1rem; + position: relative; + .save-listing { + position: absolute; + right: 1rem; + top: 1rem; + } + .service-head { + display: flex; + align-items: center; + gap: 0.5rem; + flex-wrap: wrap; + .service-title { + text-decoration: none; + color: var(--foreground); + h3, + h4 { + margin: 0; + font-size: 1.6rem; + } - font-size: 10px; - overflow: hidden; - color: var(--accent); - } - .follow-with { - opacity: 0.7; - font-style: italic; - margin: 0; - } - .service-link { - max-width: 300px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - } - - .service-body { - margin: 0.5rem 0 2rem; - opacity: 0.8; - :global(p) { - margin: 0; - font-size: 1.2rem; - :global(a) { - color: var(--foregorund); - } - } - .service-stats { - .left { - display: flex; - gap: 1rem; - flex-wrap: wrap; - align-items: center; - } - display: flex; - gap: 1rem; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - } - .view-service { - transition: all 0.2s ease-in-out; - opacity: 0.95; - a { - padding: 0.25rem 0.6rem; - width: fit-content; - right: 1rem; - font-size: 0.9rem; - background: var(--accent-3); - color: var(--accent-fg); - text-decoration: none; - border-radius: var(--curve-md); - } - &:hover { - opacity: 1; - transform: scale(1.05); - } - } + position: relative; + &:after { + background: none repeat scroll 0 0 transparent; + bottom: 0; + content: ''; + display: block; + height: 3px; + left: 50%; + position: absolute; + background: var(--accent-3); + transition: + width 0.3s ease 0s, + left 0.3s ease 0s; + width: 0; + } + &:hover:after { + width: 100%; + left: 0; + } + } - .meta-item, .warning { - display: flex; - align-items: center; - // justify-content: center; - gap: 0.25rem; - // opacity: 0.6; - font-size: 0.9rem; - padding: 0.5rem 0; - :global(svg) { - color: var(--foreground); - width: 1.2rem; - height: 1.2rem; - } - a { - text-decoration: none; - color: var(--foreground); - display: flex; - gap: 0.25rem; - &:hover { - color: var(--accent-3); - :global(svg) { - color: var(--accent-3); - } - } - } - } - .warning { - color: var(--danger); - :global(svg) { - color: var(--danger); - } - } - .great { - color: #0fb953; // var(--success); - :global(svg) { - color: #0fb953; // var(--success); - } - } - } - } - } + .service-icon { + width: 2.5rem; + height: 2.5rem; + border-radius: var(--curve-sm); - section :global(.view-all) { - width: fit-content; - position: absolute; - right: 1rem; - margin-top: -2.5rem; - background: var(--accent-3); - } + font-size: 10px; + overflow: hidden; + color: var(--accent); + } + .follow-with { + opacity: 0.7; + font-style: italic; + margin: 0; + } + .service-link { + max-width: 300px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + } - li:hover :global(.actions) { - opacity: 0.6; - :global(a):hover { - opacity: 1; - } - } - :global(.actions a):hover { - opacity: 1; - } - + .service-body { + margin: 0.5rem 0 2rem; + opacity: 0.8; + :global(p) { + margin: 0; + font-size: 1.2rem; + :global(a) { + color: var(--foregorund); + } + } + .service-stats { + .left { + display: flex; + gap: 1rem; + flex-wrap: wrap; + align-items: center; + } + display: flex; + gap: 1rem; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + } + .view-service { + transition: all 0.2s ease-in-out; + opacity: 0.95; + a { + padding: 0.25rem 0.6rem; + width: fit-content; + right: 1rem; + font-size: 0.9rem; + background: var(--accent-3); + color: var(--accent-fg); + text-decoration: none; + border-radius: var(--curve-md); + } + &:hover { + opacity: 1; + transform: scale(1.05); + } + } + + .meta-item, + .warning { + display: flex; + align-items: center; + // justify-content: center; + gap: 0.25rem; + // opacity: 0.6; + font-size: 0.9rem; + padding: 0.5rem 0; + :global(svg) { + color: var(--foreground); + width: 1.2rem; + height: 1.2rem; + } + a { + text-decoration: none; + color: var(--foreground); + display: flex; + gap: 0.25rem; + &:hover { + color: var(--accent-3); + :global(svg) { + color: var(--accent-3); + } + } + } + } + .warning { + color: var(--danger); + :global(svg) { + color: var(--danger); + } + } + .great { + color: #0fb953; // var(--success); + :global(svg) { + color: #0fb953; // var(--success); + } + } + } + } + } + + section :global(.view-all) { + width: fit-content; + position: absolute; + right: 1rem; + margin-top: -2.5rem; + background: var(--accent-3); + } + + li:hover :global(.actions) { + opacity: 0.6; + :global(a):hover { + opacity: 1; + } + } + :global(.actions a):hover { + opacity: 1; + } </style> diff --git a/web/src/components/things/SmartSuggestions.svelte b/web/src/components/things/SmartSuggestions.svelte index 8dc0609..3df98b1 100644 --- a/web/src/components/things/SmartSuggestions.svelte +++ b/web/src/components/things/SmartSuggestions.svelte @@ -1,7 +1,7 @@ <script lang="ts"> - import { onMount } from "svelte"; - import { writable } from "svelte/store"; - import type { Category, Service } from "../../types/Service"; + import { onMount } from 'svelte'; + import { writable } from 'svelte/store'; + import type { Category, Service } from '../../types/Service'; import { formatLink } from '@utils/parse-markdown'; import { slugify } from '@utils/fetch-data'; @@ -14,21 +14,23 @@ let results = writable<ServiceResult[]>([]); - const normalize = (str: string) => str.toLowerCase().replace(/[^a-z0-9]/g, ''); + const normalize = (str: string) => + str.toLowerCase().replace(/[^a-z0-9]/g, ''); onMount(async () => { - const apiEndpoint = `https://awesome-privacy.as93.workers.dev/${searchTerm}`; const fetchedServices = await fetch(apiEndpoint) .then((response) => response.json()) - .then((data) => (JSON.parse(data) || []).map((servName: string) => normalize(servName))); + .then((data) => + (JSON.parse(data) || []).map((servName: string) => normalize(servName)), + ); const tmpResults: ServiceResult[] = []; categories.forEach((category) => { (category.sections || []).forEach((section) => { (section.services || []).forEach((service) => { if (fetchedServices.includes(normalize(service.name))) { - const path = `/${slugify(category.name)}/${slugify(section.name)}/${slugify(service.name)}` + const path = `/${slugify(category.name)}/${slugify(section.name)}/${slugify(service.name)}`; tmpResults.push({ ...service, path }); return; } @@ -45,35 +47,36 @@ {#if $results.length > 1} <h3>Top Results</h3> {/if} - <section> - {#each $results as service (service)} - <a class="service-result" href={service.path}> - <div class="service-head"> - <img - width="40" - height="40" - loading="lazy" - decoding="async" - class="service-icon" - alt={`${service.name} Icon`} - data-service-url={formatLink(service.url)} - src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} - /> - <div> - <h4> - {service.name} - {#if service.followWith} +<section> + {#each $results as service (service)} + <a class="service-result" href={service.path}> + <div class="service-head"> + <img + width="40" + height="40" + loading="lazy" + decoding="async" + class="service-icon" + alt={`${service.name} Icon`} + data-service-url={formatLink(service.url)} + src={service.icon || + `https://icon.horse/icon/${formatLink(service.url)}`} + /> + <div> + <h4> + {service.name} + {#if service.followWith} <p class="follow-with">({service.followWith})</p> - {/if} - </h4> - <a class="service-link" href={service.url}>{formatLink(service.url)}</a> - </div> + {/if} + </h4> + <a class="service-link" href={service.url} + >{formatLink(service.url)}</a + > </div> - </a> - {/each} - </section> - - + </div> + </a> + {/each} +</section> <style lang="scss"> h3 { diff --git a/web/src/components/things/service-card.scss b/web/src/components/things/service-card.scss index ca97b18..1d0d9cf 100644 --- a/web/src/components/things/service-card.scss +++ b/web/src/components/things/service-card.scss @@ -29,21 +29,23 @@ h4 { text-decoration: none; position: relative; - &:after { + &:after { background: none repeat scroll 0 0 transparent; bottom: 0; - content: ""; + content: ''; display: block; height: 3px; left: 50%; position: absolute; background: var(--accent-3); - transition: width 0.2s ease 0s, left 0.2s ease 0s; + transition: + width 0.2s ease 0s, + left 0.2s ease 0s; width: 0; } - &:hover:after { - width: 100%; - left: 0; + &:hover:after { + width: 100%; + left: 0; } } } @@ -66,7 +68,7 @@ :global(p) { display: -webkit-box; -webkit-line-clamp: 3; - -webkit-box-orient: vertical; + -webkit-box-orient: vertical; overflow: hidden; margin: 0.5rem 0; width: calc(100% - 2rem); diff --git a/web/src/layouts/Layout.astro b/web/src/layouts/Layout.astro index c390344..12b4472 100644 --- a/web/src/layouts/Layout.astro +++ b/web/src/layouts/Layout.astro @@ -1,5 +1,5 @@ --- -import { ViewTransitions } from 'astro:transitions' +import { ViewTransitions } from 'astro:transitions'; import NavBar from '@components/scafold/NavBar.astro'; import Footer from '@components/scafold/Footer.astro'; import config from '../site-config'; @@ -7,14 +7,14 @@ import config from '../site-config'; interface Props { title?: string; // Page title description?: string; // Overide description tag - keywords?: string; // Overide keywords tag + keywords?: string; // Overide keywords tag hideNav?: boolean; // Don't show the navbar (just homepage) author?: string; // Author of the content - customSchemaJson?: any; // Custom schema item + customSchemaJson?: Record<string, unknown>; // Custom schema item breadcrumbs?: Array<{ name: string; item: string; - }> + }>; } const { @@ -30,92 +30,120 @@ const { const makeBreadcrumbs = () => { if (!breadcrumbs) return null; return { - "@context": "https://schema.org", - "@type": "BreadcrumbList", - "itemListElement": breadcrumbs.map((breadcrumb, index) => ({ - "@type": "ListItem", - "position": index + 1, - "name": breadcrumb.name, - "item": `https://awesome-privacy.xyz/${breadcrumb.item}` - })) - } -} + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement: breadcrumbs.map((breadcrumb, index) => ({ + '@type': 'ListItem', + position: index + 1, + name: breadcrumb.name, + item: `https://awesome-privacy.xyz/${breadcrumb.item}`, + })), + }; +}; const makeSearchLd = () => { return { - "@context": "https://schema.org", - "@type": "WebSite", - "url": "https://awesome-privacy.xyz/", - "potentialAction": [{ - "@type": "SearchAction", - "target": { - "@type": "EntryPoint", - "urlTemplate": "https://awesome-privacy.xyz/search?q={search_term_string}" + '@context': 'https://schema.org', + '@type': 'WebSite', + url: 'https://awesome-privacy.xyz/', + potentialAction: [ + { + '@type': 'SearchAction', + target: { + '@type': 'EntryPoint', + urlTemplate: + 'https://awesome-privacy.xyz/search?q={search_term_string}', + }, + 'query-input': 'required name=search_term_string', }, - "query-input": "required name=search_term_string" - }] - } + ], + }; }; - --- <!doctype html> <html lang="en" data-theme="dark"> <head> - <ViewTransitions /> - + <!-- Core info --> <title>{title} - - - + + + - + - + - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + src="https://no-track.as93.net/js/script.js"> - {breadcrumbs && ( - + + diff --git a/web/src/pages/api/line-numbers.json.ts b/web/src/pages/api/line-numbers.json.ts index 28ac2ef..f64d189 100644 --- a/web/src/pages/api/line-numbers.json.ts +++ b/web/src/pages/api/line-numbers.json.ts @@ -14,35 +14,47 @@ interface LineNumberData { [service: string]: { lineNumbers: LineNumberRange | null; yaml: string; - } + }; }; }; } -const awesomePrivacyYamlPath = 'https://raw.githubusercontent.com/Lissy93/awesome-privacy/main/awesome-privacy.yml'; +const awesomePrivacyYamlPath = + 'https://raw.githubusercontent.com/Lissy93/awesome-privacy/main/awesome-privacy.yml'; /** * Given a service object and an array of string lines from the raw YAML * Find the starting and ending line number for that service */ -const calculateServiceRange = (service: Service, category: Category, yamlLines: string[]): LineNumberRange | null => { +const calculateServiceRange = ( + service: Service, + category: Category, + yamlLines: string[], +): LineNumberRange | null => { const lookFor = `- name: ${service.name}`; - const categoryStart = yamlLines.findIndex(line => line.includes(category.name)); - const start = yamlLines.slice(categoryStart).findIndex(line => line.includes(lookFor)) + categoryStart + 1; + const categoryStart = yamlLines.findIndex((line) => + line.includes(category.name), + ); + const start = + yamlLines.slice(categoryStart).findIndex((line) => line.includes(lookFor)) + + categoryStart + + 1; if (start === -1) return null; const detectEnd = (line: string) => { - return line.trim().length === 0 - || line.startsWith(' - ') - || line.includes('- name:') - || line.includes('notableMentions:') - || line.includes('furtherInfo:') - || line.includes('wordOfWarning:') - } + return ( + line.trim().length === 0 || + line.startsWith(' - ') || + line.includes('- name:') || + line.includes('notableMentions:') || + line.includes('furtherInfo:') || + line.includes('wordOfWarning:') + ); + }; const remainingLines = yamlLines.slice(start); const end = start + remainingLines.findIndex(detectEnd); - + return { start, end }; -} +}; /** * Given a service object, convert it into a correctly formatted YAML string @@ -55,7 +67,10 @@ const convertJsonIntoYaml = (service: Service): string => { * Given the object representation of the YAML and the array of lines from the raw YAML * Organize the data into a format that can be returned as JSON */ -const makeResults = (yamlObject: AwesomePrivacy, yamlLines: string[]): LineNumberData => { +const makeResults = ( + yamlObject: AwesomePrivacy, + yamlLines: string[], +): LineNumberData => { const organizedData: LineNumberData = {}; (yamlObject.categories || []).forEach((category) => { organizedData[category.name] = {}; @@ -70,16 +85,18 @@ const makeResults = (yamlObject: AwesomePrivacy, yamlLines: string[]): LineNumbe }); }); return organizedData; -} +}; export const GET: APIRoute = async () => { - // Fetch the raw YAML from the awesome-privacy repository const yamlContent = await fetch(awesomePrivacyYamlPath) - .then(response => response.text()) - .catch(error => { - return JSON.stringify({ error: "Failed to fetch YAML file", details: error }); - }); + .then((response) => response.text()) + .catch((error) => { + return JSON.stringify({ + error: 'Failed to fetch YAML file', + details: error, + }); + }); // Array of lines from the raw YAML const yamlLines: string[] = yamlContent.split('\n'); @@ -90,7 +107,7 @@ export const GET: APIRoute = async () => { // Make results const results = makeResults(yamlObject, yamlLines); - return new Response( - JSON.stringify(results), { headers: { 'content-type': 'application/json' } } - ) -} + return new Response(JSON.stringify(results), { + headers: { 'content-type': 'application/json' }, + }); +}; diff --git a/web/src/pages/browse.astro b/web/src/pages/browse.astro index 6a0d031..1549b15 100644 --- a/web/src/pages/browse.astro +++ b/web/src/pages/browse.astro @@ -1,5 +1,4 @@ --- - import Layout from '@layouts/Layout.astro'; import SectionList from '@components/things/SectionList.astro'; @@ -7,210 +6,221 @@ import { fetchData } from '@utils/fetch-data'; import type { Category } from '../types/Service'; const categories: Category[] = (await fetchData())?.categories; - --- +
+

Browse

+ + +

+ Press enter for deep search +

+
+
+ -
-

Browse

- - -

Press enter for deep search

-
-
- +
    + { + categories.map((category) => ( +
  • + +
  • + )) + } +
-
    - {categories.map((category) => ( -
  • - -
  • - ))} -
- -
-

Nothing found 😢

-

Try a deep search instead

-
+
+

Nothing found 😢

+

Try a deep search instead

+
- diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro index bd29faa..ef6678f 100644 --- a/web/src/pages/index.astro +++ b/web/src/pages/index.astro @@ -1,5 +1,4 @@ --- - import Layout from '@layouts/Layout.astro'; import Hero from '@components/Hero.astro'; import Search from '@components/things/Search.svelte'; @@ -10,14 +9,14 @@ import { fetchData } from '@utils/fetch-data'; import Button from '@components/form/Button.astro'; import type { Category } from 'src/types/Service'; -const categories = (await fetchData())?.categories || [] as Category[]; - -const description = 'Privacy is a fundamental human right; ' - + 'without it, we\'re just open books in a world where everyone\'s ' - + 'watching. Let\'s take control back.\n' - + 'Migrating open-source applications which do not collect, sell or log your data is a great first step.' - + 'Awesome Privacy is a directory of alternative privacy-respecting software and services.'; +const categories = (await fetchData())?.categories || ([] as Category[]); +const description = + 'Privacy is a fundamental human right; ' + + "without it, we're just open books in a world where everyone's " + + "watching. Let's take control back.\n" + + 'Migrating open-source applications which do not collect, sell or log your data is a great first step.' + + 'Awesome Privacy is a directory of alternative privacy-respecting software and services.'; --- @@ -29,11 +28,13 @@ const description = 'Privacy is a fundamental human right; '

Browse

    - {categories.map((category) => ( -
  • - -
  • - ))} + { + categories.map((category) => ( +
  • + +
  • + )) + }
Or, just @@ -48,28 +49,33 @@ const description = 'Privacy is a fundamental human right; '

- Awesome Privacy is a collection of privacy-respecting services and tools. - The aim is to help you escape big tech, and choose software that respects your privacy. + Awesome Privacy is a collection of privacy-respecting services and + tools. The aim is to help you escape big tech, and choose software that + respects your privacy.

- Why? Because privacy is a fundamental human right; without it, we're just open books - in a world where everyone's watching. Let's take control back. + Why? Because privacy is a fundamental human right; without it, we're + just open books in a world where everyone's watching. Let's take control + back.

- Noticed something that should be added / removed / amended? - We're a community-driven resource, so welcome contributions of any nature. - All content and code is open source. + Noticed something that should be added / removed / amended? We're a + community-driven resource, so welcome contributions of any nature. All + content and code is open source.

- If you've found Awesome Privacy useful, help us out by sharing it with others, - contributing, or consider sponsoring me on GitHub. + If you've found Awesome Privacy useful, help us out by sharing it with + others, contributing, or consider sponsoring me on GitHub.

Want to learn more?
- @@ -81,8 +87,8 @@ const description = 'Privacy is a fundamental human right; ' max-width: calc(100% - 5rem); font-size: 20px; line-height: 1.6; - @media(max-width: 768px) { - padding: 0; + @media (max-width: 768px) { + padding: 0; } .view-all { text-align: center; @@ -97,41 +103,43 @@ const description = 'Privacy is a fundamental human right; ' h2 { font-size: 3rem; color: var(--accent-3); - font-family: "Lekton", sans-serif; + font-family: 'Lekton', sans-serif; text-align: center; margin: 3rem 0 1rem 0; a { text-decoration: none; color: var(--accent-3); - font-family: "Lekton", sans-serif; + font-family: 'Lekton', sans-serif; position: relative; - &:after { + &:after { background: none repeat scroll 0 0 transparent; bottom: 0; - content: ""; + content: ''; display: block; height: 3px; left: 50%; position: absolute; background: var(--accent); - transition: width 0.3s ease 0s, left 0.3s ease 0s; + transition: + width 0.3s ease 0s, + left 0.3s ease 0s; width: 0; } - &:hover:after { - width: 100%; - left: 0; + &:hover:after { + width: 100%; + left: 0; } } } .about-summary { background: var(--accent-fg); - border: 2px solid var(--box-outline); - border-radius: var(--curve-sm); - box-shadow: 4px 4px 0 var(--box-outline); - padding: 1rem; - width: 85%; - margin: 0 auto; + border: 2px solid var(--box-outline); + border-radius: var(--curve-sm); + box-shadow: 4px 4px 0 var(--box-outline); + padding: 1rem; + width: 85%; + margin: 0 auto; } .categories { @@ -148,7 +156,7 @@ const description = 'Privacy is a fundamental human right; ' display: inline-flex; flex-direction: column; margin: 1rem; - @media(max-width: 768px) { + @media (max-width: 768px) { margin: 1rem 0; width: 90%; } @@ -157,7 +165,7 @@ const description = 'Privacy is a fundamental human right; ' color: var(--foreground); } h3 { - font-family: "Lekton", sans-serif; + font-family: 'Lekton', sans-serif; font-weight: bold; margin: 0; font-size: 1.8rem; @@ -176,6 +184,4 @@ const description = 'Privacy is a fundamental human right; ' } } } - - diff --git a/web/src/pages/inventory/[...inventoryId].astro b/web/src/pages/inventory/[...inventoryId].astro index 01d261c..657569d 100644 --- a/web/src/pages/inventory/[...inventoryId].astro +++ b/web/src/pages/inventory/[...inventoryId].astro @@ -1,15 +1,12 @@ --- - import Layout from '@layouts/Layout.astro'; import SavedServices from '@components/things/SavedServices.svelte'; -import GetSharableLink from '@components/things/GetSharableLink.svelte'; import { fetchData } from '@utils/fetch-data'; import Button from '@components/form/Button.astro'; -import EditableTitle from '@components/form/EditableTitle.svelte'; import type { Category } from '../../types/Service'; -const categories = (await fetchData())?.categories || [] as Category[]; +const categories = (await fetchData())?.categories || ([] as Category[]); export const prerender = false; @@ -17,85 +14,92 @@ const inventoryId = Astro.params.inventoryId || 'Inventory'; let cheekyLilError = ''; function makeTitle(input: string): string { - return (input.includes('_') ? input : `mystry_${input}`) - .split('_')[1] - .replace(/-/g, ' ') - .replace(/\b\w/g, (match) => match.toUpperCase()); + return (input.includes('_') ? input : `mystry_${input}`) + .split('_')[1] + .replace(/-/g, ' ') + .replace(/\b\w/g, (match) => match.toUpperCase()); } -const serviceList = await fetch(`https://awesome-privacy-share-api.as93.net/${inventoryId}`).then((res) => res.json()) || []; +const serviceList = + (await fetch( + `https://awesome-privacy-share-api.as93.net/${inventoryId}`, + ).then((res) => res.json())) || []; if (serviceList.error) { - cheekyLilError = serviceList.error; + cheekyLilError = serviceList.error; } - --- -
-

{makeTitle(inventoryId)}

- {cheekyLilError && ( -
-

An error occoured

-

{cheekyLilError}

-

- We're sorry about that.
- Try going back home, - or raising a ticket on - GitHub. -

-
- )} - -
-

Not found what you're looking for?

- -
-
+
+

{makeTitle(inventoryId)}

+ { + cheekyLilError && ( +
+

An error occoured

+

{cheekyLilError}

+

+ We're sorry about that. +
+ Try going back home, or{' '} + + raising a ticket + {' '} + on GitHub. +

+
+ ) + } + +
+

Not found what you're looking for?

+ +
+
diff --git a/web/src/pages/inventory/index.astro b/web/src/pages/inventory/index.astro index 2bb8f9a..196d870 100644 --- a/web/src/pages/inventory/index.astro +++ b/web/src/pages/inventory/index.astro @@ -1,5 +1,4 @@ --- - import Layout from '@layouts/Layout.astro'; import SavedServices from '@components/things/SavedServices.svelte'; import GetSharableLink from '@components/things/GetSharableLink.svelte'; @@ -9,53 +8,52 @@ import Button from '@components/form/Button.astro'; import EditableTitle from '@components/form/EditableTitle.svelte'; import type { Category } from '../../types/Service'; -const categories = (await fetchData())?.categories || [] as Category[]; - +const categories = (await fetchData())?.categories || ([] as Category[]); --- -
-
- - - -
- -
-

Not found what you're looking for?

- -
-
+
+
+ + + +
+ +
+

Not found what you're looking for?

+ +
+
diff --git a/web/src/pages/search/[...searchTerm].astro b/web/src/pages/search/[...searchTerm].astro index 193e40f..23c84d0 100644 --- a/web/src/pages/search/[...searchTerm].astro +++ b/web/src/pages/search/[...searchTerm].astro @@ -1,18 +1,17 @@ --- - import Fuse from 'fuse.js'; +import Fuse from 'fuse.js'; import Layout from '@layouts/Layout.astro'; import { fetchData, slugify } from '@utils/fetch-data'; import { prepareSearchItems, searchOptions } from '@utils/do-searchy-searchy'; +import type { SearchItem } from '@utils/do-searchy-searchy'; import Search from '@components/things/Search.svelte'; import SmartSuggestions from '@components/things/SmartSuggestions.svelte'; import FontAwesome from '@components/form/FontAwesome.svelte'; -import type { Service } from '../../types/Service'; - export const prerender = false; -let fuse: Fuse; +let fuse: Fuse; const categories = (await fetchData())?.categories; @@ -22,171 +21,187 @@ fuse = new Fuse(items, searchOptions); const searchTerm = Astro.params.searchTerm; -const searchResults = fuse.search(searchTerm || '').map(result => result.item); +const searchResults = fuse + .search(searchTerm || '') + .map((result) => result.item); -const services = searchResults.filter(result => result.type === 'Service'); +const services = searchResults.filter((result) => result.type === 'Service'); + +interface GroupedSection { + sectionName: string; + items: SearchItem[]; +} + +interface GroupedCategory { + categoryName: string; + sections: Record; +} const putResultsIntoGroups = () => { - const grouped = services.reduce((acc, item) => { - const { category: categoryName, sectionName, ...service } = item; + const grouped: Record = {}; - if (!acc[categoryName]) { - acc[categoryName] = { categoryName, sections: {} }; - } + for (const item of services) { + const categoryName = item.category; + const sectionName = item.sectionName || ''; - if (!acc[categoryName].sections[sectionName]) { - acc[categoryName].sections[sectionName] = { sectionName, items: [] }; - } + if (!grouped[categoryName]) { + grouped[categoryName] = { categoryName, sections: {} }; + } - acc[categoryName].sections[sectionName].items.push(service); + if (!grouped[categoryName].sections[sectionName]) { + grouped[categoryName].sections[sectionName] = { sectionName, items: [] }; + } - return acc; - }, {}); + grouped[categoryName].sections[sectionName].items.push(item); + } - // Convert the grouped object into the desired array structure. - // And fuck it, let's use `any` - return Object.values(grouped).map((category: any) => ({ - categoryName: category.categoryName, - sections: Object.values(category.sections) - })); + return Object.values(grouped).map((category) => ({ + categoryName: category.categoryName, + sections: Object.values(category.sections), + })); }; const beer = putResultsIntoGroups(); - --- -
-

Search

- -
- -
-

Deep Search

-

Showing {services.length} results for "{searchTerm}" sorted by relevence

-
-
- { - beer.map((category: any) => ( -
- -

{category.categoryName}

-
- -
    - {category.sections.map((section: any) => ( -
  • -

    {section.sectionName}

    -
      - {section.items.map((item: Service) => ( -
    • - {item.name} -
    • - ))} -
    -
  • - ))} -
-
- )) - } -
+
+

Search

+ +
+ +
+

Deep Search

+

+ Showing {services.length} results for "{searchTerm}" sorted by relevence +

+
+
+ { + beer.map((category) => ( +
+ +

{category.categoryName}

+
+ + + +
    + {category.sections.map((section) => ( +
  • +

    {section.sectionName}

    +
      + {section.items.map((item) => ( +
    • + {item.name} +
    • + ))} +
    +
  • + ))} +
+
+ )) + } +
- diff --git a/web/src/pages/search/index.astro b/web/src/pages/search/index.astro index 924b188..da86b36 100644 --- a/web/src/pages/search/index.astro +++ b/web/src/pages/search/index.astro @@ -1,57 +1,55 @@ --- - import Layout from '@layouts/Layout.astro'; import { fetchData } from '@utils/fetch-data'; import Search from '@components/things/Search.svelte'; const categories = (await fetchData())?.categories; - --- -
-

Search

- - -
+
+

Search

+ + +
- diff --git a/web/src/pages/sitemap.astro b/web/src/pages/sitemap.astro index 60c3d11..41024b0 100644 --- a/web/src/pages/sitemap.astro +++ b/web/src/pages/sitemap.astro @@ -1,234 +1,244 @@ --- - - import Layout from '@layouts/Layout.astro'; import type { AwesomePrivacy } from '../types/Service'; import { fetchData, slugify } from '@utils/fetch-data'; -const categories = (await fetchData() as AwesomePrivacy)?.categories || []; - +const categories = ((await fetchData()) as AwesomePrivacy)?.categories || []; --- -
-

Sitemap

-

- Below is a full listing of all pages on this site.
- As reflected in our sitemap.xml -

- - -

Press enter for deep search

-
- -
- +
+

Sitemap

+

+ Below is a full listing of all pages on this site.
+ As reflected in our sitemap.xml +

+ + +

+ Press enter for deep search +

+
+ +
diff --git a/web/src/pages/submit.astro b/web/src/pages/submit.astro index abae8a3..b6eff6f 100644 --- a/web/src/pages/submit.astro +++ b/web/src/pages/submit.astro @@ -2,142 +2,187 @@ import Layout from '@layouts/Layout.astro'; import AddNewService from '@components/things/AddNewService.svelte'; -import { fetchGitHubStats } from '@utils/fetch-repo-info' +import { fetchGitHubStats } from '@utils/fetch-repo-info'; import { formatDate } from '@utils/dates-n-stuff'; -const commits = (await fetchGitHubStats('lissy93/awesome-privacy') || {}).commits; - +const commits = ((await fetchGitHubStats('lissy93/awesome-privacy')) || {}) + .commits; --- -
-

About our Data

-

- All data on Awesome Privacy is community maintained via Git, - this keeps everything transparent, and means anyone can submit edits. - You can learn more about how our data is managed on our about page. -

- You can make ammendments/additions/removals simply by editing the - awesome-privacy.yml file. -
- Before you proceed, please first read our Contributing Docs -

- Awesome Privacy is a community-maintained resource, it's thanks to - contributors like you, that it's able to grow and stay up to date 💜 -

-
-
-

Submit an Addition

- -
+
+

About our Data

+

+ All data on Awesome Privacy is community maintained via Git, this keeps + everything transparent, and means anyone can submit edits. You can learn + more about how our data is managed on our about page. +

+ You can make ammendments/additions/removals simply by editing the + awesome-privacy.yml file. +
+ Before you proceed, please first read our Contributing Docs +

+ Awesome Privacy is a community-maintained resource, it's thanks to contributors + like you, that it's able to grow and stay up to date 💜 +

+
+
+

Submit an Addition

+ +
-
-

Submit a Removal Request

-

- You can submit a removal request by browsing to a given service's page, - and clicking the "Request Removal" button. - This will open a form where you can justify your reasoning, to get it - deleted from the awesome-privacy.yml file. -

-
+
+

Submit a Removal Request

+

+ You can submit a removal request by browsing to a given service's page, + and clicking the "Request Removal" button. This will open a form where you + can justify your reasoning, to get it deleted from the awesome-privacy.yml file. +

+
-
-

Edit a Listing

-

- Edits are welcome! All data is located in - awesome-privacy.yml. -
- To modify an entry, navigate to it's page, scroll to the bottom, and click "Edit". - This will take you to directly to the relevant lines in the file, where you can make your changes. -

-
+
+

Edit a Listing

+

+ Edits are welcome! All data is located in + awesome-privacy.yml. +
+ To modify an entry, navigate to it's page, scroll to the bottom, and click "Edit". + This will take you to directly to the relevant lines in the file, where you + can make your changes. +

+
-
-

Checklist

-
    -
  • You must read the Contributing guidelines before proceeding
  • -
  • All listing must meed our Criteria to be considered privacy-respecting
  • -
  • Double check that your changes haven't already been proposed
  • -
  • If you're associated with a service included, you must declare your affiliation
  • -
  • Before commiting changes, ensure the YAML syntax is valid and it complies with our schema
  • -
  • Please complete the issue or PR description template in full, do not remove any fields
  • -
  • All submissions must be made via our GitHub, do not email/PM maintainers
  • -
-
+
+

Checklist

+
    +
  • + You must read the Contributing guidelines before proceeding +
  • +
  • + All listing must meed our Criteria to be considered + privacy-respecting +
  • +
  • Double check that your changes haven't already been proposed
  • +
  • + If you're associated with a service included, you must declare your + affiliation +
  • +
  • + Before commiting changes, ensure the YAML syntax is valid and it + complies with our schema +
  • +
  • + Please complete the issue or PR description template in full, do not + remove any fields +
  • +
  • + All submissions must be made via our GitHub, do not email/PM maintainers +
  • +
+
- {commits && commits.length > 0 && ( -
-

Recent Changes

-

- You can view a full ledger of all updates made - at github.com/lissy93/awesome-privacy -

- -
- )} - + { + commits && commits.length > 0 && ( +
+

Recent Changes

+

+ You can view a full ledger of all updates made at{' '} + + github.com/lissy93/awesome-privacy + +

+ +
+ ) + }
diff --git a/web/src/site-config.ts b/web/src/site-config.ts index 66fe4f0..e21a177 100644 --- a/web/src/site-config.ts +++ b/web/src/site-config.ts @@ -14,37 +14,59 @@ export const authorProjects = [ { title: 'Web-Check', description: 'OSINT tool for analysing any website', - icon: 'https://web-check.as93.net/web-check.png', + icon: 'https://cdn.as93.net/logo/web-check/w256', link: 'https://github.com/lissy93/web-check', }, { title: 'Dashy', description: 'Dashboard app, for organising your self-hosted services', - icon: 'https://dashy.to/img/dashy.png', + icon: 'https://cdn.as93.net/logo/dashy/w256', link: 'https://github.com/lissy93/dashy', }, + { + title: 'Domain Locker', + description: + 'All-in-one tool, for keeping track of your domain name portfolio', + icon: 'https://cdn.as93.net/logo/domain-locker/w256', + link: 'https://github.com/lissy93/domain-locker', + }, + { + title: 'Pixelflare', + description: 'Ultra high-performance privacy-respecting image CDN', + icon: 'https://cdn.as93.net/logo/pixelflare/w256', + link: 'https://github.com/Lissy93/pixelflare', + }, + { + title: 'Networking Toolbox', + description: + '100+ offline-first networking lookups, calculators and conversions', + icon: 'https://cdn.as93.net/logo/networking-toolbox/w256', + link: 'https://github.com/Lissy93/networking-toolbox', + }, { title: 'Portainer-Templates', description: 'Compiled repository of 1-click Docker apps for self-hosting', - icon: 'https://portainer-templates.as93.net/favicon.png', + icon: 'https://cdn.as93.net/logo/portainer-templates/w256', link: 'https://github.com/lissy93/portainer-templates', }, { title: 'AdGuardian', - description: 'CLI tool for monitoring your networks traffic and AdGuard DNS stats', - icon: 'https://adguardian.as93.net/favicon.png', + description: + 'CLI tool for monitoring your networks traffic and AdGuard DNS stats', + icon: 'https://cdn.as93.net/logo/adguardian/w256', link: 'https://github.com/lissy93/adguardian-term', }, { title: 'Bug-Bounties', - description: 'Database of websites which accept responsible vulnerability disclosure', - icon: 'https://bug-bounties.as93.net/favicon.png', + description: + 'Database of websites which accept responsible vulnerability disclosure', + icon: 'https://cdn.as93.net/logo/bug-bounties', link: 'https://github.com/lissy93/bug-bounties', }, { title: 'Git-In', description: 'Tools and resources to help beginners get into open source', - icon: 'https://www.git-in.to/favicon.png', + icon: 'https://cdn.as93.net/logo/git-in/w256', link: 'https://github.com/lissy93/git-in', }, ]; @@ -82,9 +104,8 @@ export const authorSocials = [ }, ]; - export const aboutOurData = ` -All data is stored in +All data is stored in [\`awesome-privacy.yml\`](https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml). This file is then pulled into the website at build-time, and also used to generate @@ -132,7 +153,7 @@ Use our public instance, at: \`https://api.awesome-privacy.xyz\` or [self-host y `; export const projectRequirements = ` -For software to be included in this list, it must meet the following requirements: +For software to be included in this list, it must meet the following requirements: - **Privacy Respecting** - The project must respect users privacy, not collect more data than necessary, and store info securely @@ -148,7 +169,7 @@ For software to be included in this list, it must meet the following requirement - Ideally it should be possible for the user to build and run/deploy the software themselves from source - **Actively Maintained** - The developers should address dependency updates and security patches in a timely manner - - Ideally the source should have been updated within the last 12 months + - Ideally the source should have been updated within the last 12 months - **Transparent** - It should be clear who is behind the project, what their motives are, and what (if any) the funding model is - For hosted solutions, the privacy policy should clearly state what data is collected, how it's used and how long it's stored @@ -167,18 +188,20 @@ by the community, and the drawbacks / anti-features must be clearly listed along Usually these entries go within the "Notable Mentions" section instead._ `; -export const appDescription = 'Privacy is a fundamental human right; ' - + 'without it, we\'re just open books in a world where everyone\'s ' - + 'watching. Let\'s take control back.\n' - + 'Migrating open-source applications which do not collect, sell or log your data is a great first step.' - + 'Awesome Privacy is a directory of alternative privacy-respecting software and services.'; - +export const appDescription = + 'Privacy is a fundamental human right; ' + + "without it, we're just open books in a world where everyone's " + + "watching. Let's take control back.\n" + + 'Migrating open-source applications which do not collect, sell or log your data is a great first step.' + + 'Awesome Privacy is a directory of alternative privacy-respecting software and services.'; export default { title: 'Awesome Privacy | The Ultimate List of Private Apps', - description: 'Your guide to finding privacy-respecting alternatives to popular software and services.', - keywords: 'security, privacy, awesome privacy, data collection, free software, open source, privacy tools, privacy respecting software', - author: 'Alicia Sykes', + description: + 'Your guide to finding privacy-respecting alternatives to popular software and services.', + keywords: + 'security, privacy, awesome privacy, data collection, free software, open source, privacy tools, privacy respecting software', + author: 'Alicia Sykes', authorProjects, authorSocials, aboutOurData, diff --git a/web/src/styles/typography.css b/web/src/styles/typography.css index e6d2b80..43eb4ef 100644 --- a/web/src/styles/typography.css +++ b/web/src/styles/typography.css @@ -3,91 +3,123 @@ /* Rubik Font Faces */ @font-face { - font-family: 'Rubik'; - font-style: normal; - font-weight: 400; - src: local('Rubik'), url('/fonts/Rubik/Rubik-Regular.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: normal; + font-weight: 400; + src: + local('Rubik'), + url('/fonts/Rubik/Rubik-Regular.ttf') format('truetype'); } @font-face { - font-family: 'Rubik'; - font-style: italic; - font-weight: 400; - src: local('Rubik Italic'), url('/fonts/Rubik/Rubik-Italic.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: italic; + font-weight: 400; + src: + local('Rubik Italic'), + url('/fonts/Rubik/Rubik-Italic.ttf') format('truetype'); } @font-face { - font-family: 'Rubik'; - font-style: normal; - font-weight: 500; - src: local('Rubik Medium'), url('/fonts/Rubik/Rubik-Medium.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: normal; + font-weight: 500; + src: + local('Rubik Medium'), + url('/fonts/Rubik/Rubik-Medium.ttf') format('truetype'); } @font-face { - font-family: 'Rubik'; - font-style: italic; - font-weight: 500; - src: local('Rubik Medium Italic'), url('/fonts/Rubik/Rubik-MediumItalic.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: italic; + font-weight: 500; + src: + local('Rubik Medium Italic'), + url('/fonts/Rubik/Rubik-MediumItalic.ttf') format('truetype'); } @font-face { - font-family: 'Rubik'; - font-style: normal; - font-weight: 600; - src: local('Rubik SemiBold'), url('/fonts/Rubik/Rubik-SemiBold.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: normal; + font-weight: 600; + src: + local('Rubik SemiBold'), + url('/fonts/Rubik/Rubik-SemiBold.ttf') format('truetype'); } @font-face { - font-family: 'Rubik'; - font-style: italic; - font-weight: 600; - src: local('Rubik SemiBold Italic'), url('/fonts/Rubik/Rubik-SemiBoldItalic.ttf') format('truetype'); + font-family: 'Rubik'; + font-style: italic; + font-weight: 600; + src: + local('Rubik SemiBold Italic'), + url('/fonts/Rubik/Rubik-SemiBoldItalic.ttf') format('truetype'); } /* Libre Franklin Font Faces */ @font-face { - font-family: 'Libre Franklin'; - font-style: normal; - font-weight: 500; - src: local('Libre Franklin Bold'), url('/fonts/Libre_Franklin/LibreFranklin-Bold.ttf') format('truetype'); + font-family: 'Libre Franklin'; + font-style: normal; + font-weight: 500; + src: + local('Libre Franklin Bold'), + url('/fonts/Libre_Franklin/LibreFranklin-Bold.ttf') format('truetype'); } /* Lekton Font Faces */ @font-face { - font-family: 'Lekton'; - font-style: normal; - font-weight: 700; - src: local('Lekton Bold'), url('/fonts/Lekton/Lekton-Bold.ttf') format('truetype'); + font-family: 'Lekton'; + font-style: normal; + font-weight: 700; + src: + local('Lekton Bold'), + url('/fonts/Lekton/Lekton-Bold.ttf') format('truetype'); } html { - font-family: system-ui, sans-serif; + font-family: system-ui, sans-serif; } code { - font-family: - Menlo, - Monaco, - Lucida Console, - Liberation Mono, - DejaVu Sans Mono, - Bitstream Vera Sans Mono, - Courier New, - monospace; + font-family: + Menlo, + Monaco, + Lucida Console, + Liberation Mono, + DejaVu Sans Mono, + Bitstream Vera Sans Mono, + Courier New, + monospace; } -.heading, h1 { - font-family: "Libre Franklin", sans-serif; - font-optical-sizing: auto; - font-weight: 800; - font-style: normal; +.heading, +h1 { + font-family: 'Libre Franklin', sans-serif; + font-optical-sizing: auto; + font-weight: 800; + font-style: normal; } -.subtitle, h2, h3, h4, h5, h6 { - font-family: "Lekton", sans-serif; - font-weight: 700; - font-style: normal; +.subtitle, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Lekton', sans-serif; + font-weight: 700; + font-style: normal; } -html, body, p, a, ul, ol, li, blockquote, pre, strong, i { - font-family: "Rubik", sans-serif; +html, +body, +p, +a, +ul, +ol, +li, +blockquote, +pre, +strong, +i { + font-family: 'Rubik', sans-serif; } a { - color: var(--accent); + color: var(--accent); } diff --git a/web/src/styles/values.css b/web/src/styles/values.css index 7dca931..eaf4c67 100644 --- a/web/src/styles/values.css +++ b/web/src/styles/values.css @@ -1,53 +1,51 @@ +html { + --accent: #f45397; + --accent-fg: #1e1f21; - html { - --accent: #f45397; - --accent-fg: #1e1f21; + --accent-2: #ffdf60; + --accent-3: #5f53f4; + --accent-4: #28dffd; - --accent-2: #ffdf60; - --accent-3: #5f53f4; - --accent-4: #28dffd; + --foreground: #fff; - --foreground: #fff; + --curve-sm: 4px; + --curve-md: 6px; + --curve-lg: 12px; - --curve-sm: 4px; - --curve-md: 6px; - --curve-lg: 12px; + --danger: #ff0048; + --success: #00ff64; - --danger: #ff0048; - --success: #00ff64; + --transparent-accent: #5f53f482; - --transparent-accent: #5f53f482; + --background: #151517; + --bg-gradient-comp-1: #151517; + --bg-gradient-comp-2: #151517; + --background-form: #19191c; - --background: #151517; - --bg-gradient-comp-1: #151517; - --bg-gradient-comp-2: #151517; - --background-form: #19191c; + --box-outline: #000; - --box-outline: #000; + &[data-theme='light'] { + --accent: #f45397; + --accent-fg: #fff; - &[data-theme='light'] { - --accent: #f45397; - --accent-fg: #fff; - - --accent-2: #ffdf60; - --accent-3: #5f53f4; - --accent-4: #28dffd; - - --foreground: #13151a; - - --curve-sm: 4px; - --curve-md: 6px; - --curve-lg: 12px; - - --danger: #ff0048; - --success: #00ff64; - - --transparent-accent: #5f53f482; - - --background: #feecff; - --bg-gradient-comp-1: #feecff; - --bg-gradient-comp-2: #e1e4fb; - --background-form: #fff; - } + --accent-2: #ffdf60; + --accent-3: #5f53f4; + --accent-4: #28dffd; + + --foreground: #13151a; + + --curve-sm: 4px; + --curve-md: 6px; + --curve-lg: 12px; + + --danger: #ff0048; + --success: #00ff64; + + --transparent-accent: #5f53f482; + + --background: #feecff; + --bg-gradient-comp-1: #feecff; + --bg-gradient-comp-2: #e1e4fb; + --background-form: #fff; + } } - diff --git a/web/src/types/Service.ts b/web/src/types/Service.ts index f509e1e..4a3d00a 100644 --- a/web/src/types/Service.ts +++ b/web/src/types/Service.ts @@ -1,5 +1,3 @@ - - export interface ShortService { name: string; description: string; @@ -42,7 +40,6 @@ export interface Category { sections: Section[]; } - export interface AwesomePrivacy { categories: Array<{ name: string; diff --git a/web/src/utils/config.ts b/web/src/utils/config.ts index f2baad3..3d57197 100644 --- a/web/src/utils/config.ts +++ b/web/src/utils/config.ts @@ -1,11 +1,13 @@ - function cleanUrl(inputString: string) { return inputString.replace(/['";]+/g, '').trim(); } +export const site = cleanUrl( + import.meta.env.SITE_URL || 'https://awesome-privacy.xyz', +); -export const site = cleanUrl(import.meta.env.SITE_URL || 'https://awesome-privacy.xyz'); +export const title = + 'Awesome Privacy | Compare privacy-respecting alternatives to popular software & services'; -export const title = 'Awesome Privacy | Compare privacy-respecting alternatives to popular software & services'; - -export const description = 'Your guide to escaping big tech, protecting your privacy, and reclaiming your digital life.'; +export const description = + 'Your guide to escaping big tech, protecting your privacy, and reclaiming your digital life.'; diff --git a/web/src/utils/data-src-delete-n-edit.ts b/web/src/utils/data-src-delete-n-edit.ts index 00b31f9..e289329 100644 --- a/web/src/utils/data-src-delete-n-edit.ts +++ b/web/src/utils/data-src-delete-n-edit.ts @@ -1,60 +1,82 @@ import { slugify } from '@utils/fetch-data'; -export const makeRemovalRequest = (categoryName: string, sectionName: string, serviceName: string, yaml?: string) => { +export const makeRemovalRequest = ( + categoryName: string, + sectionName: string, + serviceName: string, + yaml?: string, +) => { const title = `[REMOVAL] ${serviceName}`; - const under = `**${serviceName}** (source: [${categoryName} ➜ ${sectionName} ➜ ${serviceName}` - + `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`; - const removalData = `&title=${encodeURIComponent(title)}&removal-data=` - + `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`; - const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new' - const baseOptions = '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+' - + 'Review&projects=&template=removal.yml' + const under = + `**${serviceName}** (source: [${categoryName} ➜ ${sectionName} ➜ ${serviceName}` + + `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`; + const removalData = + `&title=${encodeURIComponent(title)}&removal-data=` + + `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`; + const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new'; + const baseOptions = + '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+' + + 'Review&projects=&template=removal.yml'; return `${issueCreate}${baseOptions}${removalData}`; }; -export const makeEditRequest = (categoryName: string, sectionName: string, serviceName: string, yaml?: string) => { +export const makeEditRequest = ( + categoryName: string, + sectionName: string, + serviceName: string, + yaml?: string, +) => { const title = `[AMENDMENT] ${serviceName}`; - const under = `**${serviceName}** (source: [${categoryName} ➜ ${sectionName} ➜ ${serviceName}` - + `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`; - const removalData = `&title=${encodeURIComponent(title)}&amendment-data=` - + `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`; - const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new' - const baseOptions = '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+' - + 'Review&projects=&template=amendment.yml' + const under = + `**${serviceName}** (source: [${categoryName} ➜ ${sectionName} ➜ ${serviceName}` + + `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`; + const removalData = + `&title=${encodeURIComponent(title)}&amendment-data=` + + `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`; + const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new'; + const baseOptions = + '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+' + + 'Review&projects=&template=amendment.yml'; return `${issueCreate}${baseOptions}${removalData}`; }; -export const makeAdditionRequest = (formData: { - listingCategory: string; - serviceName: string; - serviceUrl: string; - serviceIcon: string; - serviceDescription: string; - serviceGithub: string; - serviceTosdrId: string; - serviceIosApp: string, - serviceAndroidApp: string, - serviceDiscordInvite: string, - serviceSubreddit: string, - serviceOpenSource: boolean; - serviceSecurityAudited: boolean; - serviceCrypto: boolean; - additionalInfo: string; -}, yamlText?: string) => { - - const userInfo = formData.additionalInfo.split('\n').map(line => `> ${line}`).join('\n'); - const additionalInfoText: string = `\n${userInfo}` - + `\n\n**YAML Content for Addition**\n\n\`\`\`yaml\n${yamlText || '# nothing yet'}\n\`\`\`\n` - + `\n\nThis ticket was submitted via ` - + `awesome-privacy.xyz/submit`; +export const makeAdditionRequest = ( + formData: { + listingCategory: string; + serviceName: string; + serviceUrl: string; + serviceIcon: string; + serviceDescription: string; + serviceGithub: string; + serviceTosdrId: string; + serviceIosApp: string; + serviceAndroidApp: string; + serviceDiscordInvite: string; + serviceSubreddit: string; + serviceOpenSource: boolean; + serviceSecurityAudited: boolean; + serviceCrypto: boolean; + additionalInfo: string; + }, + yamlText?: string, +) => { + const userInfo = formData.additionalInfo + .split('\n') + .map((line) => `> ${line}`) + .join('\n'); + const additionalInfoText: string = + `\n${userInfo}` + + `\n\n**YAML Content for Addition**\n\n\`\`\`yaml\n${yamlText || '# nothing yet'}\n\`\`\`\n` + + `\n\nThis ticket was submitted via ` + + `awesome-privacy.xyz/submit`; const issueTitle = `[ADDITION] ${formData.serviceName} (Complete)`; const queryParams = new URLSearchParams({ - 'assignees': 'lissy93,liss-bot', - 'labels': '', - 'projects': '', - 'template': 'complete-addition.yml', - 'title': issueTitle, + assignees: 'lissy93,liss-bot', + labels: '', + projects: '', + template: 'complete-addition.yml', + title: issueTitle, 'listing-category': formData.listingCategory, 'service-name': formData.serviceName, 'service-url': formData.serviceUrl, @@ -63,38 +85,59 @@ export const makeAdditionRequest = (formData: { 'service-github': formData.serviceGithub, 'service-tosdr-id': formData.serviceTosdrId, 'service-opensource': formData.serviceOpenSource ? 'true' : 'false', - 'service-security-audited': formData.serviceSecurityAudited ? 'true' : 'false', + 'service-security-audited': formData.serviceSecurityAudited + ? 'true' + : 'false', 'service-crypto': formData.serviceCrypto ? 'true' : 'false', 'additional-info': additionalInfoText, }); - const issueCreateUrl = 'https://github.com/Lissy93/awesome-privacy/issues/new'; + const issueCreateUrl = + 'https://github.com/Lissy93/awesome-privacy/issues/new'; return `${issueCreateUrl}?${queryParams.toString()}`; }; - -export const makeSourceYamlLink = async (categoryName: string, sectionName: string, serviceName: string) => { +export const makeSourceYamlLink = async ( + categoryName: string, + sectionName: string, + serviceName: string, +) => { const sourceData = await fetchSrcData(categoryName, sectionName, serviceName); const lineNumbers = sourceData.lineNumbers || null; - const numberRange = lineNumbers ? `L${lineNumbers.start}-L${lineNumbers.end}` : ''; - const yamlLink = 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; + const numberRange = lineNumbers + ? `L${lineNumbers.start}-L${lineNumbers.end}` + : ''; + const yamlLink = + 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml'; return `${yamlLink}${numberRange}`; }; -export const fetchSrcData = async (categoryName: string, sectionName: string, serviceName: string) => { - const lineNumberData = await fetch('/api/line-numbers.json') - .then((res) => res.json()); +export const fetchSrcData = async ( + categoryName: string, + sectionName: string, + serviceName: string, +) => { + const lineNumberData = await fetch('/api/line-numbers.json').then((res) => + res.json(), + ); - if ( lineNumberData - && lineNumberData[categoryName] - && lineNumberData[categoryName][sectionName] - && lineNumberData[categoryName][sectionName][serviceName] + if ( + lineNumberData && + lineNumberData[categoryName] && + lineNumberData[categoryName][sectionName] && + lineNumberData[categoryName][sectionName][serviceName] ) { return { - lineNumbers: lineNumberData[categoryName][sectionName][serviceName].lineNumbers, + lineNumbers: + lineNumberData[categoryName][sectionName][serviceName].lineNumbers, yamlContent: lineNumberData[categoryName][sectionName][serviceName].yaml, }; } else { - console.error('No line number data found for', categoryName, sectionName, serviceName); + console.error( + 'No line number data found for', + categoryName, + sectionName, + serviceName, + ); return { lineNumbers: [], yamlContent: '' }; } }; diff --git a/web/src/utils/dates-n-stuff.test.ts b/web/src/utils/dates-n-stuff.test.ts new file mode 100644 index 0000000..e212661 --- /dev/null +++ b/web/src/utils/dates-n-stuff.test.ts @@ -0,0 +1,32 @@ +import { describe, it, expect } from 'vitest'; +import { formatDate, timestampToDate } from './dates-n-stuff'; + +describe('formatDate', () => { + it('formats an ISO date string to en-GB short format', () => { + const result = formatDate('2024-01-15'); + expect(result).toBe('15 Jan 24'); + }); + + it('formats a different date correctly', () => { + const result = formatDate('2023-12-25'); + expect(result).toBe('25 Dec 23'); + }); + + it('handles full ISO datetime string', () => { + const result = formatDate('2024-06-01T12:00:00Z'); + expect(result).toBe('01 Jun 24'); + }); +}); + +describe('timestampToDate', () => { + it('converts a Unix timestamp (ms) to en-GB short format', () => { + // 2024-01-15T00:00:00Z = 1705276800000 + const result = timestampToDate(1705276800000); + expect(result).toBe('15 Jan 24'); + }); + + it('converts epoch 0 to 01 Jan 70', () => { + const result = timestampToDate(0); + expect(result).toBe('01 Jan 70'); + }); +}); diff --git a/web/src/utils/dates-n-stuff.ts b/web/src/utils/dates-n-stuff.ts index a89fb57..3313720 100644 --- a/web/src/utils/dates-n-stuff.ts +++ b/web/src/utils/dates-n-stuff.ts @@ -2,21 +2,22 @@ export const formatDate = (date: string): string => { return new Date(date).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', - year: '2-digit' + year: '2-digit', }); -} +}; export const timestampToDate = (timestamp: number): string => { return new Date(timestamp).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', - year: '2-digit' + year: '2-digit', }); - -} +}; export const timeAgo = (dateStr: string): string => { - const seconds = Math.floor((new Date().getTime() - new Date(dateStr).getTime()) / 1000); + const seconds = Math.floor( + (new Date().getTime() - new Date(dateStr).getTime()) / 1000, + ); const intervals = { year: 31536000, month: 2592000, diff --git a/web/src/utils/do-searchy-searchy.test.ts b/web/src/utils/do-searchy-searchy.test.ts new file mode 100644 index 0000000..d560808 --- /dev/null +++ b/web/src/utils/do-searchy-searchy.test.ts @@ -0,0 +1,106 @@ +import { describe, it, expect } from 'vitest'; +import { prepareSearchItems } from './do-searchy-searchy'; +import type { SearchItem } from './do-searchy-searchy'; +import type { Category } from '../types/Service'; + +const makeCategory = (overrides: Partial = {}): Category => + ({ + name: 'Test Category', + sections: [], + ...overrides, + }) as Category; + +describe('prepareSearchItems', () => { + it('returns an empty array for no categories', () => { + expect(prepareSearchItems([])).toEqual([]); + }); + + it('creates a category item', () => { + const categories = [makeCategory({ name: 'Privacy Tools' })]; + const items = prepareSearchItems(categories); + expect(items).toHaveLength(1); + expect(items[0]).toMatchObject({ + type: 'Category', + category: 'Privacy Tools', + itemCount: 0, + }); + }); + + it('creates section items with category context', () => { + const categories = [ + makeCategory({ + name: 'Comms', + sections: [ + { name: 'Messaging', intro: 'Secure messaging apps', services: [] }, + ], + }), + ] as Category[]; + const items = prepareSearchItems(categories); + const section = items.find((i: SearchItem) => i.type === 'Section'); + expect(section).toMatchObject({ + type: 'Section', + sectionName: 'Messaging', + description: 'Secure messaging apps', + category: 'Comms', + itemCount: 0, + }); + }); + + it('creates service items with section and category context', () => { + const categories = [ + makeCategory({ + name: 'Comms', + sections: [ + { + name: 'Messaging', + services: [ + { + name: 'Signal', + description: 'Encrypted messenger', + url: 'https://signal.org', + github: 'signalapp/Signal-Android', + icon: 'signal.png', + }, + ], + }, + ], + }), + ] as Category[]; + const items = prepareSearchItems(categories); + const service = items.find((i: SearchItem) => i.type === 'Service'); + expect(service).toMatchObject({ + type: 'Service', + name: 'Signal', + description: 'Encrypted messenger', + url: 'https://signal.org', + github: 'signalapp/Signal-Android', + category: 'Comms', + sectionName: 'Messaging', + logo: 'signal.png', + }); + }); + + it('counts services across sections for category itemCount', () => { + const categories = [ + makeCategory({ + name: 'Tools', + sections: [ + { + name: 'A', + services: [ + { name: 's1', description: '', url: '' }, + { name: 's2', description: '', url: '' }, + ], + }, + { + name: 'B', + services: [{ name: 's3', description: '', url: '' }], + }, + ], + }), + ] as Category[]; + const items = prepareSearchItems(categories); + const cat = items.find((i: SearchItem) => i.type === 'Category'); + expect(cat?.itemCount).toBe(3); + }); +}); diff --git a/web/src/utils/do-searchy-searchy.ts b/web/src/utils/do-searchy-searchy.ts index 053ddbc..afebe55 100644 --- a/web/src/utils/do-searchy-searchy.ts +++ b/web/src/utils/do-searchy-searchy.ts @@ -1,19 +1,31 @@ import type { Category } from '../types/Service'; -export const prepareSearchItems = (categories: Category[]) => { - const items: any = []; +export interface SearchItem { + type: 'Category' | 'Section' | 'Service'; + category: string; + itemCount?: number; + sectionName?: string; + description?: string; + name?: string; + url?: string; + github?: string; + logo?: string; +} + +export const prepareSearchItems = (categories: Category[]): SearchItem[] => { + const items: SearchItem[] = []; // Add each category - categories.forEach(category => { + categories.forEach((category) => { items.push({ type: 'Category', category: category.name, itemCount: (category.sections || []).reduce((acc, section) => { - return acc + (section.services || []).length; - }, 0), + return acc + (section.services || []).length; + }, 0), }); // Add section with category context - category.sections.forEach(section => { + category.sections.forEach((section) => { items.push({ type: 'Section', sectionName: section.name, @@ -21,9 +33,9 @@ export const prepareSearchItems = (categories: Category[]) => { category: category.name, itemCount: (section.services || []).length, }); - + // Add service with section and category context - (section.services || []).forEach(service => { + (section.services || []).forEach((service) => { items.push({ type: 'Service', name: service.name, @@ -53,6 +65,6 @@ export const searchOptions = { { name: 'description', weight: 0.1 }, { name: 'intro', weight: 0.1 }, { name: 'furtherInfo', weight: 0.1 }, - { name: 'wordOfWarning', weight: 0.1 }, + { name: 'wordOfWarning', weight: 0.1 }, ], }; diff --git a/web/src/utils/fetch-android-info.ts b/web/src/utils/fetch-android-info.ts index 522a342..3e1b0a6 100644 --- a/web/src/utils/fetch-android-info.ts +++ b/web/src/utils/fetch-android-info.ts @@ -1,14 +1,22 @@ +import { error } from './logger'; const doubleCheckPackageName = (packageStr: string) => { return packageStr.includes('id=') ? packageStr.split('id=')[1] : packageStr; -} +}; -export const fetchAndroidInfo = async (androidPackage: string): Promise => { +export const fetchAndroidInfo = async ( + androidPackage: string, +): Promise => { const endpoint = `https://android-app-privacy.as93.net/${doubleCheckPackageName(androidPackage)}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching android data:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('Android', `HTTP ${res.status} for ${androidPackage} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('Android', `Network error for ${androidPackage}: ${err}`); return null; } }; @@ -43,5 +51,3 @@ export interface AndroidInfo { trackers: Tracker[]; permissions: string[]; } - - diff --git a/web/src/utils/fetch-data.test.ts b/web/src/utils/fetch-data.test.ts new file mode 100644 index 0000000..89eee6d --- /dev/null +++ b/web/src/utils/fetch-data.test.ts @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest'; +import { slugify } from './fetch-data'; + +describe('slugify', () => { + it('lowercases and replaces spaces with hyphens', () => { + expect(slugify('Hello World')).toBe('hello-world'); + }); + + it('replaces & with "and"', () => { + expect(slugify('Privacy & Security')).toBe('privacy-and-security'); + }); + + it('replaces + with "and"', () => { + expect(slugify('Tools + Tips')).toBe('tools-and-tips'); + }); + + it('removes question marks', () => { + expect(slugify('What is Privacy?')).toBe('what-is-privacy'); + }); + + it('handles multiple spaces', () => { + expect(slugify('a b c')).toBe('a--b---c'); + }); + + it('returns empty string for empty input', () => { + expect(slugify('')).toBe(''); + }); + + it('returns empty string for undefined-like input', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(slugify(undefined as any)).toBe(''); + }); + + it('handles combined special characters', () => { + expect(slugify('Q&A + FAQ?')).toBe('qanda-and-faq'); + }); +}); diff --git a/web/src/utils/fetch-data.ts b/web/src/utils/fetch-data.ts index 6c95986..948acb6 100644 --- a/web/src/utils/fetch-data.ts +++ b/web/src/utils/fetch-data.ts @@ -1,17 +1,30 @@ - import yaml from 'js-yaml'; +import { error } from './logger'; import type { AwesomePrivacy } from '../types/Service'; -const awesomePrivacyData = 'https://raw.githubusercontent.com/Lissy93/awesome-privacy/main/awesome-privacy.yml'; +const awesomePrivacyData = + 'https://raw.githubusercontent.com/Lissy93/awesome-privacy/main/awesome-privacy.yml'; export const fetchData = async (): Promise => { - return await fetch(awesomePrivacyData) - .then((res) => res.text()) - .then((data) => yaml.load(data)) - .catch((err) => console.error('ah crap', err)) as AwesomePrivacy; -} + try { + const res = await fetch(awesomePrivacyData); + if (!res.ok) { + error('Data', `HTTP ${res.status} fetching awesome-privacy.yml (${awesomePrivacyData})`); + return {} as AwesomePrivacy; + } + const text = await res.text(); + return yaml.load(text) as AwesomePrivacy; + } catch (err) { + error('Data', `Failed to fetch awesome-privacy.yml: ${err}`); + return {} as AwesomePrivacy; + } +}; export const slugify = (title: string) => { - return (title || '').toLowerCase().replace(/\s/g, '-').replace(/\+|&/g, 'and').replaceAll('?', ''); -}; + return (title || '') + .toLowerCase() + .replace(/\s/g, '-') + .replace(/\+|&/g, 'and') + .replaceAll('?', ''); +}; diff --git a/web/src/utils/fetch-discord-info.ts b/web/src/utils/fetch-discord-info.ts index bd0c0ce..33df917 100644 --- a/web/src/utils/fetch-discord-info.ts +++ b/web/src/utils/fetch-discord-info.ts @@ -1,10 +1,18 @@ +import { error } from './logger'; -export const fetchDiscordInfo = async (discordInvite: string): Promise => { +export const fetchDiscordInfo = async ( + discordInvite: string, +): Promise => { const endpoint = `https://discord-invite-info.as93.net/${discordInvite}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching discord data:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('Discord', `HTTP ${res.status} for ${discordInvite} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('Discord', `Network error for ${discordInvite}: ${err}`); return null; } }; diff --git a/web/src/utils/fetch-docker-instructions.ts b/web/src/utils/fetch-docker-instructions.ts index 739bfe9..c3a0005 100644 --- a/web/src/utils/fetch-docker-instructions.ts +++ b/web/src/utils/fetch-docker-instructions.ts @@ -1,11 +1,18 @@ +import { error } from './logger'; - -export const fetchDockerData = async (serviceName: string): Promise => { +export const fetchDockerData = async ( + serviceName: string, +): Promise => { const endpoint = `https://docker-info.as93.workers.dev/${serviceName}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching docker data:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('Docker', `HTTP ${res.status} for ${serviceName} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('Docker', `Network error for ${serviceName}: ${err}`); return null; } }; diff --git a/web/src/utils/fetch-ios-info.ts b/web/src/utils/fetch-ios-info.ts index 5e1d5fa..8f67c63 100644 --- a/web/src/utils/fetch-ios-info.ts +++ b/web/src/utils/fetch-ios-info.ts @@ -1,10 +1,18 @@ +import { error } from './logger'; -export const fetchIosInfo = async (iosUrl: string): Promise => { +export const fetchIosInfo = async ( + iosUrl: string, +): Promise => { const endpoint = `https://ios-app-info.as93.net?appStoreUrl=${iosUrl}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching ios info:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('iOS', `HTTP ${res.status} for ${iosUrl} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('iOS', `Network error for ${iosUrl}: ${err}`); return null; } }; diff --git a/web/src/utils/fetch-privacy-policy.ts b/web/src/utils/fetch-privacy-policy.ts index 2cff5a1..74ef4a9 100644 --- a/web/src/utils/fetch-privacy-policy.ts +++ b/web/src/utils/fetch-privacy-policy.ts @@ -1,10 +1,18 @@ +import { error } from './logger'; -export const fetchTosdrPrivacy = async (serviceId: string): Promise => { +export const fetchTosdrPrivacy = async ( + serviceId: string, +): Promise => { const endpoint = `https://privacy-policies.as93.workers.dev/${serviceId}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching privacy policy data:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('ToS;DR', `HTTP ${res.status} for service ${serviceId} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('ToS;DR', `Network error for service ${serviceId}: ${err}`); return null; } }; diff --git a/web/src/utils/fetch-reddit-info.ts b/web/src/utils/fetch-reddit-info.ts index 810ec5a..54c89cf 100644 --- a/web/src/utils/fetch-reddit-info.ts +++ b/web/src/utils/fetch-reddit-info.ts @@ -1,10 +1,18 @@ +import { error } from './logger'; -export const fetchRedditInfo = async (subreddit: string): Promise => { +export const fetchRedditInfo = async ( + subreddit: string, +): Promise => { const endpoint = `https://subreddit-info.as93.net/${subreddit}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching reddit data:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('Reddit', `HTTP ${res.status} for r/${subreddit} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('Reddit', `Network error for r/${subreddit}: ${err}`); return null; } }; diff --git a/web/src/utils/fetch-repo-info.ts b/web/src/utils/fetch-repo-info.ts index 62a650c..629b26a 100644 --- a/web/src/utils/fetch-repo-info.ts +++ b/web/src/utils/fetch-repo-info.ts @@ -1,17 +1,110 @@ +import { error } from './logger'; - - -export const fetchGitHubStats = async (github: string): Promise => { - const endpoint = `https://repo-info.as93.workers.dev/${github}`; - try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching GitHub stats:', error); - return null; - } +const githubHeaders = (): Record => { + const headers: Record = { + 'User-Agent': 'awesome-privacy', + 'Accept': 'application/vnd.github.v3+json', + }; + const token = import.meta.env.GITHUB_API_KEY; + if (token) headers['Authorization'] = `token ${token}`; + return headers; }; -// fetch(`https://repo-info.as93.workers.dev/${github}`).then((res) => res.json()); +const fetchFromGitHub = async (github: string): Promise => { + const base = `https://api.github.com/repos/${github}`; + const headers = githubHeaders(); + + const [infoRes, langsRes, tagsRes, contribRes, commitsRes] = await Promise.all([ + fetch(base, { headers }), + fetch(`${base}/languages`, { headers }), + fetch(`${base}/tags`, { headers }), + fetch(`${base}/contributors`, { headers }), + fetch(`${base}/commits`, { headers }), + ]); + + if (!infoRes.ok) { + error('GitHub Stats', `GitHub API returned ${infoRes.status} for ${github}`); + return null; + } + + const parseJson = (r: Response) => + r.ok && r.status !== 204 ? r.json() : null; + + const [info, languages, tags, contributors, commits] = await Promise.all( + [infoRes, langsRes, tagsRes, contribRes, commitsRes].map(parseJson), + ); + + return { + info: { + ownerUsername: info.owner?.login ?? '', + ownerAvatar: info.owner?.avatar_url ?? '', + description: info.description ?? '', + url: info.html_url ?? '', + homepage: info.homepage ?? '', + language: info.language ?? '', + topics: info.topics ?? [], + license: info.license?.spdx_id ?? '', + isFork: info.fork ?? false, + isArchived: info.archived ?? false, + createdAt: info.created_at ?? '', + updatedAt: info.updated_at ?? '', + size: info.size ?? 0, + scarCount: info.stargazers_count ?? 0, + forksCount: info.forks_count ?? 0, + watchersCount: info.watchers_count ?? 0, + }, + languages: languages ?? {}, + versions: (tags ?? []).map((tag: any) => ({ + name: tag.name, + commit: tag.commit?.sha ?? '', + zipball: tag.zipball_url ?? '', + tarball: tag.tarball_url ?? '', + })), + contributors: (contributors ?? []).map((c: any) => ({ + username: c.login ?? '', + avatar: c.avatar_url ?? '', + contributions: c.contributions ?? 0, + })), + commits: (commits ?? []).map((c: any) => ({ + sha: c.sha ?? '', + authorName: c.commit?.author?.name ?? '', + authorDate: c.commit?.author?.date ?? '', + message: c.commit?.message ?? '', + authorUsername: c.author?.login ?? '', + authorAvatar: c.author?.avatar_url ?? '', + })), + }; +}; + +const fetchFromWorker = async (github: string): Promise => { + const res = await fetch(`https://repo-info.as93.workers.dev/${github}`); + if (!res.ok) return null; + return res.json(); +}; + +const normalizeRepo = (github: string): string => + github.replace(/^https?:\/\/github\.com\//, ''); + +export const fetchGitHubStats = async ( + github: string, +): Promise => { + github = normalizeRepo(github); + try { + const result = await fetchFromGitHub(github); + if (result) return result; + const fallback = await fetchFromWorker(github); + if (fallback) return fallback; + error('GitHub Stats', `Both direct API and worker failed for ${github}`); + return null; + } catch (err) { + try { + return await fetchFromWorker(github); + } catch { + error('GitHub Stats', `All fetches failed for ${github}: ${err}`); + return null; + } + } +}; export interface GitHubStatsResponse { info: { @@ -35,17 +128,6 @@ export interface GitHubStatsResponse { languages: { [key: string]: number; }; - updates: Array<{ - type: string; - actor: { - username: string; - avatar: string; - }; - repo: string; - action: string; - createdAt: string; - number?: number; - }>; versions: Array<{ name: string; commit: string; diff --git a/web/src/utils/fetch-website-info.ts b/web/src/utils/fetch-website-info.ts index 0f236ba..46be050 100644 --- a/web/src/utils/fetch-website-info.ts +++ b/web/src/utils/fetch-website-info.ts @@ -1,10 +1,18 @@ +import { error } from './logger'; -export const fetchWebsiteInfo = async (url: string): Promise => { +export const fetchWebsiteInfo = async ( + url: string, +): Promise => { const endpoint = `https://site-info-fetch.as93.workers.dev/?url=${url}`; try { - return await fetch(endpoint).then((res) => res.json()); - } catch (error) { - console.error('Error fetching website info:', error); + const res = await fetch(endpoint); + if (!res.ok) { + error('Website', `HTTP ${res.status} for ${url} (${endpoint})`); + return null; + } + return await res.json(); + } catch (err) { + error('Website', `Network error for ${url}: ${err}`); return null; } }; @@ -19,10 +27,10 @@ interface DNSRecord { interface DNSRecords { ns: { - records: DNSRecord[]; + records: DNSRecord[]; }; mx: { - records: DNSRecord[]; + records: DNSRecord[]; }; } @@ -60,7 +68,7 @@ interface Redirection { found: boolean; external: boolean; url: string; - redirects: any[]; + redirects: string[]; } interface ResponseHeaders { diff --git a/web/src/utils/logger.ts b/web/src/utils/logger.ts new file mode 100644 index 0000000..55740d5 --- /dev/null +++ b/web/src/utils/logger.ts @@ -0,0 +1,48 @@ +type Level = 'warn' | 'error'; + +interface LogEntry { + level: Level; + source: string; + message: string; +} + +const entries: LogEntry[] = []; + +export const warn = (source: string, message: string) => { + console.warn(`[${source}] ${message}`); + entries.push({ level: 'warn', source, message }); +}; + +export const error = (source: string, message: string) => { + console.error(`[${source}] ${message}`); + entries.push({ level: 'error', source, message }); +}; + +export const printSummary = () => { + if (entries.length === 0) return; + + const grouped: Record = {}; + for (const entry of entries) { + if (!grouped[entry.source]) { + grouped[entry.source] = { errors: 0, warnings: 0, messages: [] }; + } + const group = grouped[entry.source]; + if (entry.level === 'error') group.errors++; + else group.warnings++; + group.messages.push(` ${entry.level.toUpperCase()}: ${entry.message}`); + } + + console.log('\n───────────── Build fetch summary ──────────────'); + for (const [source, { errors, warnings, messages }] of Object.entries(grouped)) { + const parts = []; + if (errors) parts.push(`${errors} error${errors > 1 ? 's' : ''}`); + if (warnings) parts.push(`${warnings} warning${warnings > 1 ? 's' : ''}`); + console.log(`[${source}] ${parts.join(', ')}`); + for (const msg of messages) { + console.log(msg); + } + } + console.log('────────────────────────────────────────────────\n'); + + entries.length = 0; +}; diff --git a/web/src/utils/parse-markdown.test.ts b/web/src/utils/parse-markdown.test.ts new file mode 100644 index 0000000..64cf38a --- /dev/null +++ b/web/src/utils/parse-markdown.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; +import { formatLink } from './parse-markdown'; + +describe('formatLink', () => { + it('strips https://', () => { + expect(formatLink('https://example.com')).toBe('example.com'); + }); + + it('strips http://', () => { + expect(formatLink('http://example.com')).toBe('example.com'); + }); + + it('strips www.', () => { + expect(formatLink('https://www.example.com')).toBe('example.com'); + }); + + it('strips trailing slash', () => { + expect(formatLink('https://example.com/')).toBe('example.com'); + }); + + it('strips multiple trailing slashes', () => { + expect(formatLink('https://example.com///')).toBe('example.com'); + }); + + it('preserves path segments', () => { + expect(formatLink('https://example.com/path/to/page')).toBe( + 'example.com/path/to/page', + ); + }); + + it('handles bare domain', () => { + expect(formatLink('example.com')).toBe('example.com'); + }); + + it('handles empty string', () => { + expect(formatLink('')).toBe(''); + }); + + it('handles undefined-like input', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(formatLink(undefined as any)).toBe(''); + }); +}); diff --git a/web/src/utils/parse-markdown.ts b/web/src/utils/parse-markdown.ts index 3dffdd8..420bbb4 100644 --- a/web/src/utils/parse-markdown.ts +++ b/web/src/utils/parse-markdown.ts @@ -23,19 +23,24 @@ export const parseMarkdown = (text: string | undefined): string => { // Sanitize the input to remove