LibRedirect: one extension that swaps big platforms for their mirrors
A browser extension that redirects popular sites to alternative privacy friendly frontends
At a glance
- What is it?
- A webextension that rewrites requests for YouTube, Twitter, TikTok and dozens of other services onto alternative frontends, with instance selection left to you.
- Who is it for?
- LibRedirect is small in code and large in consequence, because it intercepts every request your browser makes to a list of large services and rewrites the destination. Its real strength is that it treats instance choice as user configuration rather than a hardcoded table, so when a public instance dies the fix is a data change rather than a new release.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 7 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 7, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What the extension actually intercepts
LibRedirect is a webextension that redirects requests for popular services to alternative frontends. The README states it as covering YouTube, Twitter and TikTok among others, and the repository topics name the specific ecosystems involved: invidious for video, nitter for Twitter, bibliogram for Instagram, plus libre and quora.
The mechanism is URL rewriting at the browser level rather than any kind of content filtering. The extension sits in the request path, matches a hostname against its list of known services, and substitutes a frontend that proxies the same content. The frontend is the component that actually holds the API credentials and the content, which is the whole point of the arrangement: the browser talks to the alternative instance instead of the origin platform.
Because it is a webextension, the rewrite happens before the request leaves the browser, and the extension needs the broad host permissions that implies. That is worth sitting with for a moment, because an extension that can redirect any request to any hostname is not a small privilege even when its intentions are limited to public mirrors.
Instance choice is the feature, not the redirect table
The release history shows what the project actually spends its time on. v3.2.0 added Office to CryptPad, Pixiv to a Pixiv viewer, Medium to Freedium and Search to Websurfx, and it removed the WolfreeAlpha instances. v3.3.0 added Instagram to Kittygram, Bluesky to Skylib, ChatGPT to Lumo by Proton, Fandom to Phantom and YouTube Music to ytify. v3.4.0, published on 2026-07-24, added Google Lens to rens, Pinterest to Pinless and Tenor to mezzo.
Every one of those lines is the same shape: a service in, a frontend out. What makes the design interesting is what is missing. The extension does not decide that Twitter must go to one specific Nitter instance. It carries a set of instances per service and lets the user pick, which is the only workable answer in an ecosystem where public instances appear and vanish weekly.
Two of those releases also say Updated translations, and every release since v3.2.0 carries an Improved UI line. The translation workflow is hosted on Weblate, with a Translate badge in the README pointing at hosted.weblate.org for the extension project.
Building it from a clone in four commands
The development section is short because there is not much setup. Clone, install, generate the HTML from Pug, and run it:
git clone https://github.com/libredirect/browser_extension
cd browser_extension
npm install
npm run html # Generates html using PugThat last step is not optional. The package scripts show that `html` runs three Rollup builds in sequence, one each for the popup, the options page and the messages, and the dependencies include `pug-cli` alongside `rollup`, `rollup-plugin-svelte` and `svelte-select`. The extension's pages are written as Pug templates and Svelte components, so a fresh checkout has sources but not the rendered HTML that the browser will load.
Running it on Firefox takes one more command:
npm run start`start` is `web-ext run`, and the `webExt` block in package.json points `sourceDir` at `./src/` with the browser console enabled, so the extension's console output lands in the terminal you launched it from. Packaging for Firefox is `npm run build`, which uses `web-ext build` and produces a zip in `web-ext-artifacts`.
Loading a build on Firefox and Chromium
The README documents three distinct install routes, and the differences between them matter more than they usually would.
For a temporary install on Firefox, open `about:debugging#/runtime/this-firefox` and press `Load Temporary Add-on...`, then pick the zip from `web-ext-artifacts`. The load is wiped when the browser closes, which is exactly right for a build you are about to test.
Firefox ESR, Developer Edition and Nightly need a different path because unsigned add-ons are refused by default. The README tells you to open `about:config`, set `xpinstall.signatures.required` to `false`, then use `Install Add-on From File...` from the gear menu in `about:addons`. Turning off signature enforcement is the price of installing a local build on those channels.
Chromium takes the source directory directly rather than a zip. Open `chrome://extensions`, enable `dev mode`, and choose `load unpacked extension`, then select the `src` folder. Because no build step is involved, the rendered HTML from `npm run html` has to exist first or the page will be blank.
Android and Chromium packaging live in package.json
Some of the project's capabilities are only visible in package.json rather than the README, and the Android path is the most interesting of them.
npm run androidThat script is `web-ext run -t firefox-android --adb-device emulator-5554 --firefox-apk org.mozilla.firefox --adb-remove-old-artifacts`, so it targets a Firefox for Android build on a device named `emulator-5554`, installs the debug APKs, and clears old artifacts first. Development against a specific emulator is baked into the script, so anyone else running it has to change the device name.
There are also two Chromium-oriented entries that the README does not mention at all. `npm run build_chromium` runs `brave-browser --pack-extension=src/ --pack-extension-key=src.pem`, which produces a signed Chromium package by pointing Brave at the source directory and a private key. That key, `src.pem`, is not in the repository tree, so this script only works for someone who has their own signing key.
The two plain Firefox entries are personal in the same way. `npm run firefox` and `npm run start_ar` both hardcode paths under `/home/manerakai/software/firefox`, the maintainer's home directory, for desktop and ARM builds respectively.
A repository URL in package.json that points elsewhere
There is a small but real inconsistency worth flagging before you clone anything. The `repository` field in package.json reads `git+https://github.com/libredirect/libredirect.git`, and the `bugs` field points at `https://github.com/libredirect/libredirect/issues`. Both use the name `libredirect` for the repository.
The repository itself is `libredirect/browser_extension`, and both the README's clone command and every release changelog link use that name. The package name is simply `libredirect`, and the homepage field points at libredirect.manerakai.com.
So the project has three names in play: `libredirect` as the npm package name and as the repository field, `browser_extension` as the actual GitHub repository, and LibRedirect as the user facing project name. If you clone from the URL in package.json rather than the URL in the README, you will not get this extension. The README's command is the reliable one.
Two other files in the tree are worth knowing about. `test-conditions.md` is the manual verification checklist the README links to for checking new functions after a build, and `Privacy-Policy.md` sits at the root next to `SECURITY.md`, which is what you would expect from an extension that rewrites traffic and asks for broad host permissions.
Editorial conclusion
LibRedirect is small in code and large in consequence, because it intercepts every request your browser makes to a list of large services and rewrites the destination. Its real strength is that it treats instance choice as user configuration rather than a hardcoded table, so when a public instance dies the fix is a data change rather than a new release. Its real weakness is that the whole thing rests on the unofficial APIs of services that can change without notice. The last push was on 2026-09-23 and v3.4.0 shipped on 2026-07-24, so it is being kept current. For a first look, clone the repository, run `npm run html` then `npm run start`, and enable it for a single service in the options page before you switch anything you rely on.
Frequently asked questions
Which services does LibRedirect support?
The README names YouTube, Twitter and TikTok as examples, and the repository topics point at Invidious for video, Nitter for Twitter and Bibliogram for Instagram. The release notes are the fuller list: the last three releases added Office to CryptPad, Pixiv, Medium to Freedium, Search to Websurfx, Instagram to Kittygram, Bluesky to Skylib, ChatGPT to Lumo by Proton, Fandom to Phantom, YouTube Music to ytify, Google Lens to rens, Pinterest to Pinless and Tenor to mezzo.
Does LibRedirect work on Chromium browsers as well as Firefox?
Yes. The README documents loading it unpacked on Chromium by opening chrome://extensions, enabling dev mode, then choosing load unpacked extension and selecting the src folder. There is also a build_chromium script in package.json that packages src for Brave using a signing key, though that key is not part of the repository so it only works with your own.
How do I choose which alternative instance a service redirects to?
Instance selection is configuration rather than something baked into the code, which is why the release notes read as a list of service to frontend pairings rather than a single default. Each release bundles an options page build, and the source is a Svelte component with a svelte-select dependency, which is the library used for a picker control. Settings are kept in the extension's own storage and can be changed without reinstalling.
What does npm run html do and why is it required?
It generates the extension's HTML pages from their sources. The script runs Rollup three times, once for the popup, once for the options page and once for the messages, and the project depends on pug-cli and rollup-plugin-svelte because the pages start as Pug templates and Svelte components. A fresh checkout therefore has sources but no rendered HTML until that command runs.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/libredirect-browser-extension)