They’ve been telling us internet will make us free, that we will have the knowledge at the reach of our browser, infinite possibilities and all that stuff… until you hit the (pay)wall: When you find this message, you have 2 options, you pay the member fee or ¹… Let’s go that way. you can use all your knowledge to bypass it There are various types of paywall control techniques: By cookie (we will focus on this one today) By redirecting to another site By hiding content using JavaScript Paywall by cookie Medium use cookies to track us, so the first option would be to delete the cookie that triggers this paywall (field in the medium cookie by the way). The problem is I would have to login again then, because maybe after reading it i want to bookmark it o follow the author (my problem is with the paywall not the content). sid But why bother, just open the article in private/incognito mode and voilà, no paywall at all. So how can we achieve this with less friction? Let’s say we build a that can detect we were stopped by the paywall and automatically open the site in private mode, pretty simple no? Chrome extension If you want a quick guide in how to make a default extension see , i will focus on the paywall bypass, and let’s start with that. this Google’s guide download the template app The extension Our app consist of mainly of : holds the permissions and declare the other files manifest.json for communicating the extension background.js detects the paywall warning and triggers the private window hidden.js we will use it after in this series display.js Let’s dive into manifest: { : , : , : , : , : , : { : [ ] <---- }, : [ <---- , , , ], : { <---- 3 : , : }, : { : , : , : }, : [ { : [ ], : [ ] }, { : [ ], : [ ] <---- } ] } "name" "Gandalf" "version" "1.0" "description" "You shall not redirect" "manifest_version" 2 "content_security_policy" "script-src 'self' https://ajax.googleapis.com; object-src 'self'" "background" "scripts" "app/background.js" 1 "permissions" 2 "webRequest" "webRequestBlocking" "tabs" "<all_urls>" "browser_action" "default_title" "You shall not pass" "default_popup" "popup.html" "icons" "16" "logo-small.png" "48" "logo-small.png" "128" "logo-small.png" "content_scripts" "matches" "*://*.uy/*" "js" "app/display.js" "matches" "<all_urls>" "js" "app/hidden.js" 4 Link to the script that holds the extension logic, add listeners and define some constants. The extension need some permissions, webRequest and webRequestBlocking for blocking a request (for the next chapter), tabs for creating a new window or tab. <all_urls> let us operate in all websites, you can change this if you only want specific sites. Just a title for our extension and popup.html is what we render when someone click on the extension icon. Content scripts can change the site content, this one apply to all urls and invoke hidden.js. So we have defined that for all urls, hidden.js will be executed. This script can access the site body, check if paywall is present and send a message ( is the way our content scripts communicates with the extension). internal messaging paywallId = ; .onload = { content = .getElementById(paywallId); (content != ){ chrome.runtime.sendMessage({ : , : .location.href }, { .log( , response); } ); } } var "" // We need an id to know if paywall is shown window ( ) function // When site loads this will be called var document // Find paywall if null // Send a message to the background with current url incognito true url window ( ) function response console "Opening page in incognito" For medium we can use the id to check if we have to open in incognito; now its time to check the background script: paywall-background-color .chrome.runtime.onMessage.addListener( { (request.incognito == ){ openIncognito = chrome.windows.create({ : request.url, : request.incognito}); sendResponse({ : }); } }); window ( ) function request, sender, sendResponse // Check if the message is ours if true // Create incognito window with the requested url "url" "incognito" msg "Time to read" Now that we have our extension ready, it to the browser and start reading non-stop. we can load we will try to beat the redirection type of paywalls. Next in the series Resources Google’s extension develop guide Template app repo All the extension is doing is removing some friction from the user (that could always copy the link, enter in private mode and paste it), by no means we are hacking or altering medium behaviour. [1]