1
0
mirror of https://github.com/privacyguides/privacyguides.org.git synced 2025-07-16 08:22:44 +00:00

Compare commits

..

4 Commits

Author SHA1 Message Date
a2528d9d2c update(blog)!: Proton Wallet review (#2750) 2024-09-08 11:27:28 -05:00
a334e449cb fix: Remove Piped Being Able to Play Age Restricted Videos (#2746)
Signed-off-by: Daniel Gray <dngray@privacyguides.org>
2024-09-08 11:47:40 +09:30
574eedb875 update: Correct advice to hide OS info from network on GrapheneOS (#2742)
Signed-off-by: Freddy <freddy@privacyguides.org>
Signed-off-by: Daniel Gray <dngray@privacyguides.org>
2024-09-08 11:45:37 +09:30
ae68a612ef docs: Executive policy page (#2749)
Signed-off-by: Freddy <freddy@privacyguides.org>
Signed-off-by: blacklight447 <niek@privacyguides.org>
Signed-off-by: Daniel Gray <dngray@privacyguides.org>
2024-09-08 11:28:10 +09:30
24 changed files with 538 additions and 108 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

@ -0,0 +1,25 @@
---
title: Executive Policy
---
These are policies formally adopted by Privacy Guides' executive committee, and take precedence over all other statements expressed on this website.
The key words **must**, **must not**, **required**, **shall**, **shall not**, **should**, **should not**, **recommended**, **may**, and **optional** are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119).
## EP1: Freely-Provided Product Samples
*Our policy on accepting product samples for review was adopted September 7, 2024.*
=== "Current Version (1)"
- Privacy Guides **shall not** proactively reach out to vendors asking for product samples or review accounts.
- Privacy Guides **shall not** accept test/review accounts for subscription cloud services.
- Privacy Guides **may** accept freely-provided product samples for one-time purchase software applications which run locally, given they don't require a subscription for continued operation.
- Privacy Guides **may** accept freely-provided samples of hardware products.
- Privacy Guides **may** accept a freely-provided subscription service associated with a hardware product, if such a subscription/license is necessary to use the product.
- Privacy Guides **must not** enter into an agreement pertaining to our editorial opinion with the vendor in order to receive a sample or publish a review. All freely-provided items must be strictly "no strings attached."
- We **may** agree to return the product to the vendor following the review if requested.
- We **may** agree to a reasonable NDA, provided it has a clear embargo date that is lifted no more than 6 months in the future where the NDA completely no longer applies.
- We **should not** enter into any other agreement with the vendor not described here. Potential agreements not described here **must** be approved by the executive committee beforehand.
In all cases, whether we paid for the product independently or received a free sample from a vendor, how we obtained the product **must** be clearly documented in the background section of every article associated with the product.

View File

@ -68,7 +68,7 @@ GrapheneOS supports [sandboxed Google Play](https://grapheneos.org/usage#sandbox
By default, Android makes many network connections to Google to perform DNS connectivity checks, to sync with current network time, to check your network connectivity, and for many other background tasks. GrapheneOS replaces these with connections to servers operated by GrapheneOS and subject to their privacy policy. This hides information like your IP address [from Google](../basics/common-threats.md#privacy-from-service-providers), but means it is trivial for an admin on your network or ISP to see you are making connections to `grapheneos.network`, `grapheneos.org`, etc. and deduce what operating system you are using.
GrapheneOS provides the option to switch back to connecting to Google's servers for many of these background connections if you prefer, but it is far more robust/foolproof to use a [trusted VPN](../vpn.md) and enable Android's native VPN [kill switch](../os/android-overview.md#vpn-killswitch) to hide information like this from adversaries on your network.
If you want to hide information like this from an adversary on your network or ISP, you **must** use a [trusted VPN](../vpn.md) in addition to changing the connectivity check setting to **Standard (Google)**. It can be found in :gear: **Settings****Network & internet****Internet connectivity checks**. This option allows you to connect to Google's servers for connectivity checks, which, alongside the usage of a VPN, helps you blend in with a larger pool of Android devices.
### DivestOS

View File

@ -270,7 +270,7 @@ Piped requires JavaScript in order to function and there are a number of public
<div class="admonition tip" markdown>
<p class="admonition-title">Tip</p>
Piped is useful if you want to use [SponsorBlock](https://sponsor.ajay.app) without installing an extension or to access age-restricted content without an account. It does not provide privacy by itself, and we dont recommend logging into any accounts.
Piped is useful if you want to use [SponsorBlock](https://sponsor.ajay.app) without installing an extension. It does not provide privacy by itself, and we dont recommend logging into any accounts.
</div>

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

@ -132,7 +132,7 @@ We are testing a new feature that allows readers to better identify and understa
</div>
## Top 4 Private VPN Providers
## Top 3 Private VPN Providers
<details class="danger" markdown>
<summary>VPNs do not provide anonymity</summary>
@ -185,18 +185,6 @@ If you're looking for added **security**, you should always ensure you're connec
[Read Full Review :material-arrow-right-drop-circle:](vpn.md#ivpn)
- ![Windscribe logo](assets/img/vpn/mini/windscribe.svg){ .lg .middle .twemoji } **Windscribe**
---
- [x] **69+ Countries**
- [x] WireGuard Support
- [x] Monero Payments
- [x] Port Forwarding Support for paid plans
- [ ] No IPv6
[Read Full Review :material-arrow-right-drop-circle:](vpn.md#windscribe)
</div>
## Top 3 Private Email Providers

View File

@ -35,7 +35,6 @@ Our recommended providers use encryption, support WireGuard & OpenVPN, and have
| [Proton](#proton-vpn) | 112+ | :material-check:{ .pg-green } | :material-information-outline:{ .pg-blue } Partial Support | :material-alert-outline:{ .pg-orange } | Cash
| [IVPN](#ivpn) | 37+ | :material-check:{ .pg-green } | :material-alert-outline:{ .pg-orange } | :material-information-outline:{ .pg-blue } Outgoing Only | Monero, Cash
| [Mullvad](#mullvad) | 45+ | :material-check:{ .pg-green } | :material-alert-outline:{ .pg-orange } | :material-check:{ .pg-green } | Monero, Cash
| [Windscribe](#windscribe) | 69+ | :material-check:{ .pg-green } | :material-information-outline:{ .pg-blue } Paid plans only | :material-alert-outline:{ .pg-orange } | Monero
### Proton VPN
@ -273,84 +272,6 @@ Mullvad has published [App Store](https://apps.apple.com/app/id1488466513) and [
Mullvad is very transparent about which nodes they [own or rent](https://mullvad.net/en/servers). They use [ShadowSocks](https://shadowsocks.org) in their ShadowSocks + OpenVPN configuration, making them more resistant against firewalls with [Deep Packet Inspection](https://en.wikipedia.org/wiki/Deep_packet_inspection) trying to block VPNs. Supposedly, [China has to use a different method to block ShadowSocks servers](https://github.com/net4people/bbs/issues/22).
### Windscribe
<div class="admonition recommendation" markdown>
![Windscribe logo](assets/img/vpn/windscribe.svg#only-light){ align=right }
![Windscribe logo](assets/img/vpn/windscribe-dark.svg#only-dark){ align=right }
**Windscribe** is a Canadian-based VPN provider established in 2016. Windscribe offers a limited free tier, a more featured premium option, and a "Build-a-Plan" option that allows you to customize your subscription based on your choice of server locations and [add-ons](https://windscribe.com/knowledge-base/articles/what-is-the-difference-between-the-build-a-plan-and-regular-pro-plan).
[:octicons-home-16: Homepage](https://windscribe.com){ .md-button .md-button--primary }
[:octicons-eye-16:](https://windscribe.com/privacy){ .card-link title="Privacy Policy" }
[:octicons-info-16:](https://windscribe.com/knowledge-base){ .card-link title="Documentation" }
[:octicons-code-16:](https://github.com/windscribe){ .card-link title="Source Code" }
<details class="downloads" markdown>
<summary>Downloads</summary>
- [:simple-googleplay: Google Play](https://play.google.com/store/apps/details?id=com.windscribe.vpn)
- [:simple-appstore: App Store](https://apps.apple.com/app/id1129435228)
- [:simple-windows11: Windows](https://windscribe.com/download/?platform=desktop&os=windows)
- [:simple-apple: macOS](https://windscribe.com/download/?platform=desktop&os=macos)
- [:simple-linux: Linux](https://windscribe.com/download/?platform=desktop&os=linux)
</details>
</div>
#### :material-check:{ .pg-green } 69 Countries
Windscribe has [servers in 69 countries](https://windscribe.com/features/large-network) or 11 if you use their [free plan](https://windscribe.com/knowledge-base/articles/how-much-does-it-cost-to-use-windscribe).(1) Picking a VPN provider with a server nearest to you will reduce latency of the network traffic you send. This is because of a shorter route (less hops) to the destination.
{ .annotate }
1. Last checked: 2024-09-02
We also think it's better for the security of the VPN provider's private keys if they use [dedicated servers](https://en.wikipedia.org/wiki/Dedicated_hosting_service), instead of cheaper shared solutions (with other customers) such as [virtual private servers](https://en.wikipedia.org/wiki/Virtual_private_server).
#### :material-check:{ .pg-green } Independently Audited
Windscribe's desktop and mobile clients have been audited by TODO and published at TODO. The audit concluded:
> ?
Windscribe's current infrastructure has not been independently audited, however a pre-production audit of their upcoming infrastructure stack [has](https://github.com/privacyguides/privacyguides.org/pull/1312#issuecomment-1452262340) been completed. Their new infrastructure stack is scheduled to deploy in 2023 alongside published audits, and we will update the information here when those are made available.
#### :material-check:{ .pg-green } Open-Source Clients
As of June 2024, [Windscribe's applications are now open source](https://github.com/Windscribe).
#### :material-check:{ .pg-green } Accepts Monero
In addition to accepting credit/debit cards, PayPal and **local currencies**, Windscribe accepts **Monero**, Bitcoin, and a variety of other cryptocurrencies as payment.
#### :material-check:{ .pg-green } WireGuard Support
Windscribe [supports WireGuard](https://blog.windscribe.com/introducing-wireguard-76a1670700a6). [WireGuard](https://wireguard.com) is a newer protocol that uses state-of-the-art [cryptography](https://wireguard.com/protocol). Additionally, WireGuard aims to be simpler and more performant.
Windscribe offers a WireGuard [configuration file generator](https://windscribe.com/features/config-generators) for paid plans only.
#### :material-check:{ .pg-green } IPv6 Support
Windscribe's VPN servers [do not support](https://windscribe.com/knowledge-base/articles/does-windscribe-block-or-support-ipv6-traffic) IPv6 connections. Windscribe's official applications will automatically block all IPv6 traffic, so you don't have to worry about your IPv6 address being leaked, but you will not be able to connect to any IPv6-only sites, and you will not be able to connect to Windscribe from an IPv6-only network.
#### :material-alert-outline:{ .pg-info } Remote Port Forwarding
Ephemeral remote [port forwarding](https://en.wikipedia.org/wiki/Port_forwarding) is possible with a [Pro plan](https://windscribe.com/features/port-forwarding). For a permanent port forward, you need to purchase a [static IP](https://windscribe.com/staticips).
#### :material-check:{ .pg-green } Censorship Circumvention
Windscribe offers their [WStunnel](https://windscribe.com/knowledge-base/articles/what-is-the-wstunnel-protocol) and [Stealth](https://windscribe.com/knowledge-base/articles/What-Is-Stealth-Protocol) protocols, which help in situations where VPN protocols like OpenVPN or Wireguard are blocked.
#### :material-check:{ .pg-green } Mobile Clients
In addition to providing standard OpenVPN configuration files, Windscribe has mobile clients for [App Store](https://apps.apple.com/app/id1129435228) and [Google Play](https://play.google.com/store/apps/details?id=com.windscribe.vpn) which allow for easy connections to their servers.
#### :material-information-outline:{ .pg-blue } Additional Functionality
Windscribe offers [R.O.B.E.R.T.](https://windscribe.com/features/robert), a customizable server-side domain and IP blocking tool. They also offer static IP addresses, team accounts, and support for two-factor authentication.
## Criteria
<div class="admonition danger" markdown>

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

@ -445,6 +445,7 @@ nav:
- "about/donate.md"
- "about/contributors.md"
- "about/criteria.md"
- "about/executive-policy.md"
- "about/notices.md"
- "about/privacy-policy.md"
- "about/jobs.md"

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

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="128" height="128" version="1.1" viewBox="0 0 33.867 33.867" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-49.664 -79.868)"><g id="Ext" transform="matrix(.11289 0 0 .11289 49.664 79.868)" fill="none" fill-rule="evenodd"><g fill="#fff"><polygon points="263.96 150.17 226.1 150.17 226.1 88.02 197.04 88.02 180.31 104.65 180.31 150.17 121.75 150.17 121.75 104.65 105.02 88.02 75.521 88.02 75.521 150.17 38.098 150.17 71.504 71.335 150.92 38.098 230.33 71.335" fill-opacity=".23559"/><path d="m75.862 87.931v127.59h22.807c8.3272 0 16.909-2.2871 23.154-8.6617l29.039-29.838 29.252 29.838c6.2454 6.3746 14.614 8.6617 22.941 8.6617h22.807v-127.59h-28.947v93.339l-46.053-46.782-45.614 46.782v-93.339z"/><path id="Shape" d="M 240.83871,59.16129 150,22 59.16129,59.16129 22,150 59.16129,240.83871 150,278 240.83871,240.83871 278,150 Z M 256.25,256.25 150,300 43.75,256.25 0,150 43.75,43.75 150,0 256.25,43.75 300,150 Z"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 994 B

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="128" height="128" version="1.1" viewBox="0 0 33.867 33.867" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-39.596 -137.76)"><g id="Ext" transform="matrix(.11289 0 0 .11289 39.596 137.76)" fill="none" fill-rule="evenodd"><g fill="#000"><path id="Combined-Shape" d="m150.17 10.167 99.355 40.645 40.645 99.355-40.645 99.355-99.355 40.645-99.355-40.645-40.645-99.355 40.645-99.355zm0.74879 27.931-79.411 33.237-33.406 78.832h37.424v-62.147h29.499l16.731 16.631v45.516h58.557v-45.516l16.731-16.631h29.058v62.147h37.864l-33.633-78.832z" fill-opacity=".23559"/><path d="m75.862 87.931v127.59h22.807c8.3272 0 16.909-2.2871 23.154-8.6617l29.039-29.838 29.252 29.838c6.2454 6.3746 14.614 8.6617 22.941 8.6617h22.807v-127.59h-28.947v93.339l-46.053-46.782-45.614 46.782v-93.339z"/><path id="Shape" d="M 240.83871,59.16129 150,22 59.16129,59.16129 22,150 59.16129,240.83871 150,278 240.83871,240.83871 278,150 Z M 256.25,256.25 150,300 43.75,256.25 0,150 43.75,43.75 150,0 256.25,43.75 300,150 Z"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.0 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" %}