mirror of
https://github.com/Lissy93/awesome-privacy.git
synced 2026-03-11 08:55:33 +00:00
Improves the validation script.
- Updates Python deps - Only run pip install on first time - Corrections to the schema - Adds missing URL field to Picocrypt to avoid failure - Improves the script, with neater output, proper error codes, colors, etc
This commit is contained in:
parent
0ad29adfa6
commit
2fec6f757d
5 changed files with 188 additions and 159 deletions
2
Makefile
2
Makefile
|
|
@ -34,7 +34,7 @@ WEB_DIR := web
|
||||||
|
|
||||||
# Targets for lib/
|
# Targets for lib/
|
||||||
install_lib_deps:
|
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
|
gen_readme: install_lib_deps
|
||||||
$(PYTHON) $(LIB_DIR)/awesome-privacy-readme-gen.py
|
$(PYTHON) $(LIB_DIR)/awesome-privacy-readme-gen.py
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ categories:
|
||||||
Free for self-hosted data (or $3/ month hosted). Be aware that 1Password
|
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
|
is not fully open source, but they do regularly publish results of their
|
||||||
independent [security audits](https://support.1password.com/security-assessments),
|
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: >
|
furtherInfo: >
|
||||||
**Other Open Source PM**: [Buttercup](https://buttercup.pw), [Clipperz](https://clipperz.is),
|
**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),
|
[Pass](https://www.passwordstore.org), [Padloc](https://padloc.app), [TeamPass](https://teampass.net),
|
||||||
|
|
@ -252,9 +252,9 @@ categories:
|
||||||
iosApp: https://apps.apple.com/us/app/ente-auth/id6444121398
|
iosApp: https://apps.apple.com/us/app/ente-auth/id6444121398
|
||||||
androidApp: io.ente.auth
|
androidApp: io.ente.auth
|
||||||
description: |
|
description: |
|
||||||
Ente Auth is a free and open-source app which stores and generates TOTP tokens.
|
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
|
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
|
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.
|
fashion. It can also be used offline on a single device with no account necessary.
|
||||||
|
|
||||||
furtherInfo: >
|
furtherInfo: >
|
||||||
|
|
@ -265,7 +265,7 @@ categories:
|
||||||
[Etopa](https://play.google.com/store/apps/details?id=de.ltheinrich.etopa) *(Android)*<br>
|
[Etopa](https://play.google.com/store/apps/details?id=de.ltheinrich.etopa) *(Android)*<br>
|
||||||
For KeePass users, [TrayTop](https://keepass.info/plugins.html#traytotp)
|
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.
|
is a plugin for managing TOTP's - offline and compatible with Windows, Mac and Linux.
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
###### File Encryption ######
|
###### File Encryption ######
|
||||||
#############################
|
#############################
|
||||||
|
|
@ -309,9 +309,10 @@ categories:
|
||||||
- name: Picocrypt
|
- name: Picocrypt
|
||||||
github: Picocrypt/Picocrypt
|
github: Picocrypt/Picocrypt
|
||||||
icon: https://avatars.githubusercontent.com/u/171401041
|
icon: https://avatars.githubusercontent.com/u/171401041
|
||||||
|
url: ''
|
||||||
description: |
|
description: |
|
||||||
Picocrypt is a very small (hence Pico), very simple, yet very secure encryption tools
|
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.
|
with a focus on security, simplicity, and reliability.
|
||||||
|
|
||||||
wordOfWarning: >
|
wordOfWarning: >
|
||||||
|
|
@ -440,7 +441,7 @@ categories:
|
||||||
After installing, check the privacy & security settings, and update the configuration to
|
After installing, check the privacy & security settings, and update the configuration to
|
||||||
something that you are comfortable with. 12Bytes maintains a comprehensive guide on
|
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)
|
[Firefox Configuration for Privacy and Performance](https://codeberg.org/12bytes/firefox-config-guide)
|
||||||
|
|
||||||
############################
|
############################
|
||||||
###### Search Engines ######
|
###### Search Engines ######
|
||||||
############################
|
############################
|
||||||
|
|
@ -524,8 +525,8 @@ categories:
|
||||||
and self-hostable, although using a [public instance](https://searx.space)
|
and self-hostable, although using a [public instance](https://searx.space)
|
||||||
has the benefit of not singling out your queries to the engines used.
|
has the benefit of not singling out your queries to the engines used.
|
||||||
A fork of the original [Searx](https://searx.github.io/searx/).
|
A fork of the original [Searx](https://searx.github.io/searx/).
|
||||||
|
|
||||||
|
|
||||||
- name: Communication
|
- name: Communication
|
||||||
sections:
|
sections:
|
||||||
#################################
|
#################################
|
||||||
|
|
@ -581,10 +582,10 @@ categories:
|
||||||
subreddit: SimpleXChat
|
subreddit: SimpleXChat
|
||||||
description: |
|
description: |
|
||||||
Simplex is gaining popularity as a secure and private messaging app renowned
|
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.
|
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
|
Additionally, it is cross-platform, open-source, and completely free, aligning with the modern user's
|
||||||
preferences for convenience, security, and accessibility.
|
preferences for convenience, security, and accessibility.
|
||||||
Learn more about the [Security Policy](https://simplex.chat/security/).
|
Learn more about the [Security Policy](https://simplex.chat/security/).
|
||||||
|
|
||||||
- name: XMPP
|
- name: XMPP
|
||||||
|
|
@ -615,7 +616,7 @@ categories:
|
||||||
an open specification and Simple pragmatic RESTful HTTP/JSON API it makes it easy
|
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
|
to integrates with existing 3rd party IDs to authenticate and discover users, as
|
||||||
well as to build apps on top of it.
|
well as to build apps on top of it.
|
||||||
notableMentions:
|
notableMentions:
|
||||||
- name: Chat Secure
|
- name: Chat Secure
|
||||||
url: https://chatsecure.org
|
url: https://chatsecure.org
|
||||||
- name: KeyBase
|
- name: KeyBase
|
||||||
|
|
@ -649,7 +650,7 @@ categories:
|
||||||
be used to communicate any sensitive data.
|
be used to communicate any sensitive data.
|
||||||
[Wire](https://wire.com/) has also been removed, due to
|
[Wire](https://wire.com/) has also been removed, due to
|
||||||
a [recent acquisition](https://blog.privacytools.io/delisting-wire/)
|
a [recent acquisition](https://blog.privacytools.io/delisting-wire/)
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
###### P2P Messaging ######
|
###### P2P Messaging ######
|
||||||
###########################
|
###########################
|
||||||
|
|
@ -724,7 +725,7 @@ categories:
|
||||||
url: https://github.com/Bitmessage/PyBitmessage
|
url: https://github.com/Bitmessage/PyBitmessage
|
||||||
- name: RetroShare
|
- name: RetroShare
|
||||||
url: https://retroshare.cc
|
url: https://retroshare.cc
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
###### Encrypted Email ######
|
###### Encrypted Email ######
|
||||||
#############################
|
#############################
|
||||||
|
|
@ -792,11 +793,11 @@ categories:
|
||||||
custom domains (starting at $3/month). Tuta
|
custom domains (starting at $3/month). Tuta
|
||||||
[does not use OpenPGP](https://tuta.com/blog/posts/differences-email-encryption/)
|
[does not use OpenPGP](https://tuta.com/blog/posts/differences-email-encryption/)
|
||||||
like other encrypted mail providers, instead they use a standardized, hybrid method
|
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
|
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,
|
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
|
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.
|
posed by quantum computers.
|
||||||
- name: Mailfence
|
- name: Mailfence
|
||||||
url: https://mailfence.com?src=digitald
|
url: https://mailfence.com?src=digitald
|
||||||
|
|
@ -1104,7 +1105,7 @@ categories:
|
||||||
url: https://www.smspool.net
|
url: https://www.smspool.net
|
||||||
icon: https://i.ibb.co/2t4MBFj/apple-touch-icon.png
|
icon: https://i.ibb.co/2t4MBFj/apple-touch-icon.png
|
||||||
description: |
|
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.
|
We support over 50+ countries and support over 300+ services.
|
||||||
androidApp: com.smspool.app
|
androidApp: com.smspool.app
|
||||||
iosApp: https://apps.apple.com/app/smspool/id6474617801
|
iosApp: https://apps.apple.com/app/smspool/id6474617801
|
||||||
|
|
@ -1452,7 +1453,7 @@ categories:
|
||||||
Displays a country flag depicting the location of the current website's server, which can be useful to know at a glance.
|
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**:
|
Click icon for more tools such as site safety checks, whois, validation etc **Download**:
|
||||||
[Firefox](https://addons.mozilla.org/en-US/firefox/addon/flagfox/)
|
[Firefox](https://addons.mozilla.org/en-US/firefox/addon/flagfox/)
|
||||||
|
|
||||||
- name: Lightbeam
|
- name: Lightbeam
|
||||||
url: https://mozilla.github.io/lightbeam/
|
url: https://mozilla.github.io/lightbeam/
|
||||||
github: mozilla/lightbeam-we
|
github: mozilla/lightbeam-we
|
||||||
|
|
@ -1523,7 +1524,7 @@ categories:
|
||||||
url: https://addons.mozilla.org/en-US/firefox/addon/crxviewer
|
url: https://addons.mozilla.org/en-US/firefox/addon/crxviewer
|
||||||
description: >
|
description: >
|
||||||
A handy extension for viewing the source code of another browser extension,
|
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: |
|
wordOfWarning: |
|
||||||
- Having many extensions installed raises entropy, causing your fingerprint to be more unique, hence making tracking easier.
|
- 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
|
- 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
|
||||||
|
|
@ -2043,7 +2044,7 @@ categories:
|
||||||
See [Streisand](https://github.com/StreisandEffect/streisand), to learn more, and get started with running a VPN.
|
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,
|
[Digital Ocean](https://m.do.co/c/3838338e7f79) provides flexible,
|
||||||
secure and easy Linux VMs, (from $0.007/hour or $5/month),
|
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.
|
on [Digital Ocean](https://m.do.co/c/3838338e7f79), by Carl Friess.
|
||||||
|
|
||||||
Recently distributed self-hosted solutions for running your own VPNs have
|
Recently distributed self-hosted solutions for running your own VPNs have
|
||||||
|
|
@ -2203,8 +2204,8 @@ categories:
|
||||||
Tor, I2P and Freenet are all anonymity networks - but they work very differently and each is good for specific purposes.
|
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.
|
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)*
|
*You can read more about how I2P compares to Tor, [here](https://blokt.com/guides/what-is-i2p-vs-tor-browser)*
|
||||||
|
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
###### Proxies ######
|
###### Proxies ######
|
||||||
#####################
|
#####################
|
||||||
|
|
@ -2323,7 +2324,7 @@ categories:
|
||||||
Mullvads public DNS with QNAME minimization and basic ad blocking.
|
Mullvads public DNS with QNAME minimization and basic ad blocking.
|
||||||
It has been audited by the security experts at Assured.
|
It has been audited by the security experts at Assured.
|
||||||
You can use this privacy-enhancing service even if you don't use Mullvad.
|
You can use this privacy-enhancing service even if you don't use Mullvad.
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
###### DNS Clients ######
|
###### DNS Clients ######
|
||||||
#########################
|
#########################
|
||||||
|
|
@ -2643,7 +2644,7 @@ categories:
|
||||||
|
|
||||||
Some VPNs have ad-tracking blocking features, such as
|
Some VPNs have ad-tracking blocking features, such as
|
||||||
[TrackStop with PerfectPrivacy](https://www.perfect-privacy.com/en/features/trackstop?a_aid=securitychecklist).
|
[TrackStop with PerfectPrivacy](https://www.perfect-privacy.com/en/features/trackstop?a_aid=securitychecklist).
|
||||||
|
|
||||||
[Private Internet Access](https://www.privateinternetaccess.com/),
|
[Private Internet Access](https://www.privateinternetaccess.com/),
|
||||||
[CyberGhost](https://www.cyberghostvpn.com/),
|
[CyberGhost](https://www.cyberghostvpn.com/),
|
||||||
[PureVPN](https://www.anrdoezrs.net/click-9242873-13842740),
|
[PureVPN](https://www.anrdoezrs.net/click-9242873-13842740),
|
||||||
|
|
@ -2882,7 +2883,7 @@ categories:
|
||||||
[5 eyes](https://en.wikipedia.org/wiki/Five_Eyes) (Australia, Canada, New Zealand, US and UK)
|
[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)
|
and [other international cooperatives](https://en.wikipedia.org/wiki/Five_Eyes#Other_international_cooperatives)
|
||||||
who have legal right to view your data.
|
who have legal right to view your data.
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
###### Domain Registrars ######
|
###### Domain Registrars ######
|
||||||
###############################
|
###############################
|
||||||
|
|
@ -2920,7 +2921,7 @@ categories:
|
||||||
followWith: Web
|
followWith: Web
|
||||||
description: |
|
description: |
|
||||||
Free DNS hosting provider designed with security in mind, and running
|
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.
|
||||||
|
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
|
|
@ -3007,7 +3008,7 @@ categories:
|
||||||
All notes are saved individually as .md files, making them easy to manage.
|
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,
|
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.
|
it is easy to use your own cloud sync provider, and additional features are provided through extensions.
|
||||||
|
|
||||||
- name: Joplin
|
- name: Joplin
|
||||||
url: https://joplinapp.org
|
url: https://joplinapp.org
|
||||||
github: laurent22/joplin
|
github: laurent22/joplin
|
||||||
|
|
@ -3081,7 +3082,7 @@ categories:
|
||||||
|
|
||||||
notableMentions: |
|
notableMentions: |
|
||||||
If you are already tied into Evernote, One Note etc, then [SafeRoom](https://www.getsaferoom.com)
|
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/)
|
[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
|
dedicated to working with the Org markup format. Org can be thought of as
|
||||||
|
|
@ -3331,7 +3332,7 @@ categories:
|
||||||
using [Web Torrent](https://webtorrent.io).
|
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.
|
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.
|
Finally [PsiTransfer](https://github.com/psi-4ward/psitransfer) is a feature-rich, self-hosted file drop, using streams.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3380,7 +3381,7 @@ categories:
|
||||||
description: |
|
description: |
|
||||||
Simple bookmark manager written in Go, intended to be a clone of Pocket, it has both a simple and clean web
|
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.
|
interface as well as a CLI. Shiori has easy import/ export, is portable and has webpage archiving features.
|
||||||
|
|
||||||
notableMentions: |
|
notableMentions: |
|
||||||
[Ymarks](https://ymarks.org) is a C-based self-hosted bookmark synchronization
|
[Ymarks](https://ymarks.org) is a C-based self-hosted bookmark synchronization
|
||||||
server and [Chrome](https://chrome.google.com/webstore/detail/ymarks/gefignhaigoigfjfbjjobmegihhaacfi) extension.
|
server and [Chrome](https://chrome.google.com/webstore/detail/ymarks/gefignhaigoigfjfbjjobmegihhaacfi) extension.
|
||||||
|
|
@ -3438,7 +3439,7 @@ categories:
|
||||||
notableMentions: |
|
notableMentions: |
|
||||||
[Apache OpenMeetings](https://openmeetings.apache.org) provides self-hosted
|
[Apache OpenMeetings](https://openmeetings.apache.org) provides self-hosted
|
||||||
video-conferencing, chat rooms, file server and tools for meetings.
|
video-conferencing, chat rooms, file server and tools for meetings.
|
||||||
|
|
||||||
[together.brave.com](https://together.brave.com) is Brave's Jitsi Fork.
|
[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,
|
For remote learning, [BigBlueButton](https://bigbluebutton.org) is self-hosted conference call software,
|
||||||
|
|
@ -3495,10 +3496,10 @@ categories:
|
||||||
it is not open source, and although there is a free version, a license
|
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
|
is required to access all features. VMWare performs very well when running
|
||||||
on a server, with hundreds of hosts and users.
|
on a server, with hundreds of hosts and users.
|
||||||
|
|
||||||
For Mac users, [Parallels](https://www.parallels.com/uk/) is a popular
|
For Mac users, [Parallels](https://www.parallels.com/uk/) is a popular
|
||||||
option which performs really well, but again is not open source.
|
option which performs really well, but again is not open source.
|
||||||
|
|
||||||
For Windows users, there's
|
For Windows users, there's
|
||||||
[Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v),
|
[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.
|
which is a native Windows product, developed by Microsoft.
|
||||||
|
|
@ -3567,7 +3568,7 @@ categories:
|
||||||
description: |
|
description: |
|
||||||
iOS app for encrypting/ decrypting text.
|
iOS app for encrypting/ decrypting text.
|
||||||
Has native keyboard integration, keychain support and app integrations which makes it quick to use in any app.
|
Has native keyboard integration, keychain support and app integrations which makes it quick to use in any app.
|
||||||
|
|
||||||
|
|
||||||
- name: FlowCrypt
|
- name: FlowCrypt
|
||||||
url: https://flowcrypt.com
|
url: https://flowcrypt.com
|
||||||
|
|
@ -3646,10 +3647,10 @@ categories:
|
||||||
|
|
||||||
Alternatively, with [ImageMagic](https://imagemagick.org) installed, just run
|
Alternatively, with [ImageMagic](https://imagemagick.org) installed, just run
|
||||||
`convert -strip path/to/image.png` to remove all metadata.
|
`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`.
|
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
|
- GoLang: [go-exif](https://github.com/dsoprea/go-exif) by @dsoprea
|
||||||
- JS: [exifr](https://github.com/MikeKovarik/exifr) by @MikeKovarik
|
- JS: [exifr](https://github.com/MikeKovarik/exifr) by @MikeKovarik
|
||||||
- Python: [Piexif](https://github.com/hMatoba/Piexif) by @hMatoba
|
- Python: [Piexif](https://github.com/hMatoba/Piexif) by @hMatoba
|
||||||
|
|
@ -3665,7 +3666,7 @@ categories:
|
||||||
[not remove it](https://uk.norton.com/internetsecurity-privacy-is-my-personal-data-really-gone-when-its-deleted-from-a-device.html)
|
[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
|
from the disk, and recovering deleted files is a
|
||||||
[simple task](https://www.lifewire.com/how-to-recover-deleted-files-2622870).
|
[simple task](https://www.lifewire.com/how-to-recover-deleted-files-2622870).
|
||||||
|
|
||||||
Therefore, to protect your privacy, you should erase/ overwrite data from
|
Therefore, to protect your privacy, you should erase/ overwrite data from
|
||||||
the disk, before you destroy, sell or give away a hard drive.
|
the disk, before you destroy, sell or give away a hard drive.
|
||||||
services:
|
services:
|
||||||
|
|
@ -3754,12 +3755,12 @@ categories:
|
||||||
Or [badblocks](https://linux.die.net/man/8/badblocks) which is intended to search for all bad blocks,
|
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,
|
but can also be used to write zeros to a disk,
|
||||||
by running `sudo badblocks -wsv /dev/sdd`.
|
by running `sudo badblocks -wsv /dev/sdd`.
|
||||||
|
|
||||||
An effective method of erasing an SSD, it to use [hdparm](https://en.wikipedia.org/wiki/Hdparm)
|
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)
|
to issue a [secure erase](https://en.wikipedia.org/wiki/Parallel_ATA#HDD_passwords_and_security)
|
||||||
command, to your target storage device,
|
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).
|
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
|
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`
|
use to securely remove files or directories, just run `srm -zsv /path/to/file`
|
||||||
for a single pass over.
|
for a single pass over.
|
||||||
|
|
@ -3777,7 +3778,7 @@ categories:
|
||||||
If you are an Android user, your device has Google built-in at its core.
|
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/),
|
[Google tracks you](https://digitalcontentnext.org/blog/2018/08/21/google-data-collection-research/),
|
||||||
collecting a wealth of information, and logging your every move.
|
collecting a wealth of information, and logging your every move.
|
||||||
|
|
||||||
A [custom ROM](https://en.wikipedia.org/wiki/List_of_custom_Android_distributions),
|
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.
|
is an open source, usually Google-free mobile OS that can be flashed to your device.
|
||||||
services:
|
services:
|
||||||
|
|
@ -3786,7 +3787,7 @@ categories:
|
||||||
github: GrapheneOS/hardened_malloc
|
github: GrapheneOS/hardened_malloc
|
||||||
icon: https://grapheneos.org/apple-touch-icon.png
|
icon: https://grapheneos.org/apple-touch-icon.png
|
||||||
description: |
|
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.
|
GrapheneOS is a young project, and currently only supports Pixel devices, partially due to their strong hardware security.
|
||||||
|
|
||||||
- name: CalyxOS
|
- name: CalyxOS
|
||||||
|
|
@ -3795,8 +3796,8 @@ categories:
|
||||||
github: CalyxOS/calyxos
|
github: CalyxOS/calyxos
|
||||||
tosdrId: 2558
|
tosdrId: 2558
|
||||||
description: |
|
description: |
|
||||||
CalyxOS is an free and open source Android mobile operating system that puts privacy and security into the hands of everyday users.
|
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
|
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.
|
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
|
- name: DivestOS
|
||||||
|
|
@ -3805,8 +3806,8 @@ categories:
|
||||||
github: Divested-Mobile/DivestOS-Build
|
github: Divested-Mobile/DivestOS-Build
|
||||||
tosdrId: 2550
|
tosdrId: 2550
|
||||||
description: |
|
description: |
|
||||||
DivestOS is a vastly diverged unofficial more secure and private soft fork of LineageOS. DivestOS primary goal is prolonging the life-span of
|
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
|
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.
|
solely by Tad (SkewedZeppelin) since 2014.
|
||||||
|
|
||||||
- name: LineageOS
|
- name: LineageOS
|
||||||
|
|
@ -3815,17 +3816,17 @@ categories:
|
||||||
github: LineageOS/android
|
github: LineageOS/android
|
||||||
tosdrId: 7188
|
tosdrId: 7188
|
||||||
description: |
|
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.
|
supports a wide range of devices, and comes bundled with Privacy Guard.
|
||||||
|
|
||||||
notableMentions: |
|
notableMentions: |
|
||||||
[Replicant OS](https://www.replicant.us/) is a fully-featured distro,
|
[Replicant OS](https://www.replicant.us/) is a fully-featured distro,
|
||||||
with an emphasis on freedom, privacy and security.
|
with an emphasis on freedom, privacy and security.
|
||||||
|
|
||||||
[OmniRom](https://www.omnirom.org/),
|
[OmniRom](https://www.omnirom.org/),
|
||||||
[Resurrection Remix OS](https://resurrectionremix.com/)
|
[Resurrection Remix OS](https://resurrectionremix.com/)
|
||||||
and [Paranoid Android](http://paranoidandroid.co/) are also popular options.
|
and [Paranoid Android](http://paranoidandroid.co/) are also popular options.
|
||||||
|
|
||||||
Alternatively, [Ubuntu Touch](https://ubports.com/) is a Linux (Ubuntu)- based OS.
|
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.
|
It is secure by design and runs on almost any device, - but it does fall short when it comes to the app store.
|
||||||
|
|
||||||
|
|
@ -3992,7 +3993,7 @@ categories:
|
||||||
some technical knowledge to get started with, but once setup should perform
|
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
|
just as any other Windows 10 system. Note that you should only download the
|
||||||
LTSC ISO from the Microsoft's
|
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
|
#### Improve the Security and Privacy of your current OS
|
||||||
|
|
@ -4221,8 +4222,8 @@ categories:
|
||||||
and check reviews/ forums.
|
and check reviews/ forums.
|
||||||
Create a system restore point, before making any significant changes to
|
Create a system restore point, before making any significant changes to
|
||||||
your OS (such as disabling core features).
|
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: |
|
notableMentions: |
|
||||||
See also these lists:
|
See also these lists:
|
||||||
|
|
@ -4295,7 +4296,7 @@ categories:
|
||||||
that offer free solutions, even if you pay for the premium package.
|
that offer free solutions, even if you pay for the premium package.
|
||||||
This includes (but not limited to) Avast, AVG, McAfee and Kasperky.
|
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,
|
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
|
- name: Development
|
||||||
|
|
@ -4350,7 +4351,7 @@ categories:
|
||||||
[reputation](https://srlabs.de/bites/smart-spies) when it comes to protecting
|
[reputation](https://srlabs.de/bites/smart-spies) when it comes to protecting
|
||||||
consumers privacy, there have been
|
consumers privacy, there have been
|
||||||
[many recent breaches](https://www.theverge.com/2019/10/21/20924886/alexa-google-home-security-vulnerability-srlabs-phishing-eavesdropping).
|
[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.
|
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
|
The following are open source AI voice assistants, that aim to provide a
|
||||||
human voice interface while also protecting your privacy and security
|
human voice interface while also protecting your privacy and security
|
||||||
|
|
@ -4386,7 +4387,7 @@ categories:
|
||||||
[LinTO](https://linto.ai), [Jovo](https://www.jovo.tech) and [Snips](https://snips.ai)
|
[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,
|
are private-by-design voice assistant frameworks that can be built on by developers,
|
||||||
or used by enterprises.
|
or used by enterprises.
|
||||||
|
|
||||||
[Jasper](https://jasperproject.github.io),
|
[Jasper](https://jasperproject.github.io),
|
||||||
[Stephanie](https://github.com/SlapBot/stephanie-va) and
|
[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.
|
[Hey Athena](https://github.com/rcbyron/hey-athena-client) are Python-based voice assistant, but neither is under active development anymore.
|
||||||
|
|
@ -4403,7 +4404,7 @@ categories:
|
||||||
description: |
|
description: |
|
||||||
An open source privacy-respecting Home Assistant, compatible with a wide range of
|
An open source privacy-respecting Home Assistant, compatible with a wide range of
|
||||||
devices including Raspberry Pi, desktop computers, or NAS systems.
|
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, ...).
|
(Zigbee, Philips, Camera, Tuya, MQTT, Telegram, ...).
|
||||||
url: https://gladysassistant.com/
|
url: https://gladysassistant.com/
|
||||||
github: gladysassistant/gladys
|
github: gladysassistant/gladys
|
||||||
|
|
@ -4446,7 +4447,7 @@ categories:
|
||||||
notableMentions: |
|
notableMentions: |
|
||||||
Other privacy-focused cryptocurrencies include:
|
Other privacy-focused cryptocurrencies include:
|
||||||
[PIVX](https://pivx.org),
|
[PIVX](https://pivx.org),
|
||||||
[Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/).
|
[Verge](https://vergecurrency.com), and [Piratechain](https://pirate.black/).
|
||||||
wordOfWarning: |
|
wordOfWarning: |
|
||||||
Not all cryptocurrencies are anonymous, and without using a privacy-focused coin,
|
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.
|
a record of your transaction will live on a publicly available distributed ledger, forever.
|
||||||
|
|
@ -4583,7 +4584,7 @@ categories:
|
||||||
|
|
||||||
[BitMex](https://www.bitmex.com/) has more advanced trading features,
|
[BitMex](https://www.bitmex.com/) has more advanced trading features,
|
||||||
but ID verification is required for higher value trades involving Fiat currency.
|
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,
|
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.
|
~and ID verification is not needed for small-value trades~ but ID verification is required in most countries.
|
||||||
|
|
||||||
|
|
@ -4720,7 +4721,7 @@ categories:
|
||||||
Over the past decade, social networks have revolutionized the way we communicate
|
Over the past decade, social networks have revolutionized the way we communicate
|
||||||
and bought the world closer together - but it came at the
|
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).
|
[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
|
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
|
should be able to choose with whom you share what, and that is what the
|
||||||
following sites aim to do.
|
following sites aim to do.
|
||||||
|
|
@ -4751,12 +4752,12 @@ categories:
|
||||||
|
|
||||||
- name: nostr
|
- name: nostr
|
||||||
description: |
|
description: |
|
||||||
nostr stands for Notes and other stuff transmitted by relays.
|
nostr stands for Notes and other stuff transmitted by relays.
|
||||||
It is an open protocol, not merely a platform.
|
It is an open protocol, not merely a platform.
|
||||||
This distinction enables truly censorship-resistant and global value-for-value publishing on the web.
|
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,
|
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
|
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.
|
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
|
url: https://github.com/nostr-protocol/nostr
|
||||||
github: https://github.com/nostr-protocol
|
github: https://github.com/nostr-protocol
|
||||||
|
|
||||||
|
|
@ -4875,7 +4876,7 @@ categories:
|
||||||
then [Listed.to](https://listed.to) is a public blogging platform with
|
then [Listed.to](https://listed.to) is a public blogging platform with
|
||||||
strong privacy features.
|
strong privacy features.
|
||||||
It lets you publish posts directly through the Standard Notes app or web interface.
|
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).
|
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?
|
Want to write a simple text post and promote it yourself?
|
||||||
|
|
@ -4957,7 +4958,7 @@ categories:
|
||||||
url: https://newpipe.schabi.org
|
url: https://newpipe.schabi.org
|
||||||
description: An open source, privacy-respecting YouTube client for Android.
|
description: An open source, privacy-respecting YouTube client for Android.
|
||||||
# tosdrId: 2568
|
# tosdrId: 2568
|
||||||
- name: FreeTube
|
- name: FreeTube
|
||||||
url: https://freetubeapp.io
|
url: https://freetubeapp.io
|
||||||
description: |
|
description: |
|
||||||
An open source YouTube client for Windows, MacOS and Linux, providing
|
An open source YouTube client for Windows, MacOS and Linux, providing
|
||||||
|
|
@ -5087,7 +5088,7 @@ categories:
|
||||||
|
|
||||||
- name: Video Editors
|
- name: Video Editors
|
||||||
alternativeTo: ['adobe premiere pro', 'final cut pro', 'davinci resolve', 'imovie', 'sony vegas pro']
|
alternativeTo: ['adobe premiere pro', 'final cut pro', 'davinci resolve', 'imovie', 'sony vegas pro']
|
||||||
services:
|
services:
|
||||||
- name: Shotcut
|
- name: Shotcut
|
||||||
followWith: Windows, Mac OS, Linux
|
followWith: Windows, Mac OS, Linux
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -5152,7 +5153,7 @@ categories:
|
||||||
github: NatronGitHub/Natron
|
github: NatronGitHub/Natron
|
||||||
icon: https://natrongithub.github.io/img/Natron_icon.svg
|
icon: https://natrongithub.github.io/img/Natron_icon.svg
|
||||||
openSource: true
|
openSource: true
|
||||||
|
|
||||||
- name: Audio Editors & Recorders
|
- name: Audio Editors & Recorders
|
||||||
alternativeTo: ['adobe audition', 'garageband', 'fl studio', 'ableton live']
|
alternativeTo: ['adobe audition', 'garageband', 'fl studio', 'ableton live']
|
||||||
services:
|
services:
|
||||||
|
|
@ -5163,16 +5164,16 @@ categories:
|
||||||
great free alternative to Adobe Audition.
|
great free alternative to Adobe Audition.
|
||||||
Features recording from real and virtual devices,
|
Features recording from real and virtual devices,
|
||||||
import/export to a wide range of formats, high-quality processing
|
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.
|
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
|
also supports cusotm macros and many scripting options
|
||||||
url: https://www.audacityteam.org
|
url: https://www.audacityteam.org
|
||||||
github: audacity/audacity
|
github: audacity/audacity
|
||||||
icon: https://www.audacityteam.org/_astro/Audacity_Logo.63b57726.svg
|
icon: https://www.audacityteam.org/_astro/Audacity_Logo.63b57726.svg
|
||||||
openSource: true
|
openSource: true
|
||||||
tosdrId: 4516
|
tosdrId: 4516
|
||||||
|
|
||||||
- name: Casting & Streaming
|
- name: Casting & Streaming
|
||||||
alternativeTo: ['xsplit', 'streamlabs obs', 'twitch studio', 'wirecast']
|
alternativeTo: ['xsplit', 'streamlabs obs', 'twitch studio', 'wirecast']
|
||||||
services:
|
services:
|
||||||
|
|
@ -5189,11 +5190,11 @@ categories:
|
||||||
icon: https://obsproject.com/assets/images/new_icon_small-r.png
|
icon: https://obsproject.com/assets/images/new_icon_small-r.png
|
||||||
openSource: true
|
openSource: true
|
||||||
tosdrId: 4227
|
tosdrId: 4227
|
||||||
|
|
||||||
- name: Screenshot Tools
|
- name: Screenshot Tools
|
||||||
alternativeTo: ['snagit', 'greenshot', 'lightshot', 'gyazo', 'sharex']
|
alternativeTo: ['snagit', 'greenshot', 'lightshot', 'gyazo', 'sharex']
|
||||||
services: []
|
services: []
|
||||||
|
|
||||||
- name: 3D Graphics
|
- name: 3D Graphics
|
||||||
alternativeTo: ['blender', 'autodesk maya', 'cinema 4d', '3ds max', 'sketchup']
|
alternativeTo: ['blender', 'autodesk maya', 'cinema 4d', '3ds max', 'sketchup']
|
||||||
services:
|
services:
|
||||||
|
|
@ -5219,7 +5220,7 @@ categories:
|
||||||
url: https://wings3d.com
|
url: https://wings3d.com
|
||||||
github: dgud/wings
|
github: dgud/wings
|
||||||
icon: https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Wings3d.png/120px-Wings3d.png
|
icon: https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Wings3d.png/120px-Wings3d.png
|
||||||
|
|
||||||
- name: Animation
|
- name: Animation
|
||||||
alternativeTo: ['adobe after effects', 'animate cc', 'toon boom harmony', 'moho (anime studio)', 'pencil2d']
|
alternativeTo: ['adobe after effects', 'animate cc', 'toon boom harmony', 'moho (anime studio)', 'pencil2d']
|
||||||
services:
|
services:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,2 @@
|
||||||
PyYAML==6.0.1
|
PyYAML==6.0.1
|
||||||
requests==2.31.0
|
jsonschema==4.23.0
|
||||||
jsonschema
|
|
||||||
pyyaml
|
|
||||||
termcolor
|
|
||||||
|
|
|
||||||
|
|
@ -22,23 +22,23 @@
|
||||||
"name": { "type": "string" },
|
"name": { "type": "string" },
|
||||||
"description": { "type": "string" },
|
"description": { "type": "string" },
|
||||||
"url": { "type": "string" },
|
"url": { "type": "string" },
|
||||||
"github": { "type": "string", "nullable": true },
|
"github": { "type": ["string", "null"] },
|
||||||
"icon": { "type": "string", "nullable": true },
|
"icon": { "type": ["string", "null"] },
|
||||||
"followWith": { "type": "string", "nullable": true },
|
"followWith": { "type": ["string", "null"] },
|
||||||
"securityAudited": { "type": "boolean", "nullable": true },
|
"securityAudited": { "type": ["boolean", "null"] },
|
||||||
"openSource": { "type": "boolean", "nullable": true },
|
"openSource": { "type": ["boolean", "null"] },
|
||||||
"acceptsCrypto": { "type": "boolean", "nullable": true },
|
"acceptsCrypto": { "type": ["boolean", "null"] },
|
||||||
"tosdrId": { "type": "number", "nullable": true },
|
"tosdrId": { "type": ["number", "null"] },
|
||||||
"iosApp": { "type": "string", "nullable": true },
|
"iosApp": { "type": ["string", "null"] },
|
||||||
"androidApp": { "type": "string", "nullable": true },
|
"androidApp": { "type": ["string", "null"] },
|
||||||
"discordInvite": { "type": "string", "nullable": true },
|
"discordInvite": { "type": ["string", "null"] },
|
||||||
"subreddit": { "type": "string", "nullable": true }
|
"subreddit": { "type": ["string", "null"] }
|
||||||
},
|
},
|
||||||
"required": ["name", "description", "url"],
|
"required": ["name", "description", "url"],
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"intro": { "type": "string", "nullable": true },
|
"intro": { "type": ["string", "null"] },
|
||||||
"notableMentions": {
|
"notableMentions": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
|
|
@ -54,16 +54,20 @@
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ "type": "string" }
|
{ "type": "string" },
|
||||||
],
|
{ "type": "null" }
|
||||||
"nullable": true
|
]
|
||||||
},
|
},
|
||||||
"furtherInfo": { "type": "string", "nullable": true },
|
"furtherInfo": { "type": ["string", "null"] },
|
||||||
"wordOfWarning": { "type": "string", "nullable": true },
|
"wordOfWarning": { "type": ["string", "null"] },
|
||||||
"alternativeTo": {
|
"alternativeTo": {
|
||||||
"type": "array",
|
"oneOf": [
|
||||||
"items": { "type": "string" },
|
{
|
||||||
"nullable": true
|
"type": "array",
|
||||||
|
"items": { "type": "string" }
|
||||||
|
},
|
||||||
|
{ "type": "null" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "services"],
|
"required": ["name", "services"],
|
||||||
|
|
|
||||||
|
|
@ -1,85 +1,112 @@
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import logging
|
|
||||||
import yaml
|
import yaml
|
||||||
from termcolor import colored
|
|
||||||
from jsonschema import Draft7Validator
|
from jsonschema import Draft7Validator
|
||||||
|
|
||||||
# Configure Logging
|
# Paths (relative to project root)
|
||||||
LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper()
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
logging.basicConfig(level=LOG_LEVEL)
|
DATA_PATH = os.path.join(PROJECT_ROOT, "awesome-privacy.yml")
|
||||||
logger = logging.getLogger(__name__)
|
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
|
def resolve_path(data, path_parts):
|
||||||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
"""Walk the data along path_parts, replacing indices with 'name' values."""
|
||||||
awesome_privacy_path = os.path.join(project_root, 'awesome-privacy.yml')
|
segments = []
|
||||||
schema_path = os.path.join(project_root, 'lib/schema.json')
|
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
|
def load_yaml(path):
|
||||||
# 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")
|
|
||||||
try:
|
try:
|
||||||
with open(yaml_path, 'r') as file:
|
with open(path, "r") as f:
|
||||||
return yaml.safe_load(file)
|
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:
|
except yaml.YAMLError as e:
|
||||||
loggy(f"Failed to load YAML: {e}", "error")
|
print(red(f"Failed to parse YAML: {e}"), file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(EXIT_RUNTIME_ERROR)
|
||||||
|
|
||||||
|
|
||||||
# Loads a given JSON Schema file and returns the data
|
def load_schema(path):
|
||||||
def load_schema(schema_path: str):
|
|
||||||
loggy(f"Loading JSON Schema from {schema_path}", "info")
|
|
||||||
try:
|
try:
|
||||||
with open(schema_path, 'r') as file:
|
with open(path, "r") as f:
|
||||||
return json.load(file)
|
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:
|
except json.JSONDecodeError as e:
|
||||||
loggy(f"Failed to load JSON Schema: {e}", "error")
|
print(red(f"Failed to parse JSON schema: {e}"), file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(EXIT_RUNTIME_ERROR)
|
||||||
|
|
||||||
|
|
||||||
# Validates the given YAML data against the given JSON Schema
|
def validate(data, schema):
|
||||||
def validate_yaml(data, schema):
|
|
||||||
loggy("Beginning validation", "info")
|
|
||||||
validator = Draft7Validator(schema)
|
validator = Draft7Validator(schema)
|
||||||
errors = sorted(validator.iter_errors(data), key=lambda e: e.path)
|
errors = sorted(validator.iter_errors(data), key=lambda e: list(e.path))
|
||||||
if errors:
|
formatted = []
|
||||||
for error in errors:
|
for error in errors:
|
||||||
error_location = "->".join(map(str, error.path))
|
location = resolve_path(data, list(error.path))
|
||||||
loggy(f"Validation error: {error.message} (at {error_location})", "warning")
|
formatted.append(f"{location}: {error.message}")
|
||||||
return False
|
return formatted
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
# Main method
|
|
||||||
def main():
|
def main():
|
||||||
loggy("Starting...", "info")
|
data = load_yaml(DATA_PATH)
|
||||||
yaml_data = load_yaml(awesome_privacy_path)
|
schema = load_schema(SCHEMA_PATH)
|
||||||
schema = load_schema(schema_path)
|
errors = validate(data, schema)
|
||||||
|
|
||||||
if validate_yaml(yaml_data, schema):
|
if errors:
|
||||||
loggy("Validation successful!", "success")
|
shown = errors[:MAX_ERRORS]
|
||||||
sys.exit(0)
|
for msg in shown:
|
||||||
else:
|
print(red("ERROR") + " " + msg, file=sys.stderr)
|
||||||
loggy("Validation failed.", "error")
|
if len(errors) > MAX_ERRORS:
|
||||||
sys.exit(1)
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue