update(blog)!: Proton Wallet review (#2750)

This commit is contained in:
Jonah Aragon 2024-09-07 13:54:21 -05:00
parent a334e449cb
commit a2528d9d2c
No known key found for this signature in database
16 changed files with 509 additions and 10 deletions

View File

@ -25,7 +25,7 @@ authors:
avatar: https://github.com/freddy-m.png
jonah:
name: Jonah Aragon
description: Team Member
description: Project Director
avatar: https://github.com/jonaharagon.png
mastodon:
username: jonah

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

View File

@ -7,3 +7,20 @@
He is also known for his work on the Techlore YouTube channel, including the Techlore Talks podcast he co-hosts.
[:simple-mastodon: @jonah@neat.computer](https://mastodon.neat.computer/@jonah "@jonah@neat.computer"){ .md-button rel=me }
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Jonah Aragon",
"jobTitle": "Project Director",
"url": "https://www.privacyguides.org/articles/author/jonah/",
"image": "https://www.privacyguides.org/articles/assets/external/github.com/jonaharagon.png.jpg",
"sameAs": [
"https://www.jonaharagon.com",
"https://shop.jonaharagon.com",
"https://mastodon.neat.computer/@jonah"
],
"description": "Jonah Aragon is the Project Director and staff writer at Privacy Guides."
}
</script>

View File

@ -0,0 +1,128 @@
---
title: "Proton Wallet Review: Is Proton Losing Touch?"
date:
created: 2024-09-08
categories:
- Reviews
authors:
- jonah
links:
- Cryptocurrency: https://www.privacyguides.org/en/cryptocurrency/
tags:
- Cryptocurrency
license: BY-SA
preview:
logo: theme/assets/img/cryptocurrency/proton-wallet.svg
review:
type: WebApplication
category: FinanceApplication
subcategory: Cryptocurrency Wallet
name: Proton Wallet
price: 0
website: https://proton.me/wallet
rating: 2
pros:
- Secure, non-custodial option for Proton users.
cons:
- Only supports Bitcoin, a non-private cryptocurrency.
- No support for Lightning or CoinJoin.
- iOS app still in beta.
---
![Proton Wallet logo](../assets/img/cryptocurrency/proton-wallet.svg){ align=right itemprop="image" }
Proton, the Swiss creators of privacy-focused products like [Proton Mail](https://www.privacyguides.org/en/email/) and ProtonVPN, recently released the latest product in their ever-growing lineup: **Proton Wallet**. [Announced](https://discuss.privacyguides.net/t/introducing-proton-wallet-a-safer-way-to-hold-bitcoin/19636) at the end of July 2024, it promotes itself as "an easy-to-use, self-custodial" Bitcoin wallet that will ostensibly make financial freedom more attainable for everyone.<!-- more -->
!!! info inline "Side info"
- Proton Wallet's [Privacy Policy](https://proton.me/wallet/privacy-policy)
- This review was conducted with the reviewer's personal Proton Visionary account. Proton was not contacted prior to this publication.
It may well be that Proton Wallet is the easiest way to start using Bitcoin, but is a Bitcoin wallet the solution people need to improve their financial privacy?
## A cryptocurrency primer
Contrary to popular belief, [cryptocurrency](https://www.privacyguides.org/en/cryptocurrency/) is not an inherently private transactional system.
The vast majority of cryptocurrency, including Bitcoin, uses a transparent and public blockchain as the ledger for all transactions. This means that anyone you've transacted with or who knows your wallet's public address can trivially trace all of your past transactions, and monitor all of your future transactions at any time.
This is a huge problem for Proton Wallet, because Bitcoin is the **only** cryptocurrency it supports. Furthermore, Proton Wallet doesn't support the few privacy-enhancing additions to Bitcoin that do exist, like CoinJoin or even the Lightning Network. While these technologies still don't bring Bitcoin close to the levels of privacy attainable with some alternatives like Monero, to see them lacking in a product from a privacy-centric company like Proton is extremely disappointing.
Proton has claimed in a few interviews that they chose Bitcoin because of its mass appeal, and it's certainly true that Bitcoin has the mind share and market share to beat out any other cryptocurrency, but the *most popular* option isn't always the *best* option.
Had Proton Wallet added support for Monero or a similarly private cryptocurrency, they could have single-handedly boosted a financial system that is *actually* private by default by a significant degree. In my eyes, failing to do so in favor of the market leader is an unfortunate step back from their "privacy by default" mantra.
## Using the app
Proton Wallet *is* in beta, like many of Proton's products are when newly released, and available via the web, an Android app, and an iOS [TestFlight](https://testflight.apple.com/join/6OIcXtQN).
![Proton wallet registration page](../assets/images/proton-wallet-review/1.png)
Creating your wallet is a simple process, after registering you'll be asked to choose a name for your wallet and a default currency. You can also optionally set a passphrase to secure your account. Note that this isn't merely a passphrase securing your account on Proton's servers beyond your usual account credentials, it's a [BIP39 extension word](https://en.bitcoin.it/wiki/Seed_phrase#Two-factor_seed_phrases), meaning that if you lose it your wallet will be completely unrecoverable, **even if** you back up your 12 word seed phrase.
![Proton wallet setup page](../assets/images/proton-wallet-review/2.png)
The default currency here isn't the currency being *stored* in Proton Wallet. It is just used to show you the current conversion rate between Bitcoin and your local currency.
Once you're in, Proton Wallet is fairly straightforward. In fact, there's not much to explore beyond finding your wallet address and buying Bitcoin. Clicking the **Recieve** button brings up a panel which shows your address and allows you to generate a new one on the fly. When you generate a new address, all of your previous addresses will continue to work, but are no longer displayed anywhere.
![Proton wallet address QR code and text displayed in sidebar](../assets/images/proton-wallet-review/3.png)
Buying Bitcoin is simple as well. Proton is working with two providers, Banxa and Ramp, and if you're in the United States like I am both are available, so you can choose the one with the best exchange rate to go with. Before you purchase, Proton Wallet asks you for your current country, so that will determine which providers it's possible to use.
There's no private payment methods though, you're stuck with credit card, Google Pay, or Apple Pay. The purchase experience isn't quite seamless either, as it redirects you to either banxa.com or ramp.network to perform the actual transaction. Everything is pre-filled with your Proton Wallet information however, so it isn't a huge problem.
## "Bitcoin via Email"
The flagship feature of Proton Wallet is something they call **Bitcoin via Email**, which integrates with Proton Mail to allow you to send Bitcoin to any email address. Opening your wallet settings lets you enable Proton's *Receive Bitcoin via Email* feature, which allows other Proton Wallet users to send Bitcoin to your account with just your Proton Mail address.
![Proton wallet receive Bitcoin via email settings page](../assets/images/proton-wallet-review/4.png)
If you have multiple addresses on your Proton account, such as aliases or addresses on a custom domain, only one address can be linked to your wallet. This can be a bit annoying for people who have given out different Proton addresses to others in the past, like if you gave out your @protonmail.com address to some people, before later migrating to @proton.me when that domain became available.
On the other hand, if you have aliases for different projects, this is a great way to keep Bitcoin payments to each address separate. If you have your personal email and a business alias for example, you can link your personal email to your primary wallet and create a second wallet to link your business alias to, thus keeping your personal and business transactions separate.
Proton says that you can "create as many wallets as your Proton Wallet plan allows," but the exact limits are not very clear at the moment. This may become clearer as Proton Wallet exits its beta status.
Sending Bitcoin to an email address is as simple as it is in mainstream payment apps like Venmo or CashApp, which is great. You can even include a memo with your transaction, and the transaction appears on the recipient's side very quickly. However, it can take a few hours or more for a transaction to actually complete and be usable by the recipient, so all they'll be able to do is monitor its progress in the meantime. This can be sped up by choosing a higher "network fee" when sending the payment, which costs more Bitcoin as the name would suggest.
I'm not convinced this is particularly revolutionary though. Many Bitcoin wallets have streamlined the process of exchanging address information with other people with methods like QR codes, which are likely going to be more widely used than email in today's mobile-first world. Being able to replace Bitcoin addresses with emails fairly seamlessly *is* nice, but is it nice enough to warrant the entire Proton Wallet product? I'm not so sure.
## What else sets it apart?
There isn't much separating Proton Wallet from the existing options on the market. It is a *non-custodial* wallet, meaning that you control the private keys rather than Proton. This is a huge step-up in security compared to keeping your Bitcoin in an online exchange like Coinbase, but it isn't a big differentiator from other software wallets where non-custodial key storage is typically the norm.
Besides that, and Bitcoin via Email, if you visit Proton's website to see how else they differentiate themselves the best third reason they could muster up is:
> Our business is privacy: Proton isn't a crypto company — we're a privacy company that wants to empower everyone to use Bitcoin securely and privately.
Unfortunately for Proton, this doesn't quite ring true when it comes to Proton Wallet. When it launched in 2014, Proton Mail was revolutionary in the email space. Encrypted email providers already existed, but Proton offered something different: Proton brought a good user experience to an interoperable encryption standard, PGP. While everyone else in the email space was rolling their own password-protected web portals to secure messages or simply delivering emails in plaintext, Proton built a user-friendly platform that actually improved the email ecosystem at large in the process.
Proton's leadership thinks they can do for cryptocurrency what they once did for email, but there's a clear difference between then and now. Proton Mail had privacy and security ready to go from the beginning, but Proton Wallet simply meets the status quo.
## Why does this exist?
Proton Wallet is in a strange position. I've spoken to a few sources who suggest that privacy features like CoinJoin, which can mix Bitcoin in order to better anonymize transactions, were intended to be included at launch. The [crackdown](https://bitcoinmagazine.com/legal/samourai-wallet-breaking-down-dangerous-precedents) on the ill-fated Samouri Wallet project by U.S. authorities last April certainly put a damper on privacy in the Bitcoin space, and likely made Proton wary of introducing such features to the public.
Proton suggests this themselves, stating on their [website](https://proton.me/wallet/bitcoin-guide-for-newcomers):
> Coinjoin is considered the best solution for improving blockchain privacy. It works by mixing your BTC with other users BTC in a collaborative self-custodial transaction where you get back the same amount of BTC that you put in but on a different address that cannot be easily linked to your previous address. However, in 2024, in what many consider to be a regulatory overreach and attack on privacy, some of these Coinjoin services have been declared illegal in the US and EU. The future of financial privacy may therefore be decided by ongoing litigation in the next decade and privacy advocates should support these efforts.
This situation likely soured Proton on other privacy-friendly cryptocurrencies like Monero as well. I get it, financial privacy is an extremely challenging task for any company to take on. We can't expect Proton to take on the risk of offering a completely anonymous payment service in the current legal climate, but it begs the question: why enter the financial space at all?
Proton Wallet seems like a product that doesn't know its own place in the world. Is it meant to save us from the tyranny of payment processors like PayPal who can freeze your funds at a whim? Proton certainly thinks so, having faced that exact problem themselves during their original 2014 crowdfunding campaign. But in that case, is Bitcoin the actual solution to this problem, or is it just a stopgap fix that Proton happened to latch on to way back in 2014 when Bitcoin was more *in vogue* and there were few competitors?
Today, there are many alternatives to Bitcoin which are safer to store your money in while remaining protected from intrusive fintech companies like PayPal. Stablecoins like USDC can be traded on multiple cryptocurrency networks without the need for middlemen payment processors, and can be exchanged at a variety of exchanges with the huge benefit of having *significantly* less risk than Bitcoin, theoretically no risk at all. Support for USDC or a similar technology would go a long way towards enabling *usable* cryptocurrency transactions for everyday users, even though USDC doesn't have any additional privacy protections either.
Or, was Bitcoin chosen to give us independence from fiat currency, including stablecoins, entirely? Maybe so, but is that something we actually want? Prepping for a worldwide market collapse is perhaps a bit of a fool's errand. If the US Dollar and other economies failed overnight, I think we would all have a lot more problems than Bitcoin is going to solve for us. Bitcoin is a poor store of value to serve as an alternative to traditional currency anyway. Any asset which can gain or lose half its purchasing power on any given day of the week simply can't function as a viable medium of exchange, meaning it's virtually useless for day-to-day transactions.
However, if Proton Wallet wasn't meant for all that, if it was simply meant to bring privacy to Bitcoin, then it's certainly a failure. Proton hasn't taken any risks with this product, meaning it's really only good for satisfying a singular belief: That Bitcoin is just inherently good, and anything to promote Bitcoin is inherently good as well. I don't share these fanatical beliefs of *Bitcoin maximalists*, however, when Bitcoin is demonstrably lacking in a wide variety of ways.
## Conclusion
Personally, I'm a bit of a cryptocurrency pessimist in general, but I can see some appeal for the technology in very specific areas. Unfortunately, Proton Wallet doesn't seem to fit in to a useful niche in any meaningful way. The functionality it does support is extremely basic, even by Bitcoin standards, and it simply doesn't provide enough value over the existing marketplace.
If you're an existing Proton user simply looking for a place to store some Bitcoin *you already have* sitting around, Proton Wallet might be perfectly adequate. For everyone else, I don't see this product being too useful. Bitcoin is still far too volatile to be a solid investment or used as a safe store of value if you crave financial independence and sovereignty, and Proton Wallet simply isn't adequate for [paying for things privately online](https://www.privacyguides.org/en/advanced/payments/).
There is some potential with Proton Wallet. Personally, I would like to see [support for Monero](https://protonmail.uservoice.com/forums/960668-proton-wallet/suggestions/48672359-support-monero), a cryptocurrency that has privacy features built-in by default. There is also the possibility of Proton expanding into the *traditional* finance space with features like a digital wallet for credit/debit cards, card aliasing à la [privacy.com](https://www.privacyguides.org/en/financial-services/#privacycom-us), and tap to pay within their mobile apps. A third-party alternative to Apple Pay and Google Wallet, and for the first time ever such a product could actually be viable: It's always been possible on Android, but just last month Apple announced the possibility for [iOS developers to use NFC](https://www.apple.com/newsroom/2024/08/developers-can-soon-offer-in-app-nfc-transactions-using-the-secure-element/) to facilitate payments outside of Apple Wallet. This presents a golden opportunity for Proton Wallet to be the first cross-platform digital wallet, if they can deliver.
Alas, none of this is available in Proton Wallet today, and that's all that really counts.

View File

@ -12,7 +12,6 @@ schema:
- https://twitter.com/privacy_guides
- https://github.com/privacyguides
- https://www.wikidata.org/wiki/Q111710163
- https://opencollective.com/privacyguides
- https://www.youtube.com/@privacyguides
- https://mastodon.neat.computer/@privacyguides
---

View File

@ -1,6 +1,6 @@
---
meta_title: "Privacy Guides: Independent Privacy & Security Resources"
description: "The most popular & trustworthy non-profit website to find privacy tools and learn about protecting your digital life. Ad & affiliate free, high quality reviews."
description: "Privacy Guides is the most popular & trustworthy non-profit resource to find privacy tools and learn about protecting your digital life. Ad & affiliate free, high quality reviews."
template: home.html
social:
cards_layout: home
@ -14,13 +14,12 @@ schema:
"@type": Organization
"@id": https://www.privacyguides.org/
name: Privacy Guides
url: https://www.privacyguides.org/en/about/
url: https://www.privacyguides.org/
logo: https://www.privacyguides.org/en/assets/brand/logos/png/square/pg-yellow.png
sameAs:
- https://twitter.com/privacy_guides
- https://github.com/privacyguides
- https://www.wikidata.org/wiki/Q111710163
- https://opencollective.com/privacyguides
- https://www.youtube.com/@privacyguides
- https://mastodon.neat.computer/@privacyguides
-

View File

@ -117,7 +117,7 @@ theme:
- search.highlight
extra_css:
- assets/stylesheets/extra.css?v=20240802
- assets/stylesheets/extra.css?v=20240829
watch:
- theme

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 128 128" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(4.57144,0,0,4.57144,0,-18.942)">
<path d="M0.004,27.272C0.004,28.904 1.327,30.226 2.958,30.226L25.046,30.226C26.677,30.226 28,28.904 28,27.272L28,17.818C28,11.291 22.709,6 16.182,6L2.958,6C1.327,6 0.004,7.323 0.004,8.954L0.004,18.263L5.84,18.263C7.945,18.263 9.651,20.086 9.651,22.335C9.651,24.583 7.945,26.406 5.84,26.406L0.004,26.406L0.004,27.272Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
<path d="M5.546,20.181C6.743,20.181 7.713,21.151 7.713,22.348C7.713,23.544 6.743,24.514 5.546,24.514C4.35,24.514 3.38,23.544 3.38,22.348C3.38,21.151 4.35,20.181 5.546,20.181Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
<path d="M0,27.333C0,28.964 1.323,30.287 2.954,30.287L22.091,30.287L22.091,18.863C22.091,13.968 18.123,10 13.228,10L0,10L0,18.263L5.84,18.263C7.945,18.263 9.651,20.086 9.651,22.335C9.651,24.583 7.945,26.406 5.84,26.406L0,26.406L0,27.333Z" style="fill:rgb(109,74,255);fill-rule:nonzero;"/>
<path d="M0,27.333C0,28.964 1.323,30.287 2.954,30.287L22.091,30.287L22.091,18.863C22.091,13.968 18.123,10 13.228,10L0,10L0,18.263L5.84,18.263C7.945,18.263 9.651,20.086 9.651,22.335C9.651,24.583 7.945,26.406 5.84,26.406L0,26.406L0,27.333Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
<path d="M5.546,20.181C6.743,20.181 7.713,21.151 7.713,22.348C7.713,23.544 6.743,24.514 5.546,24.514C4.35,24.514 3.38,23.544 3.38,22.348C3.38,21.151 4.35,20.181 5.546,20.181Z" style="fill:rgb(109,74,255);fill-rule:nonzero;"/>
<path d="M5.546,20.181C6.743,20.181 7.713,21.151 7.713,22.348C7.713,23.544 6.743,24.514 5.546,24.514C4.35,24.514 3.38,23.544 3.38,22.348C3.38,21.151 4.35,20.181 5.546,20.181Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
<path d="M8.625,25.114C7.929,25.909 6.939,26.406 5.84,26.406L0,26.406L0,27.272C0,28.903 1.323,30.226 2.954,30.226L4.19,30.226L8.698,25.105L8.625,25.114Z" style="fill:rgb(255,187,147);fill-rule:nonzero;"/>
</g>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(34.6373,13.4926,-13.4926,34.6373,-3.51386,8.81943)"><stop offset="0" style="stop-color:rgb(149,122,253);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,198,198);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(34.6373,13.4926,-13.4926,34.6373,-3.51386,8.81943)"><stop offset="0" style="stop-color:rgb(149,122,253);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(255,198,198);stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-10.7436,21.8612,-21.8612,-10.7436,20.8426,13.1146)"><stop offset="0" style="stop-color:rgb(250,82,142);stop-opacity:0"/><stop offset="0.15" style="stop-color:rgb(250,82,142);stop-opacity:0"/><stop offset="0.72" style="stop-color:rgb(255,128,101);stop-opacity:0.9"/><stop offset="1" style="stop-color:rgb(255,165,31);stop-opacity:0.9"/></linearGradient>
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-10.7436,21.8612,-21.8612,-10.7436,20.8426,13.1146)"><stop offset="0" style="stop-color:rgb(250,82,142);stop-opacity:0"/><stop offset="0.15" style="stop-color:rgb(250,82,142);stop-opacity:0"/><stop offset="0.72" style="stop-color:rgb(255,128,101);stop-opacity:0.9"/><stop offset="1" style="stop-color:rgb(255,165,31);stop-opacity:0.9"/></linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -522,3 +522,8 @@ path[d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-
width: 100%;
padding: 1em !important;
}
.pg-proconlist {
list-style-type: disc;
padding-inline-start: 1em;
}

314
theme/blog-post.html Normal file
View File

@ -0,0 +1,314 @@
<!--
Copyright (c) 2024 Jonah Aragon <jonah@triplebit.net>
Copyright (c) 2016-2024 Martin Donath <martin.donath@squidfunk.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-->
{% extends "main.html" %}
{% import "partials/nav-item.html" as item with context %}
<!-- Page content -->
{% block container %}
<div class="md-content md-content--post" data-md-component="content" itemscope itemtype="https://schema.org/Article">
<meta itemprop="headline" content="{{ page.title | striptags }}" />
<meta itemprop="isAccessibleForFree" content="True" />
<meta itemprop="isFamilyFriendly" content="True" />
{% if config.theme.language == "en" %}
<meta itemprop="inLanguage" content="en-US" />
{% endif %}
<span itemprop="publisher" itemscope itemtype="https://schema.org/Organization">
<meta itemprop="name" content="Privacy Guides" />
<meta itemprop="url" content="https://www.privacyguides.org/" />
<meta itemprop="sameAs" content="https://mastodon.neat.computer/@privacyguides" />
<meta itemprop="sameAs" content="https://twitter.com/privacy_guides" />
<meta itemprop="sameAs" content="https://github.com/privacyguides" />
<span itemprop="logo" itemscope itemtype="https://schema.org/ImageObject">
<meta itemprop="url" content="https://www.privacyguides.org/en/assets/brand/logos/png/square/pg-yellow.png" />
<meta itemprop="width" content="512" />
<meta itemprop="height" content="512" />
</span>
</span>
<link itemprop="publishingPrinciples" href="https://www.privacyguides.org/en/about/criteria/" />
<!-- Sidebar -->
<div
class="md-sidebar md-sidebar--post"
data-md-component="sidebar"
data-md-type="navigation"
>
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner md-post">
<nav class="md-nav md-nav--primary">
<!-- Back to overview link -->
<div class="md-post__back">
<div class="md-nav__title md-nav__container">
<a href="{{ page.parent.url | url }}" class=" md-nav__link">
{% include ".icons/material/arrow-left.svg" %}
<span class="md-ellipsis">
{{ lang.t("blog.index") }}
</span>
</a>
</div>
</div>
<!-- Post authors -->
{% if page.authors %}
<div class="md-post__authors md-typeset">
{% for author in page.authors %}
<div class="md-profile md-post__profile" itemprop="author" itemscope itemtype="https://schema.org/{{ author.type | default('Person') }}">
<span class="md-author md-author--long">
<img src="{{ author.avatar | url }}" alt="{{ author.name }}" />
</span>
<span class="md-profile__description">
<strong>
{% if author.url %}
<a itemprop="url" href="{{ author.url | url }}"><span itemprop="name">{{ author.name }}</span></a>
{% else %}
<span itemprop="name">{{ author.name }}</span>
{% endif %}
</strong>
<br />
<span {% if author.type is not defined -%}itemprop="jobTitle"{%- endif -%}>{{ author.description }}</span>
</span>
</div>
{% endfor %}
</div>
{% endif %}
<!-- Post metadata -->
<ul class="md-post__meta md-nav__list">
<li class="md-nav__item md-nav__item--section">
<div class="md-post__title">
<span class="md-ellipsis">
{{ lang.t("blog.meta") }}
</span>
</div>
<nav class="md-nav">
<ul class="md-nav__list">
<!-- Post date -->
<li class="md-nav__item">
<div class="md-nav__link" title="Date published">
{% include ".icons/material/calendar.svg" %}
<time
datetime="{{ page.config.date.created }}"
class="md-ellipsis"
itemprop="datePublished"
>
{{- page.config.date.created | date -}}
</time>
</div>
</li>
<!-- Post date updated -->
{% if page.config.date.updated %}
<li class="md-nav__item">
<div class="md-nav__link" title="Date last updated">
{% include ".icons/material/calendar-clock.svg" %}
<time
datetime="{{ page.config.date.updated }}"
class="md-ellipsis"
itemprop="dateModified"
>
{{- page.config.date.updated | date -}}
</time>
</div>
</li>
{% endif %}
<!-- Post categories -->
{% if page.categories %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/bookshelf.svg" %}
<span class="md-ellipsis">
{{ lang.t("blog.categories.in") }}
{% for category in page.categories %}
<a href="{{ category.url | url }}">
{{- category.title -}}
</a>
{%- if loop.revindex > 1 %}, {% endif -%}
{% endfor -%}
</span>
</div>
</li>
{% endif %}
<!-- Post readtime -->
{% if page.config.readtime %}
{% set time = page.config.readtime %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/clock-outline.svg" %}
<span class="md-ellipsis" itemprop="timeRequired">
{% if time == 1 %}
{{ lang.t("readtime.one") }}
{% else %}
{{ lang.t("readtime.other") | replace("#", time) }}
{% endif %}
</span>
</div>
</li>
{% endif %}
</ul>
</nav>
</li>
</ul>
<!-- Related links -->
{% if page.config.links %}
<ul class="md-post__meta md-nav__list">
<li class="md-nav__item md-nav__item--section">
<div class="md-post__title">
<span class="md-ellipsis">
{{ lang.t("blog.references") }}
</span>
</div>
<!-- Render related links -->
<nav class="md-nav">
<ul class="md-nav__list">
{% for nav_item in page.config.links %}
{% set path = "__ref_" ~ loop.index %}
{{ item.render(nav_item, path, 1) }}
{% endfor %}
</ul>
</nav>
</li>
</ul>
{% endif %}
<!-- Product review information -->
{% if page.meta.review %}
<ul class="md-post__meta md-nav__list" itemprop="about" itemscope itemtype="https://schema.org/{{ page.meta.review.type }}">
<meta itemprop="applicationCategory" content="{{ page.meta.review.category }}" />
<meta itemprop="applicationSubCategory" content="{{ page.meta.review.subcategory }}" />
<li class="md-nav__item md-nav__item--section">
<div class="md-post__title">
<span class="md-ellipsis">
<span itemprop="name">{{ page.meta.review.name }}</span> summary
</span>
<meta itemprop="alternateName" content="{{ page.meta.review.alternateName }}" />
</div>
<div class="md-nav">
<ul class="md-nav__list" itemprop="review" itemscope itemtype="https://schema.org/Review">
<li class="md-nav__item">
<span itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
<meta itemprop="bestRating" content="5" />
<meta itemprop="worstRating" content="0.5" />
<span class="md-nav__link" itemprop="ratingValue" content="{{ page.meta.review.rating }}" title="Rating: {{ page.meta.review.rating }} / 5">
{% for i in range(1, 6) %}
{% if i <= page.meta.review.rating %}
{% include ".icons/material/star.svg" %}
{% else %}
{% if i - 0.5 == page.meta.review.rating %}
{% include ".icons/material/star-half-full.svg" %}
{% else %}
{% include ".icons/material/star-outline.svg" %}
{% endif %}
{% endif %}
{% endfor %}
</span>
</span>
{% if page.authors %}
<span itemprop="author" itemscope itemtype="https://schema.org/Person">
{% set reviewAuthor = page.authors[0] %}
<meta itemprop="name" content="{{ reviewAuthor.name }}" />
<meta itemprop="url" content="{{ reviewAuthor.url | url }}" />
</span>
{% endif %}
</li>
<li class="md-nav__item">
<span class="md-nav__link">
<span itemprop="positiveNotes" itemscope itemtype="https://schema.org/ItemList">
<strong itemprop="name">Pros:</strong>
<span>
<ul class="pg-proconlist">
{% for pro in page.meta.review.pros %}
<li itemprop="itemListElement">{{ pro }}</li>
{% endfor %}
</ul>
</span>
</span>
</span>
</li>
<li class="md-nav__item">
<span class="md-nav__link">
<span itemprop="negativeNotes" itemscope itemtype="https://schema.org/ItemList">
<strong itemprop="name">Cons:</strong>
<span>
<ul class="pg-proconlist">
{% for con in page.meta.review.cons %}
<li itemprop="itemListElement">{{ con }}</li>
{% endfor %}
</ul>
</span>
</span>
</span>
</li>
</ul>
<ul class="md-nav__list">
<li class="md-nav__item">
<span class="md-nav__link">
<span itemprop="offers" itemscope itemtype="https://schema.org/Offer">
<strong>Price:</strong>
{% if page.meta.review.price == 0 %}
<span itemprop="price" content="0">Free</span>
{% else %}
<span itemprop="priceCurrency" content="USD">$</span><span itemprop="price" content="{{ page.meta.review.price }}">{{ page.meta.review.price }}</span>
{% endif %}
{% if page.meta.review.period %}
/ {{ page.meta.review.period }}
{% endif %}
</span>
</span>
</li>
<li class="md-nav__item">
<span class="md-nav__link">
<a itemprop="url" href="{{ page.meta.review.website }}"><em>{{ page.meta.review.website.rpartition("//")[-1].partition("/")[0] }}</em></a>
</span>
</li>
</ul>
</div>
</li>
</ul>
{% endif %}
</nav>
<!-- Table of contents, if integrated -->
{% if "toc.integrate" in features %}
{% include "partials/toc.html" %}
{% endif %}
</div>
</div>
</div>
<!-- Page content -->
<article class="md-content__inner md-typeset">
{% block content %}
{% include "partials/content.html" %}
{% endblock %}
</article>
</div>
{% endblock %}

View File

@ -8,6 +8,16 @@ definitions:
- &page_description >-
{{ page.meta.get("description", config.site_description) or "" }}
- &page_logo >-
{% if page.meta.preview and page.meta.preview.logo %}
{{- page.meta.preview.logo -}}
{% endif %}
- &page_icon >-
{%- if not page.meta.preview or not page.meta.preview.logo -%}
material/book-open-page-variant
{%- endif -%}
- &logo >-
theme/assets/brand/logos/svg/logo/privacy-guides-logo-notext-colorbg.svg
@ -72,11 +82,19 @@ layers:
- background:
color: "#FFD06F"
- size: { width: 512, height: 512 }
offset: { x: 600, y: 59 }
background:
image: *page_logo
- background:
color: "#FFD06F99"
# Page icon
- size: { width: 630, height: 630 }
offset: { x: 570, y: 0 }
icon:
value: material/book-open-page-variant
value: *page_icon
color: "#00000033"
# Logo

View File

@ -26,8 +26,6 @@
<meta name="viewport" content="width=device-width,initial-scale=1">
{% if page.meta and page.meta.description %}
<meta name="description" content="{{ page.meta.description }}">
{% elif config.site_description %}
<meta name="description" content="{{ config.site_description }}">
{% endif %}
{% if page.meta and page.meta.author %}
<meta name="author" content="{{ page.meta.author }}">

View File

@ -24,7 +24,7 @@
{% if page and page.meta and page.meta.cover %}
<div class="cover center-cropped">
<img src="{{ 'assets/img/cover/' | url }}{{ page.meta.cover }}" alt="">
<img itemprop="image" src="{{ 'assets/img/cover/' | url }}{{ page.meta.cover }}" alt="">
</div>
<h1>{{ page.title | d(config.site_name, true)}}</h1>
{% endif %}
@ -40,7 +40,9 @@
{% endif %}
<!-- Page content -->
<div itemprop="articleBody">
{{ page.content }}
</div>
<!-- Source file information -->
{% include "partials/source-file.html" %}