Compare commits

...
Sign in to create a new pull request.

49 commits

Author SHA1 Message Date
QuiteAFancyEmerald
e7f4be9a59
add: swap out startpage for duckduckgo 2025-02-06 21:10:30 -08:00
QuiteAFancyEmerald
19532e62f8
fix: missed something with cache busting 2024-12-26 17:10:15 -08:00
Quite A Fancy Emerald
0db202d1f0
Update README.md 2024-12-25 02:25:28 -08:00
QuiteAFancyEmerald
bfc31751dc
chore: cache busting changes for prod 2024-12-25 01:58:40 -08:00
QuiteAFancyEmerald
34efae171a
fix: resolve github actions error 2024-12-25 00:35:04 -08:00
QuiteAFancyEmerald
c3f3126c2a
chore: update deps 2024-12-25 00:27:35 -08:00
QuiteAFancyEmerald
26f3eb0dc9
fix: scramjet being funny 2024-12-25 00:11:36 -08:00
QuiteAFancyEmerald
a4beabf191
add: updated to v6.4.3 fully 2024-12-25 00:03:54 -08:00
QuiteAFancyEmerald
91316512c1
chore: more asset bumps to v6.4.3 2024-12-24 23:14:04 -08:00
QuiteAFancyEmerald
d1d8e14f68
chore: bump assets to v6.4.3 2024-12-24 22:58:40 -08:00
QuiteAFancyEmerald
9c00f7ee36
chore: bump images to master assets 2024-12-24 22:58:20 -08:00
QuiteAFancyEmerald
f3283e04f1
chore: bump assets to v6.4.3 2024-12-24 21:53:05 -08:00
QuiteAFancyEmerald
3ecedd58f5
chore: bumping up to master changes (a bit) 2024-12-24 21:44:21 -08:00
QuiteAFancyEmerald
bb6c24073d
refactor: better uv error prevention 2024-11-30 19:23:36 -08:00
QuiteAFancyEmerald
2c555a8aa4
fix: where did yo link go 2024-11-30 18:56:25 -08:00
QuiteAFancyEmerald
8f87b56886
refactor: homepage styles for production 2024-11-30 18:44:48 -08:00
QuiteAFancyEmerald
0778ecbf83
refactor: homepage styling 2024-11-29 01:25:39 -08:00
QuiteAFancyEmerald
32706dd9be
fix: settings menu 2024-11-29 00:44:49 -08:00
QuiteAFancyEmerald
dc0ff7890b
chore: update error page for production 2024-11-29 00:31:23 -08:00
QuiteAFancyEmerald
961f58af56
chore: keyword removal 2024-11-29 00:14:51 -08:00
QuiteAFancyEmerald
63a2514dd4
add: uv page changes for production 2024-11-29 00:14:03 -08:00
QuiteAFancyEmerald
4558af2efd
fix: uv error page for production instances 2024-11-28 22:53:31 -08:00
QuiteAFancyEmerald
898c313019
add: webretro v6.5 to production branch 2024-11-28 21:59:21 -08:00
QuiteAFancyEmerald
8a23d2ad0d
fix: robots.txt for production instances 2024-11-28 21:11:32 -08:00
QuiteAFancyEmerald
253f457ba0
fix: more items I overlooked 2024-11-22 20:21:22 -08:00
QuiteAFancyEmerald
673c0a37d2
fix: many filter terms I missed 2024-11-22 20:04:09 -08:00
Quite A Fancy Emerald
35c8b25235 fix: ultraviolet logo invalid 2024-11-21 14:59:38 -08:00
Quite A Fancy Emerald
df1e03d2c6
Update README.md 2024-11-20 15:23:39 -08:00
QuiteAFancyEmerald
4645b0140e
fix: some wording problems 2024-11-17 12:07:18 -08:00
QuiteAFancyEmerald
fca2563b15
Merge branch 'v6.3_production' of https://github.com/QuiteAFancyEmerald/Holy-Unblocker into v6.3_production 2024-11-07 18:21:56 -08:00
QuiteAFancyEmerald
cf8e5d75e4
chore: updated readme for branch release 2024-11-07 18:21:44 -08:00
Quite A Fancy Emerald
6126f9f74e test 2024-11-07 15:06:14 -08:00
--global
94ba8bce08 fix: back to just __uv$config 2024-11-07 15:03:33 -08:00
--global
fa0f0065d0 fix: reverted cursed changes 2024-11-07 15:01:29 -08:00
--global
eb7a998a33 refactor: improved global randomization function 2024-11-07 14:23:24 -08:00
--global
107b75aca0 fix: ultraviolet problems with image loading and speed 2024-11-07 12:36:48 -08:00
--global
060a69a9d1 fix: production config setting 2024-11-07 12:36:27 -08:00
--global
25dbf27768 fix: attempting to fix the uv errors 2024-11-07 09:30:38 -08:00
--global
b6f976e6ff fix: missed some keywords 2024-11-07 08:40:41 -08:00
QuiteAFancyEmerald
bed7aac10d
fix: wip uv fixes 2024-11-03 21:13:32 -08:00
QuiteAFancyEmerald
f3ca425a70
also mistake 2024-11-03 10:10:18 -08:00
QuiteAFancyEmerald
c71ca40c3d
mistake 2024-11-03 10:09:57 -08:00
QuiteAFancyEmerald
53d24d5eda
chore: version bump 2024-11-03 10:07:32 -08:00
QuiteAFancyEmerald
7babbc02f7
fix: source randomization changes on all pages 2024-11-02 21:14:19 -07:00
QuiteAFancyEmerald
e071a7397e
chore: wip source randomization update 2024-11-02 20:49:03 -07:00
QuiteAFancyEmerald
dac476fc69
fix: char dump 2024-11-02 19:31:56 -07:00
QuiteAFancyEmerald
2b9c9779fd
ci: update 2024-11-02 19:20:15 -07:00
QuiteAFancyEmerald
4cb02710e6
chore: wip detector detector implementation check 2024-11-02 18:51:10 -07:00
QuiteAFancyEmerald
1e277b2d19
update: source randomization 2024-11-02 18:27:29 -07:00

35
.github/workflows/ci_production.yml vendored Normal file
View file

@ -0,0 +1,35 @@
name: CI-Win-Production
on:
push:
branches: [v6.4-production]
pull_request:
branches: [v6.4-production]
jobs:
build-windows:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20.8.0'
- name: Install dependencies
run: npm install
- name: Build libraries
run: npm run build
- name: Start server
run: npm run workflow-test
- name: Test server response
run: npm test
- name: Stop server after testing
run: npm stop

1
.gitignore vendored
View file

@ -15,3 +15,4 @@ debug.log
/src/.shutdown
lib/rammerhead/src/client/hammerhead.min.js
lib/rammerhead/src/client/rammerhead.min.js
views/archive/gfiles/rarch/roms

150
README.md
View file

@ -5,7 +5,7 @@
![GitHub Actions Status](https://github.com/QuiteAFancyEmerald/Holy-Unblocker/workflows/CI-Production/badge.svg)
![GitHub Actions Status](https://github.com/QuiteAFancyEmerald/Holy-Unblocker/workflows/CI-Win/badge.svg)
Holy Unblocker LTS, an experimental web proxy service, can bypass web filters or 'blockers' regardless of whether the method of censorship is client-side or network-based. This includes the potential ability to bypass content blockers overseas, Chrome extensions, localized client firewalls, and network-related filters.
Holy Unblocker LTS, an experimental web proxy service, can bypass web filters or 'blockers' regardless of whether the method of censorship is client-side or network-based. This includes the potential ability to bypass content blockers overseas, Chrome extensions, localized client firewalls, and network-related filters. The project even allows the ability to browser Tor/Onion sites in any browser!
## You can support Holy Unblocker by starring the repository!
@ -14,6 +14,22 @@ This project serves mostly as a proof of concept for the ideal clientless soluti
Works with a large number of sites, including YouTube, Discord, and more!
Also has a good amount of locally hosted games featured on the site.
#### Current Branch: Production
<details><summary>Branch Types</summary>
- Latest (master; built for FOSS and SEO)
- Beta (pending changes; changes that may break things)
- Stable (v4, v5, v6; stable version of Holy Unblocker LTS)
- Production (changes for self hosting in production settings; max filtering evasion and request handling)
</details>
#### Considering switching branches for self-hosting to a production branch!
<br>
> [!CAUTION]
> If you are going to self-host Holy Unblocker LTS please switch to the PRODUCTION branch for filter evasion features. The master branch is intended for development work and a highly readable source for developers. You can select a production branch (v6.x_production) via the branches dropdown.
> [!TIP]
> Holy Unblocker LTS is optimized for self-hosting to provide you with maximum privacy control! Fork this repository and consider starring. You can self-host using either free or paid deployment options, or set it up on a dedicated instance (VPS) for enhanced performance.
@ -23,13 +39,13 @@ Also has a good amount of locally hosted games featured on the site.
| CoolMathGames | Features "Source Randomization" to circumvent major filters effectively along with randomizations to proxy globals |
| Discord | Tab title + icon customization using the Settings Menu for improved browsing stealth |
| Now.gg | Adblocking support across all websites while surfing |
| Reddit.com | SOCKS5 and Onion routing support with Tor within the Settings Menu |
| Reddit.com | SOCKS5 and Onion routing support with Tor within the Settings Menu. Use Tor/Onion sites in any browser! |
| GeForce NOW | Game library with moderately decent titles and open-source emulation projects |
| Spotify | Has frequent support articles for issues relating to various proxy instances |
| And essentially all sites! | Built for intensive production loads and speed |
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.3.5-preview.png"></img>
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.4.3-preview.png"></img>
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.3.0-preview-settings.png"></img>
Read below for information if the official site is blocked or for obtaining more links. Can't deploy using any of the free options below? Check out Railway or look into cheap, paid VPS hosting solutions.
@ -39,7 +55,7 @@ Read below for information if the official site is blocked or for obtaining more
## Deploy Holy Unblocker
### Free Deployments
[![Deploy to Koyeb](https://binbashbanana.github.io/deploy-buttons/buttons/remade/koyeb.svg)](https://app.koyeb.com/deploy?name=holy-unblocker&type=git&repository=QuiteAFancyEmerald%2FHoly-Unblocker&branch=master&builder=buildpack&env%5B%5D=&ports=8080%3Bhttp%3B%2F)
[![Deploy to Koyeb](https://binbashbanana.github.io/deploy-buttons/buttons/remade/koyeb.svg)](https://app.koyeb.com/deploy?name=holy-unblocker&type=git&repository=QuiteAFancyEmerald%2FHoly-Unblocker&branch=v6.3_production&builder=buildpack&env%5B%5D=&ports=8080%3Bhttp%3B%2F)
[![Deploy to Oracle Cloud](https://binbashbanana.github.io/deploy-buttons/buttons/remade/oraclecloud.svg)](https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/BinBashBanana/deploy-buttons/archive/refs/heads/main.zip)
<details><summary>More</summary>
@ -74,6 +90,13 @@ Replit is no longer free and Heroku has a set policy against web proxies. Try Gi
## Table of contents:
- [Setup](#how-to-setup)
- [Terminal](#terminal)
- [Project Configuration](#configuration)
- [Server Configuration](#server-configuration-setup)
- [TOR Routing](#toronion-routing-setup)
- [Proxy](#proxy-configuration)
- [Client Navigation](#client-navigation-configuration)
- [Games Management](#games-management)
- [Structure](#structure)
- [Structure Information](#structure-information)
- [Static Files](#details-of-views)
@ -89,6 +112,12 @@ Replit is no longer free and Heroku has a set policy against web proxies. Try Gi
## How to Setup
#### It is highly recommended you switch branches via your IDE to a production released branch. Often the master branch contains unstable or WIP changes.
#### Example: v6.x_production instead of master
### Terminal
Either use the button above to deploy to the deployment options above or type the commands below on a dedicated server:
```bash
@ -96,19 +125,99 @@ git clone --recurse-submodules https://github.com/titaniumnetwork-dev/Holy-Unblo
cd Holy-Unblocker
git submodule init
# Using the configuration file you can automatically use pm2 if you are hosting on a VPS!
npm start
# Or on subsequent uses...
npm restart
# If you encounter any build errors...
npm run build
# If you encounter any service errors...
npm run proxy-validator
```
### It is highly recommended you switch branches via your IDE to a stable released branch. Often the master branch contains unstable or WIP changes.
This website is hosted locally with Scramjet, Ultraviolet (Wisp, Bare-Mux, EpoxyTransport, CurlTransport) and Rammerhead built-in.
#### Example v6.x instead of master
### Configuration
The default place for the proxy when its started is `http://localhost:8080`, but you can change it if needed in `./ecosystem.config.js`. You can also modify the other configuration values at `/src/config.js`
#### Server Configuration Setup
The default place for the proxy when its started is `http://localhost:8080`, but you can change it if needed in `./ecosystem.config.js`. You can also modify the other configuration values at `./config.json`. To clarify you change the PORT and other production metrics via `./ecosystem.config.js`. Localized changes for source randomization, auto-minify, etc. are located in `./config.json`.
This website is hosted locally with Ultraviolet and Rammerhead built-in.
#### Tor/Onion Routing Setup
Simply host Tor using this guide: https://tb-manual.torproject.org/installation/
If you are hosting Holy Unblocker LTS on a VPS utilizing Ubuntu consider attaching Tor to systemctl for easier production management. Once Tor is up and running on either Linux or Windows it will work automatically with Holy Unblocker LTS when enabled by the user via the Settings menu.
#### Proxy Configuration
The primary location for tweaking any web proxy related settings assigned via the Settings menu is `./views/assets/js/register-sw.js`. Here you can modify the provided transport options set locally via a cookie, swap out SOCKS5 proxies, change Onion routing ports, specify a blacklist, and more.
- `stockSW`: The default service worker configuration file for Ultraviolet. For Holy Unblocker however adblocking is automatically enabled so this is not used by default.
- `blacklistSW`: A modified version of Ultraviolet that allows for blacklisting domains and adblocking.
- `proxyUrl`: Specifies a SOCKS5 protocol URL defaulting to the default Tor proxy port. This can be swapped out with any valid port or SOCK5s proxy.
- `transports`: Specifies any provided ports to be swapped via Bare-Mux and utilize Wisp.
- `wispUrl`: Modify the pathname or url handling for Wisp
- `defaultMode`: Specify the default transport used globally (can be swapped by the users still via the Settings menu)
- `ScramjetController`: This contructor allows you to swap out the prefix used for Scramjet dynamically and specify file locations. Note you may need to edit `./views/scram/scramjet.sw` when changing file names.
#### Client Navigation Configuration
The primary location for any client side navigation scripts is `./views/assets/js/common.js`. This file is primary used for Omnibox (Search Engine) functionality, swapping proxy options and linking games.
- `getDomain`: This constant is used for specifying any subdomains to remove when appending a URL into the omnibox.
- `goFrame`: This specifies the stealth frame used for Holy Unblocker LTS
- `sx`: This constant specifies the search engine you want to be proxied whenever a user types something in that isn't a URL
- `search/uvUrl/sjUrl`: These functions specify and parse the queries used for submitted URLs
- `RammerheadEncode:` This constant is a dependency for Rammerhead parsing and querying
- `urlHandler/asyncUrlHandler`: Used to set functions for the goProx object.
- `goProx`: This constant allows for the mapping of URL handling for specific proxies, games or links that need to fall under a web proxy.
```js
const goProx = Object.freeze({
ultraviolet: urlHandler(uvUrl),
scramjet: urlHandler(sjUrl),
rammerhead: asyncUrlHandler(
async (url) => location.origin + (await RammerheadEncode(search(url)))
),
// `location.protocol + "//" + getDomain()` more like `location.origin`
examplepath: urlHandler(location.protocol + `//c.${getDomain()}/example/`),
examplesubdomain: urlHandler(location.protocol + '//c.' + getDomain()),
example: urlHandler(sjUrl('https://example.com')),
});
```
- `prSet`: Attaches event listeners using goProx for any buttons or inputs needed
```js
// prSet function code here....
prSet('pr-uv', 'ultraviolet');
prSet('pr-sj', 'scramjet');
prSet('pr-rh', 'rammerhead');
prSet('pr-yt', 'youtube');
prSet('pr-example', 'example');
```
- `huLinks/navLists`: Automatically takes paths stated in `./views/assets/json` and appends them depending on the page and usage. This is used for hiding links that would lead to filter blocks and create an easier system for adding games.
#### Games Management
As stated above all game links that need to be appended to a page (including images and descriptions) are managed via the nav files in`./views/assets/json`. When cloning Holy Unblocker utilize `--recurse-submodules` to ensure all submodules are downloaded along with `git submodule init`.
- `views/archive/g`: Contains any local or external HTML5/web games.
- `views/archive/gfiles/flash`: Contains Ruffle (an Adobe Flash emulator) and a collection of flash games linked to an external CDN.
- `views/archive/gfiles/rarch`: Contains webretro which is a project that ports RetroArch to WASM. Supports many systems like GBA, N64, etc; ROMS are NOT INCLUDED.
## Structure
@ -133,6 +242,7 @@ WIP
- `emulibrary.html`: Games page for emulated games (not included in public release)
- `flash.html`: Games page for flash games, credits given to @BinBashBanana and Titanium Network for its assets.
- `ultraviolet.html`: TODO
- `scramjet.html`: TODO
- `rammerhead.html`: TODO
- `youtube.html`: A proxied version of Youtube running off the locally hosted Ultraviolet.
- `discord.html`: Hub for the Discord proxy.
@ -177,7 +287,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
- [ ] Ensure all the original submodules get added back to HU-Archive
- [x] Mobile support - (welcome screen only, partial/needs work)
- [ ] SEO overhaul adapted from the v2 SEO Guide format
- [ ] Randomize the \_\_uv$config global, and optionally randomize the UV prefix and URL encoding via cookies
- [x] Randomize the \_\_uv$config global, and optionally randomize the UV prefix and URL encoding via cookies
## Proxy/Site Functionality
@ -197,6 +307,9 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
- [ ] Update sw.js to support workerware (https://github.com/MercuryWorkshop/workerware)
- [ ] Omnibox autoupdate script (for the Google/Bing style auto suggest feature)
- [ ] Games library will feature 10000 items; 5000 flash games and 5000 other game types
- [ ] Attach proxyvalidatorscript to a status page > have this be served via Fastify, etc. etc; config option disabled as it will cause issues potentially unless if we refactor it slightly.
- [ ] Improve adblocking functions on site using AnuraOS standards
- [ ] Revamp the Stealth Frame with a slight animation (ease in and then the wheeling loading with a gradient fading away once its loaded or shows the error page LOL), a loading wheel/page and lastly a omnibox widget. It will have like nav buttons, some of the settings from the settings menu, a home button, a button that brings up the Setting menu and be in a designed position. Intent is to reduce the back/forth nature that users have to do currently making it more tedious to use the site.
## Site Redesign
@ -261,6 +374,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
- Switched to Fastify for serving content from the backend; a separate Express backend file is kept in case it's still needed
- Rammerhead is now locally built into the HU LTS repository
- Simplified the HU LTS setup process and added more default npm commands
- Filter focus via https://gist.github.com/BinBashBanana/a1fd7345e2d86e69d5a532f16cbdbdaa
## Vague Explanation for Beginners With External Proxies and Hosting
@ -279,12 +393,10 @@ After you have selected a decent VPS, use Cloudflare for the DNS records for bot
This is an example of DNS records involving Heroku. Self-hosting will require `A records` preferably.
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/dnssetup.png" width="500"></img>
- `@` and `www.example.ml` are being used for the local Ultraviolet proxy.
- `client.example.ml` is being used for Rammerhead.
- `a.example.ml` is being used for womginx.
- `cdn.example.ml` is being used for a private Ultraviolet host on the official sites.
- `@` and `www.example.ml` are being used for Holy Unblocker LTS.
- `client.example.ml` is being used for other instances like Libreddit or Invidious.
As stated previously, Holy Unblocker is hosted locally with Ultraviolet.
As stated previously, Holy Unblocker is hosted locally with Scramjet, Ultraviolet and Rammerhead out of the box. No need for external instances.
#### Freenom/Domain Steps
@ -393,14 +505,16 @@ View the official website for more detail and credits.
### Web Proxy Sources:
This project currently uses Ultraviolet, Wisp, Womginx, and Rammerhead, linked below.
This project currently uses Scramjet and Ultraviolet as web proxies adhering to the Wisp protocol. Bare-Mux is utilized for swapping transport systems to be utilized with Wisp. The included transport systems are EpoxyTransport and libcurl-transport. Rammerhead is also provided as an additional web proxy option.
- <a href="https://github.com/MercuryWorkshop/scramjet">Scramjet</a>
- <a href="https://github.com/titaniumnetwork-dev/Ultraviolet">Ultraviolet</a>
- <a href="https://github.com/binary-person/womginx">Womginx</a>
- <a href="https://github.com/binary-person/rammerhead">Rammerhead</a>
- <a href="https://github.com/MercuryWorkshop/wisp-server-node">Wisp</a>
- <a href="https://github.com/MercuryWorkshop/EpoxyTransport">EpoxyTransport</a>
- <a href="https://github.com/MercuryWorkshop/CurlTransport">libcurl-transport</a>
- <a href="https://github.com/MercuryWorkshop/bare-mux">Bare-Mux</a>
- <a href="https://github.com/tomphttp/bare-server-node">TOMP Bare Server</a>
- <a href="https://github.com/binary-person/rammerhead">Rammerhead</a>
- <a href="https://gist.github.com/BinBashBanana/a1fd7345e2d86e69d5a532f16cbdbdaa">DetectorDetector</a>
### Other Dependencies:

View file

@ -38,6 +38,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
- [ ] Games library will feature 10000 items; 5000 flash games and 5000 other game types
- [ ] Attach proxyvalidatorscript to a status page > have this be served via Fastify, etc. etc; config option disabled as it will cause issues potentially unless if we refactor it slightly.
- [ ] Improve adblocking functions on site using AnuraOS standards
- [ ] Revamp the Stealth Frame with a slight animation (ease in and then the wheeling loading with a gradient fading away once its loaded or shows the error page LOL), a loading wheel/page and lastly a omnibox widget. It will have like nav buttons, some of the settings from the settings menu, a home button, a button that brings up the Setting menu and be in a designed position. Intent is to reduce the back/forth nature that users have to do currently making it more tedious to use the site.
## Site Redesign

View file

@ -1,5 +1,5 @@
{
"name": "Holy Unblocker v6.3.9",
"name": "Holy Unblocker v6.4.3",
"description": "Holy Unblocker is a secure web proxy service supporting numerous sites while concentrating on detail with design, mechanics, and features. Bypass web filters regardless of whether it is an extension or network-based.",
"repository": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
"logo": "https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/icon.png",

View file

@ -1,7 +1,7 @@
{
"title": "HU LTS",
"host": "0.0.0.0",
"minifyScripts": false,
"minifyScripts": true,
"randomizeIdentifiers": true,
"production": false
}

152
detectordetector.js Normal file

File diff suppressed because one or more lines are too long

View file

@ -464,10 +464,21 @@
}
},
"node_modules/@types/minimatch": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
"integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
"license": "MIT",
"optional": true
},
"node_modules/@types/node": {
"optional": true
"version": "22.8.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz",
"integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==",
"license": "MIT",
"optional": true,
"dependencies": {
"undici-types": "~6.19.8"
}
},
"node_modules/abstract-logging": {
"version": "2.0.1",
@ -4789,6 +4800,13 @@
"node": ">=0.8.0"
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"license": "MIT",
"optional": true
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2256
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "holyunblocker",
"version": "6.3.9",
"version": "6.4.3",
"repository": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker",
"description": "Holy Unblocker is a secure web proxy service with support for many sites.",
"main": "backend.js",
@ -27,24 +27,24 @@
"author": "Titanium Network",
"license": "GNU AFFERO",
"dependencies": {
"@fastify/helmet": "^11.1.1",
"@fastify/static": "^7.0.4",
"@mercuryworkshop/bare-as-module3": "^2.2.2",
"@mercuryworkshop/bare-mux": "^2.0.9",
"@mercuryworkshop/epoxy-transport": "^2.1.13",
"@mercuryworkshop/libcurl-transport": "^1.3.10",
"@titaniumnetwork-dev/ultraviolet": "~3.2.7",
"@tomphttp/bare-server-node": "^2.0.3",
"axios": "^1.7.2",
"fastify": "^4.28.1",
"@fastify/helmet": "^12.0.1",
"@fastify/static": "^8.0.2",
"@mercuryworkshop/bare-as-module3": "^2.2.5",
"@mercuryworkshop/bare-mux": "^2.1.6",
"@mercuryworkshop/epoxy-transport": "^2.1.26",
"@mercuryworkshop/libcurl-transport": "^1.3.12",
"@titaniumnetwork-dev/ultraviolet": "~3.2.10",
"@tomphttp/bare-server-node": "^2.0.5",
"axios": "^1.7.7",
"fastify": "^5.1.0",
"mime-types": "^2.1.35",
"pm2": "^5.4.2",
"puppeteer": "^22.12.1",
"puppeteer": "^23.7.1",
"wisp-server-node": "^1.1.7",
"ws": "^8.18.0"
},
"devDependencies": {
"@babel/node": "^7.25.0",
"esbuild": "^0.23.0"
"@babel/node": "^7.26.0",
"esbuild": "^0.24.0"
}
}

View file

@ -331,4 +331,4 @@ xx xx
}
};
testServerResponse();
testServerResponse();

View file

@ -7,10 +7,10 @@ import ecosystem from './ecosystem.config.js';
// Some necessary constants are copied over from /src/server.mjs.
const config = Object.freeze(
JSON.parse(await readFile(new URL('./src/config.json', import.meta.url)))
JSON.parse(await readFile(new URL('./config.json', import.meta.url)))
),
ecosystemConfig = Object.freeze(
ecosystem.apps.find((app) => app.name === 'HolyUB') || ecosystem.apps[0]
ecosystem.apps.find((app) => app.name === 'HolyUBLTS') || ecosystem.apps[0]
);
const serverUrl = ((base) => {
@ -121,7 +121,8 @@ commands: for (let i = 2; i < process.argv.length; i++)
await mkdir(dist);
await build({
entryPoints: [
'./views/uv/**/*.js',
'./views/network/**/*.js',
'./views/worker/**/*.js',
'./views/assets/js/**/*.js',
'./views/assets/css/**/*.css',
],

View file

@ -16,7 +16,7 @@
"Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2"
],
"splash": [
"This version is the public HU LTS build of the web proxy service project and being worked on (master branch)! Stuff will NOT work!"
"This version is the public HU LTS build of the web proxy service project and being worked on (v6.4_production branch)! Stuff will NOT work!"
],
"version": ["6.3.9"]
}
"version": ["6.4.3"]
}

View file

@ -1,135 +0,0 @@
import { paintSource, tryReadFile } from './randomization.mjs';
import loadTemplates from './templates.mjs';
import pkg from './routes.mjs';
import { readFile } from 'fs/promises';
import path from 'path';
import express from 'express';
import helmet from 'helmet';
import http from 'http';
import createRammerhead from 'rammerhead/src/server/index.js';
import wisp from 'wisp-server-node';
import { epoxyPath } from '@mercuryworkshop/epoxy-transport';
import { libcurlPath } from '@mercuryworkshop/libcurl-transport';
import { bareModulePath } from '@mercuryworkshop/bare-as-module3';
import { baremuxPath } from '@mercuryworkshop/bare-mux/node';
import { uvPath } from '@titaniumnetwork-dev/ultraviolet';
// import { createBareServer } from "@tomphttp/bare-server-node";
const config = JSON.parse(
await readFile(new URL('./config.json', import.meta.url))
),
{ pages, text404 } = pkg,
__dirname = path.resolve(),
port = process.env.PORT || config.port,
app = express(),
router = express.Router(),
// bare = createBareServer("/bare/"),
rh = createRammerhead();
const rammerheadScopes = [
'/rammerhead.js',
'/hammerhead.js',
'/transport-worker.js',
'/task.js',
'/iframe-task.js',
'/worker-hammerhead.js',
'/messaging',
'/sessionexists',
'/deletesession',
'/newsession',
'/editsession',
'/needpassword',
'/syncLocalStorage',
'/api/shuffleDict',
'/mainport',
];
const rammerheadSession = /^\/[a-z0-9]{32}/,
shouldRouteRh = (req) => {
const url = new URL(req.url, 'http://0.0.0.0');
return (
rammerheadScopes.includes(url.pathname) ||
rammerheadSession.test(url.pathname)
);
},
routeRhRequest = (req, res) => {
rh.emit('request', req, res);
},
routeRhUpgrade = (req, socket, head) => {
rh.emit('upgrade', req, socket, head);
},
server = http.createServer((req, res) => {
/*
if (bare.shouldRoute(req)) {
bare.routeRequest(req, res);
} else
*/
if (shouldRouteRh(req)) {
routeRhRequest(req, res);
} else {
app(req, res);
}
});
server.on('upgrade', (req, socket, head) => {
/*
if (bare.shouldRoute(req)) {
bare.routeUpgrade(req, socket, head);
} else
*/
if (shouldRouteRh(req)) {
routeRhUpgrade(req, socket, head);
} else if (req.url.endsWith('/wisp/')) {
wisp.routeRequest(req, socket, head);
}
});
// Apply Helmet middleware for security.
app.use(
helmet({
contentSecurityPolicy: false, // Disable CSP
})
);
/* All website files are stored in the /views directory.
* This takes one of those files and displays it for a site visitor.
* Query strings like /?j are converted into paths like /views/hidden.html
* back here. Which query string converts to what is defined in routes.mjs.
*/
router.get('/', async (req, res) =>
res.send(
paintSource(
loadTemplates(
tryReadFile(
path.join(
__dirname,
'views',
// Return the error page if the query is not found in
// routes.mjs. Also set index as the default page.
'/?'.indexOf(req.url)
? pages[Object.keys(req.query)[0]] || 'error.html'
: pages.index
)
)
)
)
)
);
app.use(router);
app.use(express.static(path.join(__dirname, 'views')));
app.use('/uv/', express.static(uvPath));
app.use('/epoxy/', express.static(epoxyPath));
app.use('/libcurl/', express.static(libcurlPath));
app.use('/bareasmodule/', express.static(bareModulePath));
app.use('/baremux/', express.static(baremuxPath));
app.disable('x-powered-by');
// Redundant code since 404 is handled elsewhere; left here as insurance.
app.use((req, res) => {
res.status(404).send(paintSource(loadTemplates(text404)));
});
server.listen(port);
console.log('Holy Unblocker is listening on port ' + port + '.');

View file

@ -24,10 +24,12 @@ const randomListItem = (lis) => () => lis[(Math.random() * lis.length) | 0],
hutaoInsert = (str) => str.replaceAll('<!--HUTAOWOA-->', getRandomSplash),
versionInsert = (str) => str.replaceAll('<!-- VERSION -->', VersionValue),
getCookingText = () =>
`<span style="display:none" data-fact="${randomListItem(vegetables)()}">${randomListItem(cookingInserts)()}</span>`,
`<span style="display:none" data-fact="${randomListItem(
vegetables
)()}">${randomListItem(cookingInserts)()}</span>`,
insertCooking = (str) =>
str.replaceAll(
'<!-- IMPORTANT-HUTAOCOOKINGINSERT-DONOTDELETE -->',
'<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->',
getCookingText
),
// This one isn't for obfuscation; it's just for dealing with cache issues.
@ -45,44 +47,9 @@ const randomListItem = (lis) => () => lis[(Math.random() * lis.length) | 0],
tryReadFile = (file, baseUrl) => {
file = fileURLToPath(new URL(file, baseUrl));
return existsSync(file + '')
? readFileSync(file + '', 'utf8')
? readFileSync(
file + '',
/\.(?:ico|png|jpg|jpeg)$/.test(file) ? undefined : 'utf8'
)
: preloaded404;
};
/*
All of this is now old code.
The newer versions of these functions are directly above.
function randomListItem(lis) {
return lis[Math.floor(Math.random() * lis.length)];
}
function insertCharset(str) {
return str.replace(/&#173;|&#8203;|&shy;|<wbr>/g, function() { return randomListItem(charRandom); });
}
function hutaoInsert(str) {
return str.replace(/<!--HUTAOWOA-->/g, function() { return randomListItem(splashRandom); });
}
function insertCooking(str) {
return str.replace(/<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->/g, function() { return '<span style="display: none;" data-fact="' + randomListItem(vegetables) + '" data-type="' + randomListItem(vegetables) + '">' + randomListItem(cookingInserts) + '</span>'; }); // this needs to be inside a function, so that not every string is the same
}
function cacheBusting(str) {
for (var item of Object.entries(cacheBustList)) {
str = str.replace(new RegExp(item[0], "g"), item[1]);
}
return str;
}
export function paintSource(str) {
return insertCharset(hutaoInsert(insertCooking(cacheBusting(str))));
}
export function tryReadFile(file) {
return existsSync(file) ? readFileSync(file, 'utf8') : text404;
}
*/

View file

@ -26,14 +26,16 @@ const pages = {
bookmarklets: 'pages/nav/bookmarklets.html',
terms: 'pages/nav/terms.html',
/* Games */
games: 'pages/nav/gtools.html',
'web-games': 'pages/nav/games5.html',
emulators: 'pages/nav/emulators.html',
'flash-games': 'pages/nav/flash.html',
'retro-games': 'pages/nav/emulibrary.html',
g: 'pages/nav/gtools.html',
e: 'pages/nav/games5.html',
c: 'pages/nav/emulators.html',
f: 'pages/nav/flash.html',
d: 'pages/nav/emulibrary.html',
/* Proxies */
ultraviolet: 'pages/proxnav/ultraviolet.html',
rammerhead: 'pages/proxnav/rammerhead.html',
a: 'pages/proxnav/ultraviolet.html',
j: 'pages/proxnav/scramjet.html',
uverror: 'pages/proxnav/ultraviolet-error.html',
b: 'pages/proxnav/rammerhead.html',
/* Proxy Presets */
youtube: 'pages/proxnav/preset/youtube.html',
apps: 'pages/proxnav/preset/applications.html',
@ -41,24 +43,29 @@ const pages = {
flash: 'archive/gfiles/flash/index.html',
webretro: 'archive/gfiles/rarch/index.html',
'vibe-os': 'archive/vibeOS/index.html',
'robots.txt': 'robots.txt',
'sitemap.xml': 'sitemap.xml',
'browserconfig.xml': 'browserconfig.xml',
'favicon.ico': 'favicon.ico',
};
const externalPages = {
github: {
default: 'https://github.com/QuiteAFancyEmerald/Holy-Unblocker',
aos: 'https://github.com/michalsnik/aos',
'bare-module': 'https://github.com/motortruck1221/bare-as-module3',
'bare-mux': 'https://github.com/MercuryWorkshop/bare-mux',
epoxy: 'https://github.com/MercuryWorkshop/epoxy-tls',
bam: 'https://github.com/motortruck1221/bare-as-module3',
bm: 'https://github.com/MercuryWorkshop/bare-mux',
ep: 'https://github.com/MercuryWorkshop/epoxy-tls',
fastify: 'https://github.com/fastify/fastify',
'font-awesome': 'https://github.com/FortAwesome/Font-Awesome',
'libcurl-js': 'https://github.com/ading2210/libcurl.js',
lj: 'https://github.com/ading2210/libcurl.js',
'nord-theme': 'https://github.com/nordtheme',
ultraviolet: 'https://github.com/titaniumnetwork-dev/Ultraviolet',
wisp: 'https://github.com/MercuryWorkshop/wisp-protocol',
config: 'https://github.com/titaniumnetwork-dev/Ultraviolet',
wm: 'https://github.com/MercuryWorkshop/wisp-protocol',
},
'titaniumnetwork-documentation': 'https://docs.titaniumnetwork.org',
'rammerhead-discord': 'https://discord.gg/VNT4E7gN5Y',
'config-docs': 'https://docs.titaniumnetwork.org',
'config-chat': 'https://discord.gg/VNT4E7gN5Y',
nt: 'https://nordtheme.com',
};
const cookingInserts = insert.content,
@ -67,8 +74,8 @@ const cookingInserts = insert.content,
splashRandom = insert.splash,
VersionValue = insert.version,
cacheBustList = {
'styles.css': 'styles-1644738239.css',
'common.js': 'common-16451543478.js',
'styles.css': 'styles-1735118314.css',
'common.js': 'common-1735118314.js',
};
export default {

View file

@ -19,10 +19,10 @@ import { existsSync, unlinkSync } from 'node:fs';
import ecosystem from '../ecosystem.config.js';
const config = Object.freeze(
JSON.parse(await readFile(new URL('./config.json', import.meta.url)))
JSON.parse(await readFile(new URL('../config.json', import.meta.url)))
),
ecosystemConfig = Object.freeze(
ecosystem.apps.find((app) => app.name === 'HolyUB') || ecosystem.apps[0]
ecosystem.apps.find((app) => app.name === 'HolyUBLTS') || ecosystem.apps[0]
),
{ pages, externalPages } = pageRoutes,
__dirname = path.resolve();
@ -131,6 +131,47 @@ app.register(fastifyStatic, {
decorateReply: false,
});
app.register(fastifyStatic, {
root: fileURLToPath(
new URL('../views/archive/gfiles/rarch', import.meta.url)
),
prefix: '/serving/',
decorateReply: false,
});
app.register(fastifyStatic, {
root: fileURLToPath(
new URL('../views/archive/gfiles/rarch/cores', import.meta.url)
),
prefix: '/cores/',
decorateReply: false,
});
app.register(fastifyStatic, {
root: fileURLToPath(
new URL('../views/archive/gfiles/rarch/info', import.meta.url)
),
prefix: '/info/',
decorateReply: false,
});
app.register(fastifyStatic, {
root: fileURLToPath(
new URL('../views/archive/gfiles/rarch/cores', import.meta.url)
),
prefix: '/uauth/',
decorateReply: false,
});
// NEVER commit roms due to piracy concerns
app.register(fastifyStatic, {
root: fileURLToPath(
new URL('../views/archive/gfiles/rarch/roms', import.meta.url)
),
prefix: '/roms/',
decorateReply: false,
});
app.register(fastifyStatic, {
root: fileURLToPath(
new URL(
@ -162,13 +203,29 @@ app.register(fastifyStatic, {
fileURLToPath(
new URL(
// Use the pre-compiled, minified scripts instead, if enabled in config.
config.minifyScripts ? '../views/dist/uv' : '../views/uv',
config.minifyScripts ? '../views/dist/network' : '../views/network',
import.meta.url
)
),
uvPath,
],
prefix: '/uv/',
prefix: '/network/',
decorateReply: true,
});
// This combines scripts from the official scramjet repository with local scramjet scripts into
// one directory path. Local versions of files override the official versions.
app.register(fastifyStatic, {
root: [
fileURLToPath(
new URL(
// Use the pre-compiled, minified scripts instead, if enabled in config.
config.minifyScripts ? '../views/dist/worker' : '../views/worker',
import.meta.url
)
),
],
prefix: '/worker/',
decorateReply: false,
});
@ -197,6 +254,9 @@ app.register(fastifyStatic, {
decorateReply: false,
});
/* If you are trying to add pages or assets in the root folder and
NOT entire folders check src/routes.mjs and add it manually. */
/* All website files are stored in the /views directory.
* This takes one of those files and displays it for a site visitor.
* Paths like /browsing are converted into paths like /views/pages/surf.html
@ -229,18 +289,27 @@ app.get('/:path', (req, reply) => {
if (reqPath && !(reqPath in pages))
return reply.code(404).type('text/html').send(preloaded404);
reply.type('text/html').send(
paintSource(
loadTemplates(
tryReadFile(
'../views/' +
// Set the index the as the default page.
(reqPath ? pages[reqPath] : pages.index),
import.meta.url
)
// Set the index the as the default page. Serve as an html file by default.
const fileName = reqPath ? pages[reqPath] : pages.index,
supportedTypes = {
default: 'text/html',
html: 'text/html',
txt: 'text/plain',
xml: 'application/xml',
ico: 'image/vnd.microsoft.icon',
},
type =
supportedTypes[fileName.slice(fileName.lastIndexOf('.') + 1)] ||
supportedTypes.default;
reply.type(type);
if (type === supportedTypes.default)
reply.send(
paintSource(
loadTemplates(tryReadFile('../views/' + fileName, import.meta.url))
)
)
);
);
else reply.send(tryReadFile('../views/' + fileName, import.meta.url));
});
app.get('/github/:redirect', (req, reply) => {
@ -285,7 +354,7 @@ const encodingTable = (() => {
JSON.stringify('__uv$config')
);
app.get('/assets/js/common-16451543478.js', (req, reply) => {
app.get('/assets/js/common-1735118314.js', (req, reply) => {
reply
.type('text/javascript')
.send(
@ -293,9 +362,9 @@ app.get('/assets/js/common-16451543478.js', (req, reply) => {
'../views' + (config.minifyScripts ? '/dist' : '') + req.url
)
);
});
});
app.get('/uv/:file.js', (req, reply) => {
app.get('/network/:file.js', (req, reply) => {
const destination = existsSync(
fileURLToPath(new URL('../views' + req.url, import.meta.url))
)
@ -316,10 +385,9 @@ app.get('/uv/:file.js', (req, reply) => {
);
});
// Set an error page for invalid paths outside the query string system.
app.setNotFoundHandler((req, reply) => {
reply.code(404).type('text/html').send(preloaded404);
});
app.listen({ port: serverUrl.port, host: serverUrl.hostname });
console.log(`Holy Unblocker is listening on port ${serverUrl.port}.`);
console.log(`Holy Unblocker is listening on port ${serverUrl.port}.`);

@ -1 +1 @@
Subproject commit 0d36a401d2a90f9b2e05ccbc2f6637d277d67257
Subproject commit ba041c0299f34a83959dc3dc34427d34b94cbe70

View file

@ -123,12 +123,54 @@ img {
/* For WebKit/Blink Browsers */
::selection {
background: rgba(180, 142, 173, 0.513); /* Use rgba for opacity */
background: rgba(180, 142, 173, 0.513);
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background-color: var(--nord0);
border-radius: 5px;
}
::-webkit-scrollbar-thumb {
background-color: var(--nord0m1);
border-radius: 5px;
border: 3px solid var;
}
::-webkit-scrollbar-thumb:hover {
background-color: var(--nord0m1);
}
::-webkit-scrollbar-thumb:active {
background: var(--nord11);
border-radius: 5px;
border: 3px solid transparent;
background-clip: padding-box;
}
::-webkit-scrollbar-corner {
border-left: 1px solid var(--nord10);
border-top: 1px solid var(--nord10);
background: var(--nord10);
}
/* For Gecko Browsers (Firefox) */
::-moz-selection {
background: rgba(180, 142, 173, 0.513); /* Use rgba for opacity */
background: rgba(180, 142, 173, 0.513);
}
@-moz-document url-prefix() {
html {
scrollbar-color: var(--nord10) var(--nord0);
scrollbar-width: thin;
overflow-x: hidden;
}
}
.text-center {
@ -193,11 +235,11 @@ details[open] summary {
}
#header {
background-color: var(--nord0m1);
background-color: var(--nord0);
display: flex;
flex-flow: row wrap;
justify-content: space-between; /* Align items horizontally */
align-items: center; /* Align items vertically */
justify-content: space-between;
align-items: center;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.274);
padding: 15px 200px;
z-index: 2;
@ -205,14 +247,14 @@ details[open] summary {
}
#banner {
background-color: var(--nord0m3);
background-color: var(--nord0m1);
position: sticky;
top: 0;
border-top: 1px solid white;
border-bottom: 1px solid white;
font-weight: bold;
font-size: 14px;
padding: 12px;
font-size: 15px;
padding: 15px;
font-family: 'Figtree', sans-serif;
font-weight: 600;
z-index: 1;
animation: fadeInAnimation ease-in-out 0.3s;
animation-iteration-count: 1;
@ -221,13 +263,13 @@ details[open] summary {
#mainbody {
position: relative;
animation: fadeInAnimation ease-in-out 0.6s;
animation: fadeInAnimation ease-in-out 0.6s;
animation-iteration-count: 1;
animation-fill-mode: forwards;
overflow-x: clip;
}
#particles-js {
#background-animated {
background-color: var(--nord0);
position: fixed;
left: 0;
@ -265,7 +307,7 @@ details[open] summary {
.brand-logo-container,
.new {
display: flex;
align-items: center; /* Align items vertically */
align-items: center;
}
.brand {
@ -274,7 +316,7 @@ details[open] summary {
height: 30px;
line-height: 30px;
white-space: nowrap;
margin-right: 20px; /* Adjust margin as needed */
margin-right: 20px;
font-family: 'Figtree', sans-serif;
font-weight: 900;
letter-spacing: 1px;
@ -283,10 +325,10 @@ details[open] summary {
}
.logo {
width: 50px;
height: 50px;
width: 60px;
height: 60px;
margin-right: 20px;
background-image: url('/assets/img/icon.png'); /* Replace with your logo path */
background-image: url('/assets/img/icon.png');
background-size: cover;
}
@ -297,21 +339,12 @@ details[open] summary {
.logo-potato {
width: 20px;
height: 20px;
background-image: url('/assets/img/potato.webp'); /* Replace with your logo path */
background-image: url('/assets/img/potato.webp');
background-size: cover;
opacity: 0.5;
overflow: hidden;
}
.new::after {
content: '';
padding: 22.75px 25px;
margin-left: 8px;
background-image: url('/assets/img/new.svg');
background-size: cover;
font-size: 0;
}
/* -----------------------------------------------
/* Navigation Bar and Menus (Header Contents)
/* ----------------------------------------------- */
@ -321,58 +354,46 @@ details[open] summary {
color: var(--nord4) !important;
}
.navbar {
list-style: none;
padding: 0;
margin: 0;
display: flex;
align-items: center; /* Align items vertically */
letter-spacing: 1px;
order: 3;
}
.navbar > li {
margin-left: 50px; /* Adjust spacing between items */
}
.navbar > li > a {
text-decoration: none;
color: var(--nord4) !important;
}
.navbar-1 {
list-style: none;
padding: 0;
margin: 0;
display: flex; /* Ensure it stays horizontal */
align-items: center; /* Align items vertically */
display: flex;
align-items: center;
color: var(--nord4);
order: 2;
}
.navbar-1 > li {
margin-left: 30px; /* Adjust spacing between items */
margin-left: 30px;
}
.navbar-1 > li > a {
text-decoration: none;
color: var(--nord4);
display: inline-block;
}
.navbar .dropdown-child {
display: none;
position: absolute;
z-index: 5;
background-color: var(--nord0);
border: 1px solid var(--nord3);
border-radius: 10px;
cursor: auto;
padding: 15px 25px;
margin-top: 10px;
font-family: 'Titillium Web', sans-serif;
/* New badge styling */
.new {
position: relative;
}
/* "More" Navigation Menu */
.new::after {
content: '';
display: inline-block;
width: 84px;
height: 45px;
margin-left: 8px;
margin-top: 2px;
background-image: url('/assets/svg/new.svg');
background-size: contain;
background-repeat: no-repeat;
image-rendering: -webkit-optimize-contrast; /* Better SVG rendering */
vertical-align: middle;
}
/* Secondary Navigation Menu w/ Dropdown */
.subnavbar {
list-style: none;
@ -388,10 +409,76 @@ details[open] summary {
}
.subnavbar > li > a:hover {
background-color: var(--primary);
background-color: var(--nord11) !important;
}
/* "Settings" Navigation Menu */
.navbar {
list-style: none;
padding: 0;
margin: 0;
display: flex;
align-items: center;
letter-spacing: 1px;
order: 3;
}
.navbar > li {
margin-left: 50px;
}
.navbar > li > a {
text-decoration: none;
color: var(--nord4) !important;
font-size: 0.95rem;
font-weight: 500;
transition: color 0.3s ease;
}
.navbar > li > a:hover {
color: var(--nord11);
}
.navbar .dropdown-child {
display: none;
position: absolute;
z-index: 5;
background-color: var(--nord0);
border: 1px solid var(--nord3);
border-radius: 10px;
cursor: auto;
padding: 15px 25px;
margin-top: 15px;
font-family: 'Titillium Web', sans-serif;
opacity: 0;
transform: translateY(-20px);
transition: opacity 0.3s ease, transform 0.3s ease;
}
.dropdown-parent:focus-within .dropdown-child {
display: block;
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.subnavbar {
list-style: none;
padding: 0;
}
.subnavbar > li > a {
display: block;
padding: 5px 15px;
border-radius: 5px;
color: var(--nord4);
transition: background-color 0.3s ease, color 0.3s ease;
text-decoration: none !important;
}
.subnavbar > li > a:hover {
background-color: var(--primary);
color: var(--nord0);
}
.navbar .dropdown-settings {
display: none;
@ -401,20 +488,24 @@ details[open] summary {
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5); /* Semi-transparent background */
backdrop-filter: blur(10px); /* Blurs the background */
z-index: 5; /* Ensures it appears above other content */
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(10px);
z-index: 5;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.dropdown-parent:focus-within
.dropdown-settings:not(:is(:has(.close-settings-btn:active))) {
display: flex; /* Flexbox to center content */
display: flex;
pointer-events: auto;
opacity: 1;
}
.dropdown-parent:focus-within .dropdown-child {
display: block;
.dropdown-parent:focus-within .dropdown-settings {
opacity: 1;
}
/* Settings Menu (Updated) */
@ -423,12 +514,12 @@ details[open] summary {
.settings-content {
pointer-events: auto;
background-color: rgba(46, 52, 64, 0.2); /* Adding transparency */
background-color: rgba(46, 52, 64, 0.2);
border: 1px solid #4c566a;
border-radius: 10px;
padding: 25px;
z-index: 6;
width: 800px; /* Width to accommodate both columns */
width: 800px;
max-height: 90vh;
overflow-y: auto;
margin: 5vh auto;
@ -438,7 +529,7 @@ details[open] summary {
flex-direction: column;
backdrop-filter: blur(10px); /* Frosted glass effect */
-webkit-backdrop-filter: blur(10px); /* For Safari */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Optional: Add some shadow for depth */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Add some shadow for depth */
}
.settings-header {
@ -472,23 +563,23 @@ details[open] summary {
.settings-content-body {
display: flex;
gap: 40px; /* Space between left and right columns */
gap: 40px;
}
.csel-container-left,
.settings-right-column {
display: flex;
flex-direction: column;
gap: 15px; /* Space between items within columns */
gap: 15px;
}
.csel-container-left {
flex: 1;
max-width: 400px; /* Adjusted to fit content without gaps */
max-width: 400px;
}
.settings-right-column {
width: 300px; /* Fixed width for the right column */
width: 300px;
}
.cseltitle {
@ -500,40 +591,40 @@ details[open] summary {
.radio-group {
display: flex;
flex-direction: column;
gap: 10px; /* Increased space between items for clarity */
gap: 10px;
margin-bottom: 15px;
}
.radio-group label {
display: flex;
align-items: center; /* Align items vertically */
justify-content: space-between; /* Aligns text to the left and input to the right */
align-items: center;
justify-content: space-between;
color: #eceff4;
font-size: 16px;
max-width: 100%; /* Ensure label doesn't exceed container width */
max-width: 100%;
}
.radio-group p {
margin: 0;
flex: 1; /* Take up available space */
flex: 1;
}
.radio-group input[type='radio'] {
accent-color: #88c0d0;
cursor: pointer;
width: 20px; /* Adjust size for better appearance */
width: 20px;
height: 20px;
background-color: #3b4252; /* Default background color */
background-color: #3b4252;
}
.switch-container {
display: flex;
align-items: center; /* Align items vertically centered */
justify-content: space-between; /* Distribute space between items */
align-items: center;
justify-content: space-between;
}
.switch-container p {
margin: 0; /* Remove default margin to align properly */
margin: 0;
}
.switch {
@ -577,7 +668,7 @@ select {
border-radius: 5px;
color: #eceff4;
max-width: 300px;
box-sizing: border-box; /* Include padding and border in the element's total width and height */
box-sizing: border-box;
}
select:hover {
@ -799,14 +890,16 @@ input[type='text'] {
display: flex;
align-items: center;
justify-content: space-between;
padding: 100px 0 100px 10%;
height: max(85vh, 25em);
flex-direction: column;
padding: 170px 0 170px 0;
gap: 150px;
box-sizing: border-box;
}
.home-text {
max-width: 600px;
max-width: 750px;
flex: 1;
text-align: center;
}
.home-text h1 {
@ -828,7 +921,7 @@ input[type='text'] {
.mac-window {
flex: 1;
max-width: 800px;
max-width: 1100px;
height: 510px;
border: 1px solid var(--nord0);
border-radius: 12px;
@ -895,9 +988,14 @@ input[type='text'] {
font-size: 18px;
}
.downarrowgroup {
color: var(--nord3);
margin-left: 80%;
}
.cmd {
color: #a4bbd1;
white-space: pre-wrap; /* Preserve new lines */
white-space: pre-wrap;
}
.cmd::before {
@ -1042,13 +1140,11 @@ iner .splashstrokeheader {
.hero-grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 40px;
margin: 40px auto;
width: 90%;
max-width: 1200px;
max-width: 1250px;
background-color: rgba(46, 52, 64, 0.2);
border-radius: 10px;
padding: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
-webkit-backdrop-filter: blur(10px);
@ -1109,6 +1205,10 @@ iner .splashstrokeheader {
}
}
#scrollfix {
margin-bottom: 20px;
}
.box-hero {
display: flex;
align-items: center;
@ -1185,8 +1285,8 @@ iner .splashstrokeheader {
}
.hero {
width: 100%; /* Ensure the image takes full width of its container */
max-width: 300px; /* Ensure the image doesn't exceed its container */
width: 100%;
max-width: 300px;
height: auto;
border-radius: 50%;
}
@ -1217,7 +1317,7 @@ iner .splashstrokeheader {
gap: 80px;
margin: 80px;
margin-top: 300px;
padding: 0 20px; /* Add padding to prevent overflow */
padding: 0 20px;
box-sizing: border-box;
}
@ -1283,7 +1383,7 @@ iner .splashstrokeheader {
top: 50%;
transform: translateY(-50%);
width: 30%;
max-width: 180px; /* Add a max-width to prevent it from getting too large */
max-width: 180px;
height: auto;
background-color: var(--nord0m3);
border-radius: 10px;
@ -1316,16 +1416,15 @@ iner .splashstrokeheader {
margin-bottom: 100px;
}
/* Main container with increased margin and padding */
.box-main-container {
display: flex;
align-items: center; /* Center items vertically */
justify-content: space-between; /* Space between text and image */
max-width: 1300px; /* Adjust to your desired max width */
margin: 50px auto 200px auto; /* Increased top margin for distance from navbar */
padding: 20px; /* Padding inside the container */
gap: 20%; /* Flexible gap between text and image */
position: relative; /* Positioning for the divider */
align-items: center;
justify-content: space-between;
max-width: 1300px;
margin: 50px auto 200px auto;
padding: 20px;
gap: 20%;
position: relative;
}
/* Badge styling */
@ -1346,20 +1445,17 @@ iner .splashstrokeheader {
margin: 0 5px;
}
/* Text container with padding */
.box-text-container {
max-width: 600px; /* Adjust to control text container width */
padding: 20px; /* Padding inside the text container */
max-width: 600px;
padding: 20px;
}
/* Headline styling with underline */
.box-text-container > h1 {
font-size: 2.5rem;
font-weight: 900;
color: rgb(255, 88, 97);
}
/* Description styling */
.box-description {
font-size: 1.2rem;
margin: 30px 0;
@ -1367,7 +1463,6 @@ iner .splashstrokeheader {
color: var(--nord4);
}
/* Button container styling */
.box-button-container {
margin-top: 20px;
}
@ -1389,48 +1484,47 @@ iner .splashstrokeheader {
/* Image container */
.box-image-container {
display: flex;
align-items: center; /* Center image vertically */
margin-left: auto; /* Push image container to the right */
align-items: center;
margin-left: auto;
}
.box-pr-logo {
max-width: 100%;
height: auto;
width: 600px; /* Fixed width of the image */
width: 600px;
}
/* Line divider styling */
.box-line-divider {
position: absolute;
bottom: -50px; /* Position below the main container */
bottom: -50px;
left: 50%;
transform: translateX(-50%); /* Center horizontally */
transform: translateX(-50%);
width: 80%;
height: 1px;
background-color: var(--nord11); /* Semi-transparent line */
background-color: var(--nord11);
opacity: 0.2;
}
/* Media queries for responsiveness */
@media (max-width: 768px) {
.box-main-container {
flex-direction: column; /* Stack text and image vertically on smaller screens */
align-items: center; /* Center items horizontally */
gap: 20px; /* Reduce gap on smaller screens */
position: relative; /* Ensure divider is correctly positioned */
flex-direction: column;
align-items: center;
gap: 20px;
position: relative;
}
.box-text-container {
max-width: 100%; /* Full width on smaller screens */
text-align: center; /* Center text on smaller screens */
max-width: 100%;
text-align: center;
}
.box-image-container {
margin-left: 0; /* Reset margin on smaller screens */
margin-left: 0;
}
.box-pr-logo {
width: 100%; /* Full width on smaller screens */
width: 100%;
}
}
@ -1518,33 +1612,6 @@ iner .splashstrokeheader {
background-color: var(--nord1);
}
/* Advertisements, obviously. */
.ad {
position: absolute;
margin: 0 20px;
width: 100px;
height: 100%;
background-color: var(--nord1);
overflow: hidden;
display: none;
z-index: 1;
}
#ad-right {
right: 0;
}
.ad::before {
content: 'Advertisement';
font-family: 'Titillium Web', sans-serif;
position: absolute;
z-index: -1;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* -----------------------------------------------
/* Proxy Pages
/* ----------------------------------------------- */
@ -1565,6 +1632,7 @@ iner .splashstrokeheader {
border-radius: 5px;
padding: 10px 12px;
color: white;
background-color: #22262f;
font-family: 'Montserrat Alternates', sans-serif;
font-size: 20px;
margin: 3px;
@ -1778,9 +1846,12 @@ iner .splashstrokeheader {
/* Pulse Hover Animation */
.pulse {
will-change: transform;
}
@keyframes pulse {
0%,
100% {
0%, 100% {
transform: scale(1);
}
50% {
@ -1793,8 +1864,7 @@ iner .splashstrokeheader {
background-color 0.3s ease,
color 0.3s ease,
transform 0.3s ease;
transform: scale(1.05);
-webkit-font-smoothing: subpixel-antialiased;
transform: scale(1.05) translateZ(0);
}
/* Glowing Button Animation */
@ -2250,4 +2320,4 @@ iner .splashstrokeheader {
.splashend > h1 {
font-size: 1.625em;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Before After
Before After

View file

@ -2,7 +2,7 @@
await loadFull(tsParticles);
await tsParticles.load({
id: 'particles-js',
id: 'background-animated',
options: {
background: {
color: { value: '#1d232a' },

View file

@ -1,581 +0,0 @@
/* -----------------------------------------------
/* Authors: QuiteAFancyEmerald, Yoct, and OlyB
/* GNU Affero General Public License v3.0: https://www.gnu.org/licenses/agpl-3.0.en.html
/* MAIN Holy Unblocker LTS Common Script
/* ----------------------------------------------- */
// Encase everything in a new scope so that variables are not accidentally
// attached to the global scope.
(() => {
// To be defined after the document has fully loaded.
let uvConfig = {};
// Get the preferred apex domain name. Not exactly apex, as any
// subdomain other than those listed will be ignored.
const getDomain = () =>
location.host.replace(/^(?:www|edu|cooking|beta)\./, ''),
// This is used for stealth mode when visiting external sites.
goFrame = (url) => {
localStorage.setItem('huframesrc', url);
location.href = '/s';
},
/* Used to set functions for the goProx object at the bottom.
* See the goProx object at the bottom for some usage examples
* on the URL handlers, omnibox functions, and the uvUrl and
* RammerheadEncode functions.
*/
urlHandler = (parser) =>
typeof parser === 'function'
? // Return different functions based on whether a URL has already been set.
// Should help avoid confusion when using or adding to the goProx object.
(url, mode) => {
if (!url) return;
url = parser(url);
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(url);
else if (mode === 'window' || mode == 0) location.href = url;
else return url;
}
: (mode) => {
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(parser);
else if (mode === 'window' || mode == 0) location.href = parser;
else return parser;
},
// An asynchronous version of the function above, just in case.
asyncUrlHandler = (parser) => async (url, mode) => {
if (!url) return;
if (typeof parser === 'function') url = await parser(url);
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(url);
else if (mode === 'window' || mode == 0) location.href = url;
else return url;
};
/* COOKIE AUTH DEMO */
const setAuthCookie = (s, lax) => {
document.cookie =
s +
`; expires=${Date.now() + 259200}; SameSite=${lax ? 'Lax' : 'None'}; domain=.${getDomain()}; path=/; Secure;`;
};
/* OMNIBOX */
// Search engine is set to Bing. Intended to work just like the usual
// bar at the top of a browser.
const sx = 'bing.com' + '/search?q=',
/*
omnibox = url =>
(url.indexOf("http")
? "https://" + (url.indexOf(".") < 1 ? sx : "")
: "")
+ url;
*/
// Another omnibox function. Unsure if the version above is needed.
search = (input, template = `https://${sx}%s`) => {
try {
// Return the input if it is already a valid URL.
// eg: https://example.com, https://example.com/test?q=param
return new URL(input) + '';
} catch (e) {
// Continue if it is invalid.
}
try {
// Check if the input is valid when http:// is added to the start.
// eg: example.com, https://example.com/test?q=param
const url = new URL(`http://${input}`);
// Return only if the hostname has a TLD or a subdomain.
if (url.hostname.indexOf('.') != -1) return url + '';
} catch (e) {
// Continue if it is invalid.
}
// Treat the input as a search query instead of a website.
return template.replace('%s', encodeURIComponent(input));
},
// Parse a URL to use with Ultraviolet.
uvUrl = (url) => {
try {
url =
location.origin +
uvConfig.prefix +
uvConfig.encodeUrl(search(url));
} catch (e) {
// This is for cases where the Ultraviolet scripts have not been loaded.
url = search(url);
}
return url;
};
/* RAMMERHEAD CONFIGURATION */
// Parse a URL to use with Rammerhead. Only usable if the server is active.
const RammerheadEncode = async (baseUrl) => {
// Hellhead
const mod = (n, m) => ((n % m) + m) % m,
baseDictionary =
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-',
shuffledIndicator = '_rhs',
// Return a copy of the base dictionary with a randomized character order.
// Will be used as a Caesar cipher for URL encoding.
generateDictionary = () => {
let str = '';
const split = baseDictionary.split('');
while (split.length > 0) {
// Using .splice automatically rounds down to the nearest whole number.
str += split.splice(Math.random() * split.length, 1)[0];
}
return str;
};
class StrShuffler {
constructor(dictionary = generateDictionary()) {
this.dictionary = dictionary;
}
shuffle(str) {
// Do not reshuffle an already shuffled string.
if (!str.indexOf(shuffledIndicator)) return str;
let shuffledStr = '';
for (let i = 0; i < str.length; i++) {
const char = str[i],
idx = baseDictionary.indexOf(char);
/* For URL encoded characters and characters not included in the
* dictionary, leave untouched. Otherwise, replace with a character
* from the dictionary.
*/
if (char === '%' && str.length - i >= 3)
// A % symbol denotes that the next 2 characters are URL encoded.
shuffledStr += char + str[++i] + str[++i];
// Do not modify unrecognized characters.
else if (idx == -1) shuffledStr += char;
// Find the corresponding dictionary entry and use the character
// that is i places to the right of it.
else
shuffledStr += this.dictionary[mod(idx + i, baseDictionary.length)];
}
// Add a prefix signifying that the string has been shuffled.
return shuffledIndicator + shuffledStr;
}
// Unshuffling is currently not done on the client side, and likely
// won't ever be for this implementation. It is used by the server instead.
unshuffle(str) {
// Do not unshuffle an already unshuffled string.
if (str.indexOf(shuffledIndicator)) return str;
// Remove the prefix signifying that the string has been shuffled.
str = str.slice(shuffledIndicator.length);
let unshuffledStr = '';
for (let i = 0; i < str.length; i++) {
const char = str[i],
idx = this.dictionary.indexOf(char);
/* Convert the dictionary entry characters back into their base
* characters using the base dictionary. Again, leave URL encoded
* characters and unrecognized symbols alone.
*/
if (char === '%' && str.length - i >= 3)
unshuffledStr += char + str[++i] + str[++i];
else if (idx == -1) unshuffledStr += char;
// Find the corresponding base character entry and use the character
// that is i places to the left of it.
else
unshuffledStr += baseDictionary[mod(idx - i, baseDictionary.length)];
}
return unshuffledStr;
}
}
// Request information that's beiing stored elsewhere on the server.
// Executes the callback function if the server responds as intended.
const get = (url, callback, shush = false) => {
let request = new XMLHttpRequest();
request.open('GET', url, true);
request.send();
request.onerror = () => {
if (!shush) console.log('Cannot communicate with the server');
};
request.onload = () => {
if (request.status === 200) callback(request.responseText);
else if (!shush)
console.log(
`Unexpected server response to not match "200". Server says "${request.responseText}"`
);
};
},
// Functions for interacting with Rammerhead backend code on the server.
api = {
// Make a new Rammerhead session and do something with it.
newsession(callback) {
get('/newsession', callback);
},
// Check if a session with the specified ID exists, then do something.
sessionexists(id, callback) {
get('/sessionexists?id=' + encodeURIComponent(id), (res) => {
if (res === 'exists') return callback(true);
if (res === 'not found') return callback(false);
console.log('Unexpected response from server. Received ' + res);
});
},
// Request a brand new encoding table to use for Rammerhead.
shuffleDict(id, callback) {
console.log('Shuffling', id);
get('/api/shuffleDict?id=' + encodeURIComponent(id), (res) => {
callback(JSON.parse(res));
});
},
},
/* Organize Rammerhead sessions via the browser's local storage.
* Local data consists of session creation timestamps and session IDs.
* The rest of the data is stored on the server.
*/
localStorageKey = 'rammerhead_sessionids',
localStorageKeyDefault = 'rammerhead_default_sessionid',
sessionIdsStore = {
// Get the local data of all stored sessions.
get() {
const rawData = localStorage.getItem(localStorageKey);
if (!rawData) return [];
try {
const data = JSON.parse(rawData);
// Catch invalidly stored Rammerhead session data. Either that or
// it's poorly spoofed.
if (!Array.isArray(data)) throw 'getout';
return data;
} catch (e) {
return [];
}
},
// Store local Rammerhead session data in the form of an array.
set(data) {
if (!Array.isArray(data)) throw new TypeError('Must be an array.');
localStorage.setItem(localStorageKey, JSON.stringify(data));
},
// Get the default session data.
getDefault() {
const sessionId = localStorage.getItem(localStorageKeyDefault);
if (sessionId) {
let data = sessionIdsStore.get();
data.filter((session) => session.id === sessionId);
if (data.length) return data[0];
}
return null;
},
// Set a new default session based on a given session ID.
setDefault(id) {
localStorage.setItem(localStorageKeyDefault, id);
},
},
// Store or update local data for a Rammerhead session, which consists of
// the session's ID and when the session was last created.
addSession = (id) => {
let data = sessionIdsStore.get();
data.unshift({ id: id, createdOn: new Date().toLocaleString() });
sessionIdsStore.set(data);
},
// Attempt to load an existing session that has been stored on the server.
getSessionId = () => {
return new Promise((resolve) => {
// Check if the browser has stored an existing session.
const id = localStorage.getItem('session-string');
api.sessionexists(id, (value) => {
// Create a new session if Rammerhead can't find an existing session.
if (!value) {
console.log('Session validation failed');
api.newsession((id) => {
addSession(id);
localStorage.setItem('session-string', id);
console.log(id);
console.log('^ new id');
resolve(id);
});
}
// Load the stored session now that Rammerhead has found it.
else resolve(id);
});
});
};
// Load the URL that was last visited in the Rammerhead session.
return getSessionId().then(
(id) =>
new Promise((resolve) => {
api.shuffleDict(id, (shuffleDict) => {
// Encode the URL with Rammerhead's encoding table and return the URL.
resolve(`/${id}/` + new StrShuffler(shuffleDict).shuffle(baseUrl));
});
})
);
};
/* To use:
* goProx.proxy(url-string, mode-as-string-or-number);
*
* Key: 1 = "stealth"
* 0 = "window"
* Nothing = return URL as a string
*
* Examples:
* Stealth mode -
* goProx.ultraviolet("https://google.com", 1);
* goProx.ultraviolet("https://google.com", "stealth");
*
* await goProx.rammerhead("https://google.com", 1);
* await goProx.rammerhead("https://google.com", "stealth");
*
* goProx.searx(1);
* goProx.searx("stealth");
*
* Window mode -
* goProx.ultraviolet("https://google.com", "window");
*
* await goProx.rammerhead("https://google.com", "window");
*
* goProx.searx("window");
*
* Return string value mode (default) -
* goProx.ultraviolet("https://google.com");
*
* await goProx.rammerhead("https://google.com");
*
* goProx.searx();
*/
addEventListener('DOMContentLoaded', async () => {
// This won't break the service workers as they store the variable separately.
uvConfig = self['{{__uv$config}}'];
delete self['{{__uv$config}}'];
// Object.freeze prevents goProx from accidentally being edited.
const goProx = Object.freeze({
// `location.protocol + "//" + getDomain()` more like `location.origin`
// setAuthCookie("__cor_auth=1", false);
ultraviolet: urlHandler(uvUrl),
rammerhead: asyncUrlHandler(
async (url) => location.origin + (await RammerheadEncode(search(url)))
),
searx: urlHandler(location.protocol + `//c.${getDomain()}/engine/`),
libreddit: urlHandler(location.protocol + '//c.' + getDomain()),
rnav: urlHandler(location.protocol + '//client.' + getDomain()),
osu: urlHandler(location.origin + '/archive/osu'),
mcnow: urlHandler(uvUrl('https://now.gg/play/a/10010/b')),
glife: urlHandler(uvUrl('https://now.gg/apps/lunime/5767/gacha-life.html')),
roblox: urlHandler(
uvUrl('https://now.gg/apps/roblox-corporation/5349/roblox.html')
),
amongus: urlHandler(
uvUrl('https://now.gg/apps/innersloth-llc/4047/among-us.html')
),
pubg: urlHandler(
uvUrl('https://now.gg/apps/proxima-beta/2609/pubg-mobile-resistance.html')
),
train: urlHandler(uvUrl('https://hby.itch.io/last-train-home')),
village: urlHandler(uvUrl('https://kwoodhouse.itch.io/village-arsonist')),
prison: urlHandler(uvUrl('https://vimlark.itch.io/pick-up-prison')),
rpg: urlHandler(uvUrl('https://alarts.itch.io/die-in-the-dungeon')),
speed: urlHandler(uvUrl('https://captain4lk.itch.io/what-the-road-brings')),
heli: urlHandler(uvUrl('https://benjames171.itch.io/helo-storm')),
youtube: urlHandler(uvUrl('https://youtube.com')),
discordUV: urlHandler(uvUrl('https://discord.com/app')),
discordRH: urlHandler(await RammerheadEncode('https://discord.com/app')),
});
// Attach event listeners using goProx to specific app menus that need it.
const prSet = (id, type) => {
const formElement = document.getElementById(id);
if (!formElement) return;
let prUrl = formElement.querySelector('input[type=text]'),
prGo1 = document.querySelectorAll(`#${id}.pr-go1, #${id} .pr-go1`),
prGo2 = document.querySelectorAll(`#${id}.pr-go2, #${id} .pr-go2`);
// Handle the other menu buttons differently if there is no omnibox. Menus
// which lack an omnibox likely use buttons as mere links.
const goProxMethod = prUrl
? (mode) => () => {
goProx[type](prUrl.value, mode);
}
: (mode) => () => {
goProx[type](mode);
},
// Ultraviolet is currently incompatible with window mode.
searchMode = type === 'ultraviolet' ? 'stealth' : 'window';
if (prUrl)
prUrl.addEventListener('keydown', async (e) => {
if (e.code === 'Enter') goProxMethod(searchMode)();
// This is exclusively used for the validator script.
else if (e.code === 'Validator Test') {
e.target.value = await goProx[type](e.target.value);
e.target.dispatchEvent(new Event('change'));
}
});
prGo1.forEach((element) => {
element.addEventListener('click', goProxMethod('window'));
});
prGo2.forEach((element) => {
element.addEventListener('click', goProxMethod('stealth'));
});
};
prSet('pr-uv', 'ultraviolet');
prSet('pr-rh', 'rammerhead');
prSet('pr-yt', 'youtube');
prSet('pr-rh-dc', 'discordRH');
prSet('pr-uv-dc', 'discordUV');
// Load in relevant JSON files used to organize large sets of data.
// This first one is for links, whereas the rest are for navigation menus.
const huLinks = await fetch('/assets/json/links.json', {
mode: 'same-origin',
}).then((response) => response.json());
for (let items = Object.entries(huLinks), i = 0; i < items.length; i++)
// Replace all placeholder links with the corresponding entry in huLinks.
(document.getElementById(items[i][0]) || {}).href = items[i][1];
const navLists = {
// Pair an element ID with a JSON file name. They are identical for now.
'emu-nav': 'emu-nav',
'emulib-nav': 'emulib-nav',
'flash-nav': 'flash-nav',
'h5-nav': 'h5-nav',
};
for (const [listId, filename] of Object.entries(navLists)) {
let navList = document.getElementById(listId);
if (navList) {
// List items stored in JSON format will be returned as a JS object.
const data = await fetch(`/assets/json/${filename}.json`, {
mode: 'same-origin',
}).then((response) => response.json());
// Load the JSON lists into specific HTML parent elements as groups of
// child elements, if the parent element is found.
switch (filename) {
case 'emu-nav':
case 'emulib-nav':
case 'h5-nav': {
const dirnames = {
// Set the directory of where each item of the corresponding JSON
// list will be retrieved from.
'emu-nav': 'emu',
'emulib-nav': 'emulib',
'h5-nav': 'h5g',
},
dir = dirnames[filename],
// Add a little functionality for each list item when clicked on.
clickHandler = (parser, a) => (e) => {
if (e.target == a || e.target.tagName != 'A') {
e.preventDefault();
parser();
}
};
for (let i = 0; i < data.length; i++) {
// Load each item as an anchor tag with an image, heading,
// description, and click event listener.
const item = data[i],
a = document.createElement('a'),
img = document.createElement('img'),
title = document.createElement('h3'),
desc = document.createElement('p');
a.href = '#';
img.src = `/assets/img/${dir}/` + item.img;
title.textContent = item.name;
desc.textContent = item.description;
if (filename === 'h5-nav') {
if (item.credits === 'itch')
desc.innerHTML +=
'<br>Credits: Game can be found <a target="_blank" href="https://itch.io">here</a>.';
if (item.credits === 'nowgg')
desc.innerHTML +=
'<br>Credits: Game can be found <a target="_blank" href="https://now.gg">here</a>.';
}
a.appendChild(img);
a.appendChild(title);
a.appendChild(desc);
// Which function is used for the click event is determined by
// the corresponding location/index in the dirnames object.
const functionsList = [
() => goFrame(item.path),
() => goFrame('/webretro?core=' + item.core + '&rom=' + item.rom),
item.custom
? () => goProx[item.custom]('stealth')
: () => goFrame('/archive/g/' + item.path),
];
a.addEventListener(
'click',
clickHandler(
functionsList[Object.values(dirnames).indexOf(dir)],
a
)
);
navList.appendChild(a);
}
break;
}
case 'flash-nav':
for (let i = 0; i < data.length; i++) {
// Load each item as an anchor tag with a short title and click
// event listener.
const item = data[i],
a = document.createElement('a');
a.href = '#';
a.textContent = item.slice(0, -4);
a.addEventListener('click', (e) => {
e.preventDefault();
goFrame('/flash?swf=' + item);
});
navList.appendChild(a);
}
break;
// No default case.
}
}
}
});
})();

View file

@ -0,0 +1,591 @@
/* -----------------------------------------------
/* Authors: QuiteAFancyEmerald, Yoct, and OlyB
/* GNU Affero General Public License v3.0: https://www.gnu.org/licenses/agpl-3.0.en.html
/* MAIN Holy Unblocker LTS Common Script
/* ----------------------------------------------- */
// Encase everything in a new scope so that variables are not accidentally
// attached to the global scope.
(() => {
// To be defined after the document has fully loaded.
let uvConfig = {};
// Get the preferred apex domain name. Not exactly apex, as any
// subdomain other than those listed will be ignored.
const getDomain = () =>
location.host.replace(/^(?:www|edu|cooking|beta)\./, ''),
// This is used for stealth mode when visiting external sites.
goFrame = (url) => {
localStorage.setItem('huframesrc', url);
location.href = '/s';
},
/* Used to set functions for the goProx object at the bottom.
* See the goProx object at the bottom for some usage examples
* on the URL handlers, omnibox functions, and the uvUrl and
* RammerheadEncode functions.
*/
urlHandler = (parser) =>
typeof parser === 'function'
? // Return different functions based on whether a URL has already been set.
// Should help avoid confusion when using or adding to the goProx object.
(url, mode) => {
if (!url) return;
url = parser(url);
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(url);
else if (mode === 'window' || mode == 0) location.href = url;
else return url;
}
: (mode) => {
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(parser);
else if (mode === 'window' || mode == 0) location.href = parser;
else return parser;
},
// An asynchronous version of the function above, just in case.
asyncUrlHandler = (parser) => async (url, mode) => {
if (!url) return;
if (typeof parser === 'function') url = await parser(url);
mode = `${mode}`.toLowerCase();
if (mode === 'stealth' || mode == 1) goFrame(url);
else if (mode === 'window' || mode == 0) location.href = url;
else return url;
};
/* COOKIE AUTH DEMO */
const setAuthCookie = (s, lax) => {
document.cookie =
s +
`; expires=${Date.now() + 259200}; SameSite=${lax ? 'Lax' : 'None'}; domain=.${getDomain()}; path=/; Secure;`;
};
/* OMNIBOX */
// Search engine is set to Bing. Intended to work just like the usual
// bar at the top of a browser.
const sx = 'duckduckgo.com/?q=',
/*
omnibox = url =>
(url.indexOf("http")
? "https://" + (url.indexOf(".") < 1 ? sx : "")
: "")
+ url;
*/
// Another omnibox function. Unsure if the version above is needed.
search = (input, template = `https://${sx}%s`) => {
try {
// Return the input if it is already a valid URL.
// eg: https://example.com, https://example.com/test?q=param
return new URL(input) + '';
} catch (e) {
// Continue if it is invalid.
}
try {
// Check if the input is valid when http:// is added to the start.
// eg: example.com, https://example.com/test?q=param
const url = new URL(`http://${input}`);
// Return only if the hostname has a TLD or a subdomain.
if (url.hostname.indexOf('.') != -1) return url + '';
} catch (e) {
// Continue if it is invalid.
}
// Treat the input as a search query instead of a website.
return template.replace('%s', encodeURIComponent(input));
},
// Parse a URL to use with Ultraviolet.
uvUrl = (url) => {
try {
url =
location.origin +
uvConfig.prefix +
uvConfig.encodeUrl(search(url));
} catch (e) {
// This is for cases where the Ultraviolet scripts have not been loaded.
url = search(url);
}
return url;
},
// Parse a URL to use with Scramjet.
sjUrl = (url) => {
try {
url =
location.origin +
"/worker/service/" +
search(url);
} catch (e) {
// This is for cases where the SJ scripts have not been loaded.
url = search(url);
}
return url;
};
/* RAMMERHEAD CONFIGURATION */
// Parse a URL to use with Rammerhead. Only usable if the server is active.
const RammerheadEncode = async (baseUrl) => {
// Hellhead
const mod = (n, m) => ((n % m) + m) % m,
baseDictionary =
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-',
shuffledIndicator = '_rhs',
// Return a copy of the base dictionary with a randomized character order.
// Will be used as a Caesar cipher for URL encoding.
generateDictionary = () => {
let str = '';
const split = baseDictionary.split('');
while (split.length > 0) {
// Using .splice automatically rounds down to the nearest whole number.
str += split.splice(Math.random() * split.length, 1)[0];
}
return str;
};
class StrShuffler {
constructor(dictionary = generateDictionary()) {
this.dictionary = dictionary;
}
shuffle(str) {
// Do not reshuffle an already shuffled string.
if (!str.indexOf(shuffledIndicator)) return str;
let shuffledStr = '';
for (let i = 0; i < str.length; i++) {
const char = str[i],
idx = baseDictionary.indexOf(char);
/* For URL encoded characters and characters not included in the
* dictionary, leave untouched. Otherwise, replace with a character
* from the dictionary.
*/
if (char === '%' && str.length - i >= 3)
// A % symbol denotes that the next 2 characters are URL encoded.
shuffledStr += char + str[++i] + str[++i];
// Do not modify unrecognized characters.
else if (idx == -1) shuffledStr += char;
// Find the corresponding dictionary entry and use the character
// that is i places to the right of it.
else
shuffledStr += this.dictionary[mod(idx + i, baseDictionary.length)];
}
// Add a prefix signifying that the string has been shuffled.
return shuffledIndicator + shuffledStr;
}
// Unshuffling is currently not done on the client side, and likely
// won't ever be for this implementation. It is used by the server instead.
unshuffle(str) {
// Do not unshuffle an already unshuffled string.
if (str.indexOf(shuffledIndicator)) return str;
// Remove the prefix signifying that the string has been shuffled.
str = str.slice(shuffledIndicator.length);
let unshuffledStr = '';
for (let i = 0; i < str.length; i++) {
const char = str[i],
idx = this.dictionary.indexOf(char);
/* Convert the dictionary entry characters back into their base
* characters using the base dictionary. Again, leave URL encoded
* characters and unrecognized symbols alone.
*/
if (char === '%' && str.length - i >= 3)
unshuffledStr += char + str[++i] + str[++i];
else if (idx == -1) unshuffledStr += char;
// Find the corresponding base character entry and use the character
// that is i places to the left of it.
else
unshuffledStr += baseDictionary[mod(idx - i, baseDictionary.length)];
}
return unshuffledStr;
}
}
// Request information that's beiing stored elsewhere on the server.
// Executes the callback function if the server responds as intended.
const get = (url, callback, shush = false) => {
let request = new XMLHttpRequest();
request.open('GET', url, true);
request.send();
request.onerror = () => {
if (!shush) console.log('Cannot communicate with the server');
};
request.onload = () => {
if (request.status === 200) callback(request.responseText);
else if (!shush)
console.log(
`Unexpected server response to not match "200". Server says "${request.responseText}"`
);
};
},
// Functions for interacting with Rammerhead backend code on the server.
api = {
// Make a new Rammerhead session and do something with it.
newsession(callback) {
get('/newsession', callback);
},
// Check if a session with the specified ID exists, then do something.
sessionexists(id, callback) {
get('/sessionexists?id=' + encodeURIComponent(id), (res) => {
if (res === 'exists') return callback(true);
if (res === 'not found') return callback(false);
console.log('Unexpected response from server. Received ' + res);
});
},
// Request a brand new encoding table to use for Rammerhead.
shuffleDict(id, callback) {
console.log('Shuffling', id);
get('/api/shuffleDict?id=' + encodeURIComponent(id), (res) => {
callback(JSON.parse(res));
});
},
},
/* Organize Rammerhead sessions via the browser's local storage.
* Local data consists of session creation timestamps and session IDs.
* The rest of the data is stored on the server.
*/
localStorageKey = 'rammerhead_sessionids',
localStorageKeyDefault = 'rammerhead_default_sessionid',
sessionIdsStore = {
// Get the local data of all stored sessions.
get() {
const rawData = localStorage.getItem(localStorageKey);
if (!rawData) return [];
try {
const data = JSON.parse(rawData);
// Catch invalidly stored Rammerhead session data. Either that or
// it's poorly spoofed.
if (!Array.isArray(data)) throw 'getout';
return data;
} catch (e) {
return [];
}
},
// Store local Rammerhead session data in the form of an array.
set(data) {
if (!Array.isArray(data)) throw new TypeError('Must be an array.');
localStorage.setItem(localStorageKey, JSON.stringify(data));
},
// Get the default session data.
getDefault() {
const sessionId = localStorage.getItem(localStorageKeyDefault);
if (sessionId) {
let data = sessionIdsStore.get();
data.filter((session) => session.id === sessionId);
if (data.length) return data[0];
}
return null;
},
// Set a new default session based on a given session ID.
setDefault(id) {
localStorage.setItem(localStorageKeyDefault, id);
},
},
// Store or update local data for a Rammerhead session, which consists of
// the session's ID and when the session was last created.
addSession = (id) => {
let data = sessionIdsStore.get();
data.unshift({ id: id, createdOn: new Date().toLocaleString() });
sessionIdsStore.set(data);
},
// Attempt to load an existing session that has been stored on the server.
getSessionId = () => {
return new Promise((resolve) => {
// Check if the browser has stored an existing session.
const id = localStorage.getItem('session-string');
api.sessionexists(id, (value) => {
// Create a new session if Rammerhead can't find an existing session.
if (!value) {
console.log('Session validation failed');
api.newsession((id) => {
addSession(id);
localStorage.setItem('session-string', id);
console.log(id);
console.log('^ new id');
resolve(id);
});
}
// Load the stored session now that Rammerhead has found it.
else resolve(id);
});
});
};
// Load the URL that was last visited in the Rammerhead session.
return getSessionId().then(
(id) =>
new Promise((resolve) => {
api.shuffleDict(id, (shuffleDict) => {
// Encode the URL with Rammerhead's encoding table and return the URL.
resolve(`/${id}/` + new StrShuffler(shuffleDict).shuffle(baseUrl));
});
})
);
};
/* To use:
* goProx.proxy(url-string, mode-as-string-or-number);
*
* Key: 1 = "stealth"
* 0 = "window"
* Nothing = return URL as a string
*
* Examples:
* Stealth mode -
* goProx.ultraviolet("https://google.com", 1);
* goProx.ultraviolet("https://google.com", "stealth");
*
* await goProx.rammerhead("https://google.com", 1);
* await goProx.rammerhead("https://google.com", "stealth");
*
* goProx.searx(1);
* goProx.searx("stealth");
*
* Window mode -
* goProx.ultraviolet("https://google.com", "window");
*
* await goProx.rammerhead("https://google.com", "window");
*
* goProx.searx("window");
*
* Return string value mode (default) -
* goProx.ultraviolet("https://google.com");
*
* await goProx.rammerhead("https://google.com");
*
* goProx.searx();
*/
addEventListener('DOMContentLoaded', async () => {
// This won't break the service workers as they store the variable separately.
uvConfig = self['{{__uv$config}}'];
delete self['{{__uv$config}}'];
// Object.freeze prevents goProx from accidentally being edited.
const goProx = Object.freeze({
// `location.protocol + "//" + getDomain()` more like `location.origin`
// setAuthCookie("__cor_auth=1", false);
ultraviolet: urlHandler(uvUrl),
scramjet: urlHandler(sjUrl),
rammerhead: asyncUrlHandler(
async (url) => location.origin + (await RammerheadEncode(search(url)))
),
searx: urlHandler(location.protocol + `//c.${getDomain()}/engine/`),
libreddit: urlHandler(location.protocol + '//c.' + getDomain()),
rnav: urlHandler(location.protocol + '//client.' + getDomain()),
osu: urlHandler(location.origin + '/archive/osu'),
mcnow: urlHandler(sjUrl('https://now.gg/play/a/10010/b')),
glife: urlHandler(sjUrl('https://now.gg/apps/lunime/5767/gacha-life.html')),
roblox: urlHandler(sjUrl('https://now.gg/apps/roblox-corporation/5349/roblox.html')),
amongus: urlHandler(sjUrl('https://now.gg/apps/innersloth-llc/4047/among-us.html')),
pubg: urlHandler(sjUrl('https://now.gg/apps/proxima-beta/2609/pubg-mobile-resistance.html')),
train: urlHandler(sjUrl('https://hby.itch.io/last-train-home')),
village: urlHandler(sjUrl('https://kwoodhouse.itch.io/village-arsonist')),
prison: urlHandler(sjUrl('https://vimlark.itch.io/pick-up-prison')),
rpg: urlHandler(sjUrl('https://alarts.itch.io/die-in-the-dungeon')),
speed: urlHandler(sjUrl('https://captain4lk.itch.io/what-the-road-brings')),
heli: urlHandler(sjUrl('https://benjames171.itch.io/helo-storm')),
youtube: urlHandler(sjUrl('https://inv.nadeko.net')),
discordUV: urlHandler(sjUrl('https://discord.com/app')),
discordRH: urlHandler(await RammerheadEncode('https://discord.com/app')),
});
// Attach event listeners using goProx to specific app menus that need it.
const prSet = (id, type) => {
const formElement = document.getElementById(id);
if (!formElement) return;
let prUrl = formElement.querySelector('input[type=text]'),
prGo1 = document.querySelectorAll(`#${id}.pr-go1, #${id} .pr-go1`),
prGo2 = document.querySelectorAll(`#${id}.pr-go2, #${id} .pr-go2`);
// Handle the other menu buttons differently if there is no omnibox. Menus
// which lack an omnibox likely use buttons as mere links.
const goProxMethod = prUrl
? (mode) => () => {
goProx[type](prUrl.value, mode);
}
: (mode) => () => {
goProx[type](mode);
},
// Ultraviolet is currently incompatible with window mode.
searchMode = type === 'ultraviolet' ? 'stealth' : 'window';
if (prUrl)
prUrl.addEventListener('keydown', async (e) => {
if (e.code === 'Enter') goProxMethod(searchMode)();
// This is exclusively used for the validator script.
else if (e.code === 'Validator Test') {
e.target.value = await goProx[type](e.target.value);
e.target.dispatchEvent(new Event('change'));
}
});
prGo1.forEach((element) => {
element.addEventListener('click', goProxMethod('window'));
});
prGo2.forEach((element) => {
element.addEventListener('click', goProxMethod('stealth'));
});
};
prSet('pr-runprod', 'ultraviolet');
prSet('pr-sj', 'scramjet');
prSet('pr-rh', 'rammerhead');
prSet('pr-yt', 'youtube');
prSet('pr-rh-dc', 'discordRH');
prSet('pr-uv-dc', 'discordUV');
// Load in relevant JSON files used to organize large sets of data.
// This first one is for links, whereas the rest are for navigation menus.
const huLinks = await fetch('/assets/json/links.json', {
mode: 'same-origin',
}).then((response) => response.json());
for (let items = Object.entries(huLinks), i = 0; i < items.length; i++)
// Replace all placeholder links with the corresponding entry in huLinks.
(document.getElementById(items[i][0]) || {}).href = items[i][1];
const navLists = {
// Pair an element ID with a JSON file name. They are identical for now.
'emu-nav': 'emu-nav',
'emulib-nav': 'emulib-nav',
'flash-nav': 'flash-nav',
'h5-nav': 'h5-nav',
};
for (const [listId, filename] of Object.entries(navLists)) {
let navList = document.getElementById(listId);
if (navList) {
// List items stored in JSON format will be returned as a JS object.
const data = await fetch(`/assets/json/${filename}.json`, {
mode: 'same-origin',
}).then((response) => response.json());
// Load the JSON lists into specific HTML parent elements as groups of
// child elements, if the parent element is found.
switch (filename) {
case 'emu-nav':
case 'emulib-nav':
case 'h5-nav': {
const dirnames = {
// Set the directory of where each item of the corresponding JSON
// list will be retrieved from.
'emu-nav': 'emu',
'emulib-nav': 'emulib',
'h5-nav': 'h5g',
},
dir = dirnames[filename],
// Add a little functionality for each list item when clicked on.
clickHandler = (parser, a) => (e) => {
if (e.target == a || e.target.tagName != 'A') {
e.preventDefault();
parser();
}
};
for (let i = 0; i < data.length; i++) {
// Load each item as an anchor tag with an image, heading,
// description, and click event listener.
const item = data[i],
a = document.createElement('a'),
img = document.createElement('img'),
title = document.createElement('h3'),
desc = document.createElement('p');
a.href = '#';
img.src = `/assets/img/${dir}/` + item.img;
title.textContent = item.name;
desc.textContent = item.description;
if (filename === 'h5-nav') {
if (item.credits === 'itch')
desc.innerHTML +=
'<br>Credits: Game can be found <a target="_blank" href="https://itch.io">here</a>.';
if (item.credits === 'nowgg')
desc.innerHTML +=
'<br>Credits: Game can be found <a target="_blank" href="https://now.gg">here</a>.';
}
a.appendChild(img);
a.appendChild(title);
a.appendChild(desc);
// Which function is used for the click event is determined by
// the corresponding location/index in the dirnames object.
const functionsList = [
() => goFrame(item.path),
() => goFrame('/webretro?core=' + item.core + '&rom=' + item.rom),
item.custom
? () => goProx[item.custom]('stealth')
: () => goFrame('/archive/g/' + item.path),
];
a.addEventListener(
'click',
clickHandler(
functionsList[Object.values(dirnames).indexOf(dir)],
a
)
);
navList.appendChild(a);
}
break;
}
case 'flash-nav':
for (let i = 0; i < data.length; i++) {
// Load each item as an anchor tag with a short title and click
// event listener.
const item = data[i],
a = document.createElement('a');
a.href = '#';
a.textContent = item.slice(0, -4);
a.addEventListener('click', (e) => {
e.preventDefault();
goFrame('/flash?swf=' + item);
});
navList.appendChild(a);
}
break;
// No default case.
}
}
}
});
})();

View file

@ -1,98 +1,119 @@
// Encase everything in a new scope so that variables are not accidentally
// attached to the global scope.
(() => {
const stockSW = '/uv/sw.js',
blacklistSW = '/uv/sw-blacklist.js',
swAllowedHostnames = ['localhost', '127.0.0.1'],
connection = new BareMux.BareMuxConnection('/baremux/worker.js'),
wispUrl =
(location.protocol === 'https:' ? 'wss' : 'ws') +
'://' +
location.host +
'/wisp/',
// Proxy configuration
proxyUrl = 'socks5h://localhost:9050', // Replace with your proxy URL
transports = {
epoxy: '/epoxy/index.mjs',
libcurl: '/libcurl/index.mjs',
bare: '/baremux/index.mjs',
},
// The following two variables are copied and pasted here from csel.js.
readCookie = async (name) => {
// Get the first cookie that has the same name.
for (let cookie of document.cookie.split('; '))
if (!cookie.indexOf(name + '='))
// Return the cookie's stored content.
return decodeURIComponent(cookie.slice(name.length + 1));
},
// Sets the default transport mode based on the browser. Firefox is not
// supported by epoxy yet, which is why this is implemented.
defaultMode = /(?:Chrome|AppleWebKit)\//.test(navigator.userAgent)
? 'epoxy'
: 'libcurl';
const stockSW = '/network/sw.js',
blacklistSW = '/network/sw-blacklist.js',
swAllowedHostnames = ['localhost', '127.0.0.1'],
wispUrl =
(location.protocol === 'https:' ? 'wss' : 'ws') +
'://' +
location.host +
'/wisp/',
proxyUrl = 'socks5h://localhost:9050', // Replace with your TOR proxy URL
transports = {
epoxy: '/epoxy/index.mjs',
libcurl: '/libcurl/index.mjs',
bare: '/baremux/index.mjs',
},
readCookie = async (name) => {
for (let cookie of document.cookie.split('; ')) {
if (!cookie.indexOf(name + '=')) {
return decodeURIComponent(cookie.slice(name.length + 1));
}
}
},
defaultMode = /(?:Chrome|AppleWebKit)\//.test(navigator.userAgent)
? 'epoxy'
: 'libcurl';
transports.default = transports[defaultMode];
transports.default = transports[defaultMode];
// Prevent the transports object from accidentally being edited.
Object.freeze(transports);
Object.freeze(transports);
const registerSW = async () => {
if (!navigator.serviceWorker) {
if (
location.protocol !== 'https:' &&
!swAllowedHostnames.includes(location.hostname)
)
throw new Error('Service workers cannot be registered without https.');
const waitForScramjetController = () =>
new Promise((resolve) => {
const interval = setInterval(() => {
if (typeof ScramjetController !== 'undefined') {
clearInterval(interval);
resolve();
}
}, 50);
});
throw new Error("Your browser doesn't support service workers.");
}
const registerSW = async () => {
if (!navigator.serviceWorker) {
if (
location.protocol !== 'https:' &&
!swAllowedHostnames.includes(location.hostname)
)
throw new Error('Service workers cannot be registered without https.');
// If the user has changed the transport mode, use that over the default.
const transportMode =
transports[await readCookie('HBTransport')] || transports.default;
let transportOptions = { wisp: wispUrl };
throw new Error("Your browser doesn't support service workers.");
}
// Only use Tor with the proxy if the user has enabled it in settings.
if ((await readCookie('HBUseOnion')) === 'true')
transportOptions.proxy = proxyUrl;
// Set the transport mode
const transportMode =
transports[await readCookie('HBTransport')] || transports.default;
let transportOptions = { wisp: wispUrl };
await connection.setTransport(transportMode, [transportOptions]);
if ((await readCookie('HBUseOnion')) === 'true') {
transportOptions.proxy = proxyUrl;
console.log('Using Onion Proxy:', proxyUrl);
}
/* Choose a service worker to register based on whether or not the user
* has ads enabled. If the user changes this setting, this script needs
* to be reloaded for this to update, such as by refreshing the page.
*/
const registrations = await navigator.serviceWorker.getRegistrations(),
usedSW =
(await readCookie('HBHideAds')) !== 'false' ? blacklistSW : stockSW;
console.log('Transport mode:', transportMode);
// Unregister a service worker if it isn't the one being used.
for (const registration of registrations)
if (
registration.active &&
new URL(registration.active.scriptURL).pathname !==
new URL(usedSW, location.origin).pathname
)
await registration.unregister();
const connection = new BareMux.BareMuxConnection('/baremux/worker.js');
await connection.setTransport(transportMode, [transportOptions]);
await navigator.serviceWorker.register(usedSW);
};
const registrations = await navigator.serviceWorker.getRegistrations(),
usedSW =
(await readCookie('HBHideAds')) !== 'false' ? blacklistSW : stockSW;
/*
console.log('Service Worker being registered:', usedSW);
Commented out upon discovering that a duplicate BareMux connection may be
unnecessary; previously thought to have prevented issues with refreshing.
// Unregister outdated service workers
for (const registration of registrations)
if (
registration.active &&
new URL(registration.active.scriptURL).pathname !==
new URL(usedSW, location.origin).pathname
)
await registration.unregister();
async function setupTransportOnLoad() {
const conn = new BareMux.BareMuxConnection("/baremux/worker.js");
if (await conn.getTransport() !== "/baremux/module.js") {
await conn.setTransport("/libcurl/index.mjs", [{ wisp: wispUrl, proxy: proxyUrl }]);
}
}
await navigator.serviceWorker.register(usedSW);
};
// Run transport setup on page load.
setupTransportOnLoad();
*/
const initializeScramjet = async () => {
try {
registerSW();
await waitForScramjetController();
const scramjet = new ScramjetController({
prefix: '/worker/service/',
files: {
wasm: '/worker/w.wasm.js',
worker: '/worker/w.worker.js',
client: '/worker/w.client.js',
shared: '/worker/w.shared.js',
sync: '/worker/w.sync.js',
}
});
console.log('Initializing ScramjetController');
scramjet.init('/worker/w.sw.js');
} catch (err) {
console.error('SJWorker initialization failed:', err);
}
};
const initialize = async () => {
try {
await registerSW();
await initializeScramjet();
} catch (err) {
console.error('Initialization failed:', err);
}
};
initialize();
})();

View file

@ -1,4 +1,10 @@
[
{
"name": "Webretro Collection",
"path": "/webretro",
"img": "genesis.png",
"description": "Search through the collection of emulators featured!"
},
{
"name": "GBA Emulator",
"path": "/webretro?core=mgba",
@ -18,16 +24,10 @@
"description": "Emulate SNES games! Click to upload a ROM."
},
{
"name": "Genesis Emulator",
"path": "/webretro?core=genesis_plus_gx",
"img": "genesis.png",
"description": "Emulate Genesis games! Click to upload a ROM."
},
{
"name": "N64 Emulator (BROKEN)",
"name": "N64 Emulator",
"path": "/webretro?core=mupen64plus_next",
"img": "nintendo64.png",
"description": "Emulate N64 games! Click to upload a ROM. (Currently Broken)"
"description": "Emulate N64 games! Click to upload a ROM."
},
{
"name": "VibeOS",

View file

@ -1,6 +1,7 @@
{
"hblink": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
"hblink2": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
"hblink2": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker.git",
"hudoclink": "https://docs.titaniumnetwork.org/services/holyunblocker",
"flooder": "/pages/misc/flooder.html",
"bitbrowser": "/pages/misc/bitbrowser.html",
"firebug": "javascript:var firebug=document.createElement('script');firebug.setAttribute('src','https://luphoria.com/fbl/fbl/firebug-lite-debug.js');document.body.appendChild(firebug);(function(){if(window.firebug.version){firebug.init();}else{setTimeout(arguments.callee);}})();void(firebug);",
@ -16,6 +17,7 @@
"tnlink": "https://discord.gg/CwWpdGkuWY",
"pallink": "https://github.com/LudicrousDevelopment/Palladium",
"nclink": "https://nodeclusters.com",
"sjlink": "https://github.com/MercuryWorkshop/scramjet",
"qrlink": "https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ",
"ytnoc": "javascript:(h=>{/youtube/.test(h+=location)?location=`//www.youtube-nocookie.com/embed/${[h.match`(?<=[ve]/|u/\\w+/|embed/|v=)[^%23&?]*`]}?autoplay=1`:0})``"
}

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

2
views/browserconfig.xml Normal file
View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig><msapplication><tile><square70x70logo src="assets/ico/ms-icon-70x70.png"/><square150x150logo src="assets/ico/ms-icon-150x150.png"/><square310x310logo src="assets/ico/ms-icon-310x310.png"/><TileColor>#b4213b</TileColor></tile></msapplication></browserconfig>

View file

@ -2,38 +2,24 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div id="documentation" class="box textm"><!--DOCS--></div>
</div>
@ -41,7 +27,7 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
<script>
(function () {
var v = document.getElementById('vsc');

View file

@ -1,54 +1,39 @@
<!doctype html>
<html>
<head>
<base href="/" />
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker | Error</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-error text-center">
<h1>Site Error!</h1>
<h2>Reload the page or do Ctrl+R!!! This fixes a lot of issues</h2>
<p>Might be doing some maintenance or the web server is down.</p>
<p>In that case wait a bit until it is resolved!</p>
<h1>Si&#173;te E&#173;rror!</h1>
<h2>Rel&#173;oad the pag&#173;e or do Ctrl+R!!! This fixes a lot of is&#173;sues</h2>
<p>Might be doing some mai&#173;ntenance or the web server is down.</p>
<p>In that case w&#173;ait a bit until it is reso&#173;lved!</p>
<br />
<p>
Invalid URL? View the
<a href="/questions" class="bluelink">FAQ page</a> for help!
Inv&#173;alid &#173;RL? V&#173;iew the
<a href="/questions" class="bluelink">F&#173;AQ pag&#173;e</a> for help!
</p>
</div>
</div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,38 +2,24 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker | FAQ</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div id="documentation" class="box textm"><!--FAQ--></div>
</div>
@ -41,6 +27,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

BIN
views/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View file

@ -2,286 +2,23 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<meta
name="theme-color"
content="#b4213b"
media="(prefers-color-scheme: dark)"
/>
<meta name="googlebot" content="index, follow, snippet" />
<meta
name="robots"
content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"
/>
<meta name="author" content="Titanium Network" />
<meta name="generator" content="Fastify, HTML5" />
<meta name="application-name" content="Holy Unblocker LTS" />
<link rel="canonical" href="https://holyunblocker.org/" />
<title>Holy Unblocker LTS | Secure & Free Web Proxy Service</title>
<meta
name="description"
content="Holy Unblocker LTS is a cutting-edge web proxy service designed to bypass web filters and blockers. Whether dealing with client-side or network-based censorship, Holy Unblocker LTS provides seamless access to blocked sites and secure, private browsing on devices like Chromebooks. Overcome content blockers, Chrome extensions, firewalls, and more with our advanced proxy solution."
/>
<meta
name="keywords"
content="web proxy, free web proxy, proxy web browser, proxy web, proxy web page, proxy for web, secure proxy, unblock websites, free proxy, bypass censorship, unblock Chromebook, proxy service, online security, private browsing, unblock social media, access blocked content, Titanium Network, proxy server, internet freedom, unblock at school, unblock at work"
/>
<meta property="og:site_name" content="Holy Unblocker LTS" />
<meta property="og:url" content="https://holyunblocker.org/" />
<meta
property="og:title"
content="Holy Unblocker LTS | Secure & Advanced Web Proxy Service"
/>
<meta property="og:type" content="website" />
<meta
property="og:description"
content="Holy Unblocker LTS is a top-tier web proxy service that bypasses network and browser restrictions to access blocked websites securely. Enjoy a seamless browsing experience with robust security and advanced features."
/>
<meta property="og:image" content="assets/img/icon.png" />
<meta property="og:image:secure_url" content="assets/img/icon.png" />
<meta property="og:image:alt" content="Holy Unblocker Logo" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@titaniumnetdev" />
<meta name="twitter:creator" content="@titaniumnetdev" />
<meta
name="twitter:title"
content="Holy Unblocker LTS | Secure & Advanced Web Proxy Service"
/>
<meta
name="twitter:description"
content="Discover Holy Unblocker LTS, a premier web proxy service that bypasses censorship and filters to provide secure access to blocked websites. Ideal for private browsing and overcoming network restrictions on devices like Chromebooks."
/>
<meta name="twitter:image" content="assets/img/icon2.png" />
<meta name="twitter:image:alt" content="Holy Unblocker Icon" />
<meta name="msapplication-TileColor" content="#b4213b" />
<meta name="msapplication-TileImage" content="assets/img/icon.png" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<meta name="apple-mobile-web-app-title" content="Holy Unblocker LTS" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="assets/img/apple-icon.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="assets/img/icon-small.png"
/>
<link rel="mask-icon" href="new.svg" color="#b4213b" />
<link rel="manifest" href="manifest.json" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="rating" content="general" />
<meta name="distribution" content="global" />
<meta name="coverage" content="worldwide" />
<meta name="target" content="all" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Holy Unblocker LTS",
"alternateName": "Holy Unblocker (Titanium Network)",
"url": "https://holyunblocker.org",
"logo": "https://holyunblocker.org/assets/img/icon.png",
"sameAs": [
"https://github.com/titaniumnetwork-dev",
"https://twitter.com/titaniumnetdev",
"https://www.youtube.com/channel/UC6LaREFvs9L72SK1s2PcxNg",
"https://holyunblocker.org",
"https://www.facebook.com/holyunblocker",
"https://www.linkedin.com/company/holyunblocker",
"https://www.instagram.com/holyunblocker"
],
"description": "Holy Unblocker is an advanced web proxy service designed to bypass network censorship and filters, providing a secure and private browsing experience. It supports a wide range of websites, including YouTube, and receives frequent updates to ensure optimal performance.",
"founder": {
"@type": "Person",
"name": "Quite A Fancy Emerald"
},
"foundingDate": "2020",
"contactPoint": {
"@type": "ContactPoint",
"contactType": "Customer Support",
"email": "8xz62b0ce@mozmail.com",
"url": "https://holyunblocker.org/credits"
},
"keywords": "proxy, web proxy, unblock websites, unblock Chromebook, free web proxy, proxy list, proxy sites, unblock Chromebook, online proxy, proxy server, proxy site, proxy YouTube, bypass Securly, bypass iBoss, bypass Lightspeed filter, Holy Unblocker, Chromebooks, Titanium Network, unblock YouTube, YouTube proxy, unblocked YouTube, YouTube unblocked, anonymous browsing, internet freedom, web censorship, school proxy, work proxy, secure proxy, fast proxy, private proxy, unblock social media, access blocked sites, bypass network restrictions"
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker is a free and secure web proxy service designed to bypass web filters and blockers. It supports numerous sites, emphasizing detailed design, mechanics, and advanced features to provide a seamless browsing experience."
}
},
{
"@type": "Question",
"name": "How do I unblock websites at school using Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "To unblock websites at school, use Holy Unblocker, a free web proxy service that is frequently updated. If a site gets blocked, join the Titanium Network Discord to request a new site. Monthly restocks help prevent mass blocking."
}
},
{
"@type": "Question",
"name": "What websites can I access with Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker allows access to a wide variety of websites, including popular sites like Discord, Spotify, YouTube, and many game sites."
}
},
{
"@type": "Question",
"name": "Is Holy Unblocker safe to use?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Absolutely! Holy Unblocker ensures a safe browsing experience by not collecting or logging any user data. Refer to our Privacy Policy for more details. Additionally, Holy Unblocker is open-source, ensuring full transparency."
}
},
{
"@type": "Question",
"name": "Does Holy Unblocker hide my search history?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, Holy Unblocker hides your search history. You can customize your tab appearance via Settings > Tab Cloak and use Stealth mode for private browsing."
}
},
{
"@type": "Question",
"name": "How can I get more Holy Unblocker sites?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Join the Titanium Network Discord at discord.gg/unblock and type \"/proxy\" in our bots channel to receive a new site via DMs from our bot."
}
},
{
"@type": "Question",
"name": "Is Holy Unblocker open-source?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, Holy Unblocker is open-source. Visit our GitHub to deploy or host your own instance of Holy Unblocker, ensuring maximum privacy control."
}
},
{
"@type": "Question",
"name": "How fast and advanced is Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker is a fast and highly advanced web proxy service, featuring CAPTCHA integration, customizable blacklist settings, leak prevention mechanisms, robust security measures, and extensive site compatibility via Ultraviolet + Wisp."
}
},
{
"@type": "Question",
"name": "Can I self-host Holy Unblocker for better privacy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, you can easily fork the Holy Unblocker repository and self-host it for maximum privacy control, ensuring no user data is collected."
}
},
{
"@type": "Question",
"name": "What makes Holy Unblocker different from other web proxy services?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker stands out with its transparency and privacy control, collecting no user data. It leverages custom source randomization and projects like Epoxy, Wisp, and Ultraviolet to effectively bypass web and network filters."
}
},
{
"@type": "Question",
"name": "What design principles does Holy Unblocker follow?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker uses the Nord Theme for its optimal design color palette, prioritizing readable code syntax and user-friendly UI components."
}
},
{
"@type": "Question",
"name": "How do I start using Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Head to the Web Proxies page and select one of the featured proxies. Then, type the site you wish to access in the search box. Each web proxy has its own level of effectiveness, speed, and security. Ultraviolet is highly recommended for the best experience."
}
},
{
"@type": "Question",
"name": "What pre-linked applications does Holy Unblocker feature?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker features a collection of pre-linked applications, including YouTube, Spotify, Webretro (an online everything emulator), Ruffle.fs (Adobe Flash Emulator), and an expansive library for each respective app."
}
},
{
"@type": "Question",
"name": "Is Holy Unblocker planning to support more applications?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, Holy Unblocker is soon to support the Anura games library, expanding its range of pre-linked applications."
}
},
{
"@type": "Question",
"name": "How do I deploy Holy Unblocker on my own server?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker is designed to be easy to deploy and use on personal setups or production loads. Detailed guides can be found at the official GitHub repository and Titanium Network Docs."
}
},
{
"@type": "Question",
"name": "Where is the default proxy location when starting Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The default place for the proxy when started is http://localhost:8080. You can change this setting if needed in config.json. This website is hosted locally with Ultraviolet and Rammerhead built-in."
}
},
{
"@type": "Question",
"name": "How can I contribute to Holy Unblocker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Holy Unblocker thrives thanks to its contributors. You can get involved in various ways, including design, core development, applications and games, documentation, and testing and QA. Visit our GitHub repository and join our Discord server to get started."
}
}
]
}
</script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div
id="header"
class="fullwidth"
role="navigation"
aria-label="Main navigation"
>
<div id="header" class="fullwidth" role="navigation">
<!--HEADER-->
</div>
<div id="banner" class="fullwidth">
@ -290,43 +27,44 @@
</p>
</div>
<div id="mainbody" class="fullwidth">
<div id="particles-js" class="fullwidth"></div>
<div class="home-grid-container" aria-label="Home Grid Container">
<div id="background-animated" class="fullwidth"></div>
<div class="home-grid-container">
<div class="home-text" role="banner">
<h1><span>End Internet Censorship.</span></h1>
<h1>Privacy right at your fingertips.</h1>
<a class="homebutton" href="#scrollfix" aria-label="Bypass now"
>Bypass now?</a
<h1><span>En&#173;d I&#173;nt&#173;ern&#173;et Cen&#173;sors&#173;hi&#173;p.</span></h1>
<h1>Pri&#173;va&#173;cy ri&#173;gh&#173;t a&#173;t yo&#173;ur fi&#173;nge&#173;rti&#173;ps.</h1>
<a class="homebutton" href="#scrollfix"
>By&#173;pas&#173;s no&#173;w?</a
>
<a class="homebutton mobile" href="/browsing" aria-label="Browse now"
>Bypass now?</a
<a class="homebutton mobile" href="/browsing"
>B&#173;yp&#173;ass no&#173;w?</a
>
</div>
<div class="mac-window" aria-label="Command Line Instructions">
<div
class="mac-title-bar"
role="banner"
aria-label="Mac Window Title Bar"
>
<div class="mac-buttons" aria-label="Mac Window Buttons">
<span class="mac-close" aria-label="Close Window"></span>
<span class="mac-minimize" aria-label="Minimize Window"></span>
<span class="mac-maximize" aria-label="Maximize Window"></span>
<div class="mac-window">
<div class="mac-title-bar" role="banner">
<div class="mac-buttons">
<span class="mac-close"></span>
<span class="mac-minimize"></span>
<span class="mac-maximize"></span>
</div>
</div>
<div class="mac-content">
<p>
<span class="cmd">git clone --recurse-submodules<span class="url"> https://github.com/QuiteAFancyEmerald/Holy-Unblocker.git</span>&#13;</span
<span class="cmd">gi&#173;t clo&#173;ne --re&#173;cu&#173;rse-sub&#173;modul&#173;es<span class="url"> ht&#173;t&#173;ps://g&#173;it&#173;h&#173;ub.co&#173;m/Qu&#173;it&#173;eAF&#173;an&#173;cyE&#173;me&#173;ral&#173;d/Ho&#173;ly-Unblock&#173;er.g&#173;i&#173;t</span>&#13;</span
><br />
<span class="cmd">cd Holy-Unblocker&#13;</span><br />
<span class="comment">Recommended you switch branches via your IDE to a stable released branch such as v6.x instead of master.</span><br />
<span class="cmd">npm start&#13;</span><br />
<span class="comment">Or on subsequent uses...</span><br />
<span class="cmd">npm restart&#13;</span><br /><br />
<span class="comment">Holy Unblocker LTS v<!-- VERSION --></span
<span class="cmd">cd Ho&#173;l&#173;y-Un&#173;bl&#173;oc&#173;ke&#173;r&#173;</span><br />
<span class="comment">Recom&#173;mend&#173;ed you s&#173;witch bra&#173;nches vi&#173;a your I&#173;DE to a sta&#173;ble rele&#173;ased bran&#173;ch suc&#173;h as v6.x inste&#173;ad of mast&#173;er.</span><br />
<span class="cmd">n&#173;pm st&#173;art&#13;</span><br />
<span class="comment">O&#173;r o&#173;n subs&#173;eque&#173;nt us&#173;es...</span><br />
<span class="cmd">n&#173;pm restart&#13;</span><br /><br />
<span class="comment">H&#173;ol&#173;y Un&#173;bl&#173;ock&#173;er LT&#173;S v<!-- VERSION --></span
><br />
<span class="comment">Node.js v20</span><br />
<span class="comment">Fastify v4.28.1</span>
<span class="comment">N&#173;od&#173;e.j&#173;s v2&#173;0</span><br />
<span class="comment">Fa&#173;sti&#173;fy v4&#173;.2&#173;.1</span><br /><br />
<span class="downarrowgroup">
<i class="fas fa-level-down-alt"></i>
<i class="fas fa-level-down-alt"></i>
<i class="fas fa-level-down-alt"></i>
</span>
</p>
</div>
</div>
@ -338,49 +76,49 @@
<div class="hero-text-wrap">
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">Holy Unblocker is free.</h2>
<h2 class="hero-content-header">H&#173;oly Un&#173;bl&#173;ock&#173;er is&#173; fr&#173;ee.</h2>
</div>
<p>
Being open source, you can easily fork this repository and self
host for maximum privacy control. In contrast to numerous other
web proxy services, HU LTS stands out with complete transparency
and privacy control. We collect no user data is collected and
ensure browsing privacy.
Be&#173;ing o&#173;p&#173;en sou&#173;rce, you can ea&#173;sily for&#173;k th&#173;is re&#173;po&#173;si&#173;tor&#173;y and se&#173;lf
ho&#173;st for maxi&#173;m&#173;um priv&#173;acy control. In contr&#173;ast to num&#173;erous other
w&#173;eb pro&#173;xy se&#173;rvi&#173;ces, H&#173;U L&#173;TS sta&#173;nds out with comp&#173;lete trans&#173;parency
and priv&#173;acy control. We co&#173;llect no us&#173;er da&#173;ta is co&#173;llec&#173;ted and
en&#173;sure brow&#173;sing pr&#173;iv&#173;a&#173;cy.
</p>
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">
Holy Unblocker is fast and highly advanced.
Ho&#173;ly Un&#173;blo&#173;ck&#173;er is fa&#173;s&#173;t a&#173;n&#173;d hi&#173;gh&#173;ly a&#173;dv&#173;anc&#173;ed.
</h2>
</div>
<p>
HU LTS delivers exceptional web proxy performance. It boasts a
robust feature set including CAPTCHA integration, customizable
blacklist settings, leak prevention mechanisms, robust security
measures, and extensive site compatibility support via
Ultraviolet + Wisp.
H&#173;U LT&#173;S del&#173;iv&#173;ers ex&#173;ce&#173;ptio&#173;nal we&#173;b p&#173;ro&#173;xy pe&#173;rfo&#173;rman&#173;ce. It boa&#173;sts a
ro&#173;bust feat&#173;ure set inclu&#173;ding CAPT&#173;CHA integ&#173;ration, cu&#173;stomiza&#173;ble
blacklist setti&#173;ngs, le&#173;ak prev&#173;ention mechan&#173;isms, rob&#173;ust securi&#173;ty
mea&#173;sures, and exte&#173;nsive site co&#173;mpat&#173;ibility supp&#173;ort via
Ul&#173;travio&#173;let + Wi&#173;sp.
</p>
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">
Holy Unblocker is fast and highly advanced.
Ho&#173;ly Un&#173;bl&#173;ock&#173;er i&#173;s fas&#173;t and h&#173;igh&#173;ly adv&#173;anc&#173;ed.
</h2>
</div>
<p>
Leveraging our custom source randomization and projects like
Epoxy, Wisp, and Ultraviolet, HU LTS delivers a seamless
experience that effectively circumvents web and network filters.
This is achieved entirely within your browser and our backend
(or your own if self-hosting), enabling users to bypass even the
most stringent censorship blocks.
Lever&#173;agin&#173;g our cus&#173;om so&#173;urce ran&#173;dom&#173;ization and proj&#173;ects like
Epox&#173;y, Wi&#173;sp, an&#173;d Ul&#173;travi&#173;olet, H&#173;U L&#173;T&#173;S delivers a seaml&#173;ess
exper&#173;ience that effecti&#173;vely circumv&#173;ents w&#173;b and netwo&#173;rk filte&#173;rs.
Th&#173;is is achie&#173;ved ent&#173;irely withi&#173;n your brow&#173;er and ou&#173;r bac&#173;kend
(or yo&#173;ur o&#173;wn if sel&#173;f-hosti&#173;ng), enabling users to by&#173;pass even the
mos&#173;t stringe&#173;nt censo&#173;rship bloc&#173;ks.
</p>
</div>
</div>
<div class="image-container-hero">
<img class="hero" src="/assets/img/icon2.png" alt="icon" />
<h1>Holy Unblocker LTS</h1>
<h2>Free and transparent for use</h2>
<a class="fancybutton glowbutton" href="/browsing">Browse Now</a>
<h1>Ho&#173;ly Unb&#173;loc&#173;ker L&#173;T&#173;S</h1>
<h2>Fr&#173;e&#173;e an&#173;d transp&#173;arent for u&#173;se</h2>
<a class="fancybutton glowbutton" href="/browsing">Br&#173;owse No&#173;w</a>
</div>
</div>
</div>
@ -389,63 +127,63 @@
<div class="carousel">
<div class="carousel-inner">
<div class="dependencylogo">
<img src="/assets/img/fastify.png" alt="Fastify" />
<img src="/assets/img/fy.png" alt="F&#173;asti&#173;fy" />
</div>
<div class="dependencylogo">
<img src="/assets/img/nordtheme.png" alt="Nord Theme" />
<img src="/assets/img/nt.png" alt="No&#173;rd The&#173;me" />
</div>
<div class="dependencylogo">
<img src="/assets/img/nodejs.png" alt="Nodejs" />
<img src="/assets/img/nj.png" alt="No&#173;d&#173;ejs" />
</div>
<div class="dependencylogo">
<img src="/assets/img/fontawesome.png" alt="Font Awesome" />
<img src="/assets/img/fa.png" alt="Fo&#173;nt Aw&#173;es&#173;ome" />
</div>
<div class="dependencylogo">
<img src="/assets/img/webretro.png" alt="Webretro" />
<img src="/assets/img/wr.png" alt="We&#173;bre&#173;tro" />
</div>
<div class="dependencylogo">
<img src="/assets/img/ruffle.png" alt="Ruffle" />
<img src="/assets/img/rs.png" alt="Ruf&#173;fle" />
</div>
<div class="dependencylogo">
<img src="/assets/img/uv.png" alt="Ultraviolet" />
<img src="/assets/img/config.png" alt="Ult&#173;ra&#173;viol&#173;et" />
</div>
<div class="dependencylogo">
<img src="/assets/img/rammerhead.png" alt="Rammerhead" />
<img src="/assets/img/rh.png" alt="Ram&#173;merh&#173;ead" />
</div>
<!-- Duplicate logos for continuous scrolling effect -->
<div class="dependencylogo">
<img src="/assets/img/fastify.png" alt="Fastify" />
<img src="/assets/img/fy.png" alt="Fas&#173;tify" />
</div>
<div class="dependencylogo">
<img src="/assets/img/nordtheme.png" alt="Nord Theme" />
<img src="/assets/img/nt.png" alt="No&#173;rd Th&#173;eme" />
</div>
<div class="dependencylogo">
<img src="/assets/img/nodejs.png" alt="Nodejs" />
<img src="/assets/img/nj.png" alt="N&#173;odejs" />
</div>
<div class="dependencylogo">
<img src="/assets/img/fontawesome.png" alt="Font Awesome" />
<img src="/assets/img/fa.png" alt="F&#173;ont Awe&#173;some" />
</div>
<div class="dependencylogo">
<img src="/assets/img/webretro.png" alt="Webretro" />
<img src="/assets/img/wr.png" alt="Webre&#173;tro" />
</div>
<div class="dependencylogo">
<img src="/assets/img/ruffle.png" alt="Ruffle" />
<img src="/assets/img/rs.png" alt="Ru&#173;ffle" />
</div>
<div class="dependencylogo">
<img src="/assets/img/uv.png" alt="Ultraviolet" />
<img src="/assets/img/config.png" alt="Ult&#173;ra&#173;vio&#173;let" />
</div>
<div class="dependencylogo">
<img src="/assets/img/rammerhead.png" alt="Rammerhead" />
<img src="/assets/img/rh.png" alt="Ra&#173;mm&#173;erh&#173;ead" />
</div>
</div>
</div>
</div>
</div>
<div class="text-center">
<div data-aos="fade-left" class="splashstroke">
<div class="splashstroke">
<div>
<h1 class="splashstrokeheader">
Designed with focus<span class="underline-svg"></span>.
Desig&#173;ned wi&#173;th fo&#173;cus<span class="underline-svg"></span>.
</h1>
</div>
<svg class="underline-svg" viewBox="0 0 390 55" fill="none">
@ -484,14 +222,14 @@
<div data-aos="fade-right" id="info" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Overview</h1>
<h1>Ov&#173;er&#173;view</h1>
<p>
Holy Unblocker LTS, an experimental web proxy service, can
bypass web filters or 'blockers' regardless of whether the
method of censorship is client-side or network-based. This
includes the potential ability to bypass content blockers
overseas, Chrome extensions, localized client firewalls, and
network-related filters.
Hol&#173;y Un&#173;bloc&#173;ker LT&#173;S, an ex&#173;pe&#173;r&#173;im&#173;ental we&#173;b pr&#173;ox&#173;y se&#173;rvi&#173;ce, can
byp&#173;ass we&#173;b filt&#173;ers or 'blo&#173;ckers' re&#173;gardl&#173;ess of wh&#173;ether the
meth&#173;od of c&#173;e&#173;ns&#173;or&#173;sh&#173;ip is cli&#173;ent-side or net&#173;work-based. This
in&#173;cl&#173;udes the pote&#173;ntial abil&#173;ity to b&#173;y&#173;pa&#173;ss co&#173;ntent b&#173;loc&#173;ker&#173;s
over&#173;se&#173;as, Chr&#173;ome ext&#173;ensio&#173;ns, local&#173;ized cli&#173;ent firewa&#173;lls, and
ne&#173;tw&#173;ork-rela&#173;ted filt&#173;ers.
</p>
</div>
</div>
@ -503,23 +241,22 @@
/>
</div>
</div>
<!-- Repeat the above structure for the second box-card -->
<div data-aos="fade-left" id="info2" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Intent</h1>
<h1>Int&#173;ent</h1>
<p>
This project serves mostly as a proof of concept for the ideal
clientless solution to bypassing censorship. Being a secure web
proxy service, it supports numerous sites while being updated
frequently and concentrating on detail with design, mechanics,
and features.
Th&#173;is pr&#173;oject ser&#173;ves mo&#173;stly as a p&#173;roof of conce&#173;pt for the id&#173;eal
clien&#173;tless solut&#173;ion to bypas&#173;sing ce&#173;nso&#173;rship. Bei&#173;ng a secu&#173;re we&#173;b
pr&#173;ox&#173;y ser&#173;vice, it suppo&#173;rts numer&#173;ous sites w&#173;hile be&#173;ing upd&#173;ated
frequen&#173;tly and concen&#173;trating on d&#173;etail w&#173;ith des&#173;ign, mech&#173;anics,
and feature&#173;s.
</p>
<p>
This project's palette is built using
<a href="https://nordtheme.com">Nord Theme</a> for its optimal
design color palette and prioritization of readable code syntax
and UI components.
Th&#173;s proj&#173;ect's palet&#173;te is bu&#173;ilt u&#173;sing
<a href="https://nordtheme.com">Nor&#173;d Th&#173;eme</a> for it&#173;s opti&#173;mal
desig&#173;n col&#173;or pale&#173;tte and prio&#173;ritiza&#173;tion of r&#173;ada&#173;ble cod&#173;e sy&#173;ntax
and U&#173;I compone&#173;nts.
</p>
</div>
</div>
@ -534,14 +271,14 @@
<div data-aos="fade-right" id="info2" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Usage</h1>
<h1>U&#173;s&#173;age</h1>
<p>
Head to the <a href="/browsing">Web Proxies</a> page and select
one of the proxies featured! Afterwards, type out the site you
wish to access in the search box. Each web proxy has its own
level of effectiveness, speed and security. It is recommended to
use Ultraviolet.<br /><br />Example Website To Unblock:
<code>https://coolmathgames.com</code>
Hea&#173;d to th&#173;e <a href="/browsing">We&#173;b Pro&#173;xi&#173;es</a> pa&#173;ge and sele&#173;ct
o&#173;ne of the pro&#173;xies featur&#173;ed! Afterw&#173;ards, t&#173;ype ou&#173;t the si&#173;te you
wi&#173;sh to a&#173;ccess in t&#173;he sea&#173;rch box. Ea&#173;ch we&#173;b pro&#173;xy has its o&#173;wn
level of eff&#173;ectiveness, speed and sec&#173;ur&#173;ity. It is rec&#173;omm&#173;end&#173;ed to
use Ultravi&#173;olet.<br /><br />Ex&#173;ample Webs&#173;ite To Un&#173;bl&#173;ock:
<code>ht&#173;tps://co&#173;olmath&#173;ames.com</code>
</p>
</div>
</div>
@ -552,15 +289,15 @@
<div data-aos="fade-left" id="info2" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Apps</h1>
<h1>Ap&#173;ps</h1>
<p>
HU LTS features a collection of pre-linked applications,
including YouTube, Spotify,
<a href="/emulators">Webretro</a> (an online everything
emulator), <a href="/flash-games">Ruffle.fs</a> (Adobe Flash
Emulator), and an expansive library for each respective app.
H&#173;U L&#173;TS fe&#173;atures a colle&#173;ction of pre-li&#173;nked appli&#173;cat&#173;ions,
incl&#173;uding YouT&#173;ube, Spot&#173;ify,
<a href="/emulators">Webre&#173;tro</a> (a&#173;n onl&#173;ine eve&#173;ryt&#173;ing
em&#173;ula&#173;tor), <a href="/flash-games">Ruf&#173;fle.f&#173;s</a> (Ad&#173;obe Fla&#173;sh
Em&#173;ulat&#173;or), and an expans&#173;ive libra&#173;ry for each r&#173;espective ap&#173;p.
</p>
<p>This project is soon to support the Anura games library.</p>
<p>Th&#173;is pr&#173;oje&#173;ct i&#173;s soo&#173;n to sup&#173;port th&#173;e An&#173;ura ga&#173;mes librar&#173;y.</p>
</div>
</div>
<div class="image-container">
@ -574,46 +311,48 @@
<div data-aos="fade-right" id="info2" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Hosting and Deployment</h1>
<h1>Ho&#173;sting an&#173;d Depl&#173;oymen&#173;t</h1>
<p>
<strong>Holy Unblocker LTS</strong> is designed with flexibility
and ease of deployment in mind. As an open-source solution, it
is straightforward to set up on both personal and production
environments. Key features include modularity for ad-blocking,
source randomization, and advanced proxy navigation.<br /><br />
For comprehensive setup instructions, visit our official
<strong>Ho&#173;ly Unbl&#173;ock&#173;er LT&#173;S</strong> is desig&#173;ned with flexib&#173;ility
a&#173;nd eas&#173;e of depl&#173;oyment i&#173;n mi&#173;nd. A&#173;s a&#173;n o&#173;pen-so&#173;urce so&#173;lution, it
is stra&#173;ightfor&#173;ward to s&#173;et u&#173;p on b&#173;oth p&#173;erso&#173;nal and pr&#173;odu&#173;ction
envi&#173;ronments. K&#173;ey featu&#173;res incl&#173;ude mod&#173;ula&#173;rity for ad-b&#173;loc&#173;king,
s&#173;ource ran&#173;domi&#173;zat&#173;ion, and advan&#173;ced pr&#173;oxy naviga&#173;tion.<br /><br />
Fo&#173;r compr&#173;ehe&#173;nsive set&#173;up instruct&#173;ions, vis&#173;it our of&#173;ficial
<a
href="https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
title="Holy Unblocker LTS GitHub Repository"
id="hulink2"
href="#"
title="Ho&#173;ly Unblo&#173;cker L&#173;TS GitH&#173;ub Reposi&#173;tory"
target="_blank"
rel="noopener nore&#173;ferrer"
>Git&#173;Hub repo&#173;sito&#173;ry</a
>, t&#173;he
<a
id="hudoclink"
href="#"
title="Tita&#173;nium Net&#173;work Documen&#173;tation"
target="_blank"
rel="noopener noreferrer"
>GitHub repository</a
>, the
<a
href="https://docs.titaniumnetwork.org/services/holyunblocker"
title="Titanium Network Documentation"
target="_blank"
rel="noopener noreferrer"
>Titanium Network Docs</a
>Ti&#173;tanium Net&#173;work D&#173;oc&#173;s</a
>, or
<a href="?documentation" title="Additional Hosting Information"
>linked here on the main site</a
<a href="?documentation" title="Addi&#173;tional Host&#173;ing Inform&#173;ation"
>li&#173;nked he&#173;re on the ma&#173;in s&#173;ite</a
>.
</p>
<p>
Additional scripts can be found in
<code>/views/assets/js/</code>:<br />
- <strong>bareTransport.js</strong>: Locally installed module
for Ultraviolet functionality.<br />
- <strong>card.js</strong>: Adds visual effects to the box
Addit&#173;ional sc&#173;ripts can be fo&#173;und i&#173;n
<code>/views/ass&#173;ets/js/</code>:<br />
- <strong>ba&#173;reTranspo&#173;rt.js</strong>: Loca&#173;lly insta&#173;lled mo&#173;ule
for Ultr&#173;avi&#173;olet functi&#173;onal&#173;ity.<br />
- <strong>car&#173;d.js</strong>: Ad&#173;ds visu&#173;al eff&#173;ects to the bo&#173;x
cards.<br />
- <strong>common.js</strong>: Provides essential features across
all pages.<br />
- <strong>csel.js</strong>: Manages the settings menu.<br />
- <strong>particles.js</strong>: Creates animated background
effects.<br />
- <strong>register-sw.js</strong>: Handles service workers and
Ultraviolet integration.
- <strong>comm&#173;on.js</strong>: &#173;rovid&#173;es essen&#173;tial featur&#173;es acr&#173;oss
al&#173;l page&#173;s.<br />
- <strong>cs&#173;el.js</strong>: Ma&#173;nages t&#173;he sett&#173;ings m&#173;enu.<br />
- <strong>part&#173;ic&#173;les.j&#173;s</strong>: Crea&#173;tes anim&#173;ated bac&#173;k&#173;ground
effec&#173;ts.<br />
- <strong>re&#173;gist&#173;er-s&#173;w.js</strong>: H&#173;andles serv&#173;ice w&#173;orkers an&#173;d
Ult&#173;rav&#173;iolet int&#173;egr&#173;ation.
</p>
</div>
</div>
@ -621,54 +360,56 @@
<img
class="hero"
src="/assets/img/hosting.png"
alt="Hosting and Deployment Icon"
title="Hosting and Deployment for Holy Unblocker LTS"
alt="Host&#173;ing and D&#173;eploy&#173;ment Ic&#173;on"
title="Ho&#173;sting and D&#173;eploy&#173;ment for Ho&#173;ly Unbl&#173;ock&#173;er L&#173;T&#173;S"
/>
</div>
</div>
<div data-aos="fade-left" id="info2" class="box-card">
<div class="content">
<div class="text-wrap">
<h1>Contributing</h1>
<h1>Con&#173;trib&#173;uting</h1>
<p>
<strong>Holy Unblocker LTS</strong> thrives due to the dedicated
efforts of our amazing contributors. As an open-source project,
<strong>HU LTS</strong> relies on the collective skills and
passion of its community to drive continuous improvement and
deliver the best experience for all users.
<strong>Ho&#173;ly Unb&#173;locke&#173;r L&#173;T&#173;S</strong> thr&#173;ives d&#173;ue t&#173;o t&#173;he dedic&#173;ated
effor&#173;ts of o&#173;ur ama&#173;zing c&#173;ontributo&#173;rs. As an op&#173;en-sour&#173;ce proj&#173;ect,
<strong>H&#173;U LT&#173;S</strong> r&#173;elies o&#173;n t&#173;he collect&#173;ive ski&#173;lls an&#173;d
pass&#173;ion o&#173;f it&#173;s commun&#173;ity to driv&#173;e contin&#173;uous i&#173;mprove&#173;ment an&#173;d
deliv&#173;er the b&#173;est exp&#173;eri&#173;ence for a&#173;ll u&#173;sers.
</p>
<p>
There are numerous ways to get involved and make a meaningful
impact on <strong>Holy Unblocker LTS</strong>:<br /><br />
- <strong>Design</strong>: Contribute to the visual aesthetics
and user experience.<br />
- <strong>Core Development</strong>: Help enhance the core
functionality and performance.<br />
- <strong>Applications and Games</strong>: Develop and integrate
new features or games.<br />
- <strong>Documentation</strong>: Assist with creating and
refining project documentation.<br />
- <strong>Testing and QA</strong>: Ensure the software is
bug-free and meets quality standards.
Th&#173;ere ar&#173;e numer&#173;ous way&#173;s t&#173;o ge&#173;t invol&#173;ved and mak&#173;e a mean&#173;ing&#173;ful
imp&#173;act on <strong>Ho&#173;ly Unbl&#173;ocke&#173;r LT&#173;S</strong>:<br /><br />
- <strong>Design</strong>: Contr&#173;ibute t&#173;o the vis&#173;ual aesthe&#173;tics
a&#173;nd use&#173;r exper&#173;ience.<br />
- <strong>Co&#173;re De&#173;velo&#173;pment</strong>: H&#173;elp enhan&#173;ce the co&#173;re
functio&#173;nality and perform&#173;ance.<br />
- <strong>Applic&#173;ations and Ga&#173;mes</strong>: Dev&#173;elop and integ&#173;rate
n&#173;ew feature&#173;s or g&#173;ames.<br />
- <strong>Docum&#173;entation</strong>: A&#173;ssist with cr&#173;ea&#173;ting and
refin&#173;ing proje&#173;ct documen&#173;tation.<br />
- <strong>Test&#173;ing and Q&#173;A</strong>: Ens&#173;ure the soft&#173;are is
bug-fr&#173;ee and meet&#173;s quali&#173;ty st&#173;andards.
</p>
<p>
To start contributing, visit our
T&#173;o sta&#173;rt con&#173;trib&#173;uting, vi&#173;sit o&#173;ur
<a
href="https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
title="Holy Unblocker LTS GitHub Repository"
id="hulink2"
href="#"
title="H&#173;oly Unbl&#173;ocker L&#173;TS Gi&#173;tHub Re&#173;posi&#173;tory"
target="_blank"
rel="noopener noreferrer"
>GitHub repository</a
>Gi&#173;tHub re&#173;posi&#173;tory</a
>
and join our
a&#173;nd jo&#173;in ou&#173;r
<a
href="https://discord.gg/unblock"
title="Holy Unblocker LTS Discord Server"
id="tnlink"
href="#"
title="Ho&#173;ly U&#173;nblo&#173;cker L&#173;TS Disc&#173;ord Ser&#173;ver"
target="_blank"
rel="noopener noreferrer"
>Discord server</a
>Disc&#173;ord ser&#173;ver</a
>
for real-time discussions and updates.
f&#173;or rea&#173;l-ti&#173;me disc&#173;ussio&#173;ns and up&#173;dat&#173;es.
</p>
</div>
</div>
@ -676,8 +417,8 @@
<img
class="hero"
src="/assets/img/git.png"
alt="Contributing GitHub Icon"
title="Contribute to Holy Unblocker LTS on GitHub"
alt="Con&#173;tribut&#173;ing GitH&#173;ub Ico&#173;n"
title="Cont&#173;ribu&#173;te to H&#173;oly Unbl&#173;ocker LT&#173;S o&#173;n Gi&#173;tHub"
/>
</div>
</div>
@ -689,51 +430,51 @@
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">
Unblock Websites with Holy Unblocker LTS
Unbl&#173;ock W&#173;ebsi&#173;tes wi&#173;th H&#173;oly U&#173;nblocke&#173;r LT&#173;S
</h2>
</div>
<p>
Holy Unblocker LTS is an open-source
<strong>public web proxy</strong>. Enjoy unrestricted access to
online content and secure browsing with our advanced
<strong>web proxy unblocking</strong> features.
H&#173;oly Unblo&#173;cker LT&#173;S is an o&#173;pen-sour&#173;ce
<strong>pub&#173;lic web pr&#173;oxy</strong>. Enj&#173;oy u&#173;nrestri&#173;cted acc&#173;ess to
on&#173;line conte&#173;nt and sec&#173;ure br&#173;owsing with our adv&#173;anced
<strong>web pr&#173;oxy unbloc&#173;king</strong> featu&#173;res.
</p>
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">
Free and Accessible Proxy Services
F&#173;ree an&#173;d A&#173;ccessi&#173;ble Pro&#173;xy Servi&#173;ces
</h2>
</div>
<p>
Benefit from our <strong>free web proxy service</strong> that
helps you <strong>unblock websites</strong> and access
restricted content at no cost. Perfect for navigating
educational or workplace filters, our service ensures seamless
and reliable access.
Bene&#173;fit from ou&#173;r <strong>fr&#173;ee w&#173;eb pr&#173;oxy s&#173;erv&#173;ice</strong> that
helps you <strong>u&#173;nb&#173;lock webs&#173;ites</strong> and access
restri&#173;cted conte&#173;nt at no co&#173;st. Perf&#173;ect for naviga&#173;ting
educati&#173;onal or workp&#173;lace filt&#173;ers, our s&#173;ervice ensur&#173;es sea&#173;mless
and relia&#173;ble acce&#173;ss.
</p>
<div class="brand-logo-container">
<i class="far fa-window-restore palered"></i>
<h2 class="hero-content-header">
Efficient and Reliable Access
Ef&#173;fici&#173;ent and Reli&#173;able Acc&#173;ess
</h2>
</div>
<p>
Our <strong>unblocked web proxy</strong> is designed to meet
diverse needs, providing a robust solution for overcoming web
filters and enjoying a high-quality browsing experience.
O&#173;ur <strong>unbloc&#173;ked web pr&#173;ox&#173;y</strong> is desig&#173;ned to me&#173;et
div&#173;erse ne&#173;eds, pr&#173;ovidi&#173;ng a robu&#173;st solut&#173;ion for overc&#173;oming w&#173;eb
fil&#173;ters and enj&#173;oying a hi&#173;gh-qual&#173;ity bro&#173;wsing exper&#173;ience.
</p>
</div>
</div>
<div class="image-container-hero">
<h1>Long Term Support FOSS Project</h1>
<a class="fancybutton glowbutton" href="/browsing">Bypass Now</a>
<h1>L&#173;ong T&#173;erm Suppo&#173;rt F&#173;OSS Proj&#173;ect</h1>
<a class="fancybutton glowbutton" href="/browsing">Byp&#173;ass N&#173;ow</a>
</div>
</div>
</div>
<div class="box-home text-center splashend">
<h1>It's time to browse the internet freely.</h1>
<a class="homebutton" href="#scrollfix">Try HU LTS For Free</a>
<a class="homebutton mobile" href="/browsing">Try HU LTS For Free</a>
<h1>I&#173;t's ti&#173;me t&#173;o brow&#173;se the inte&#173;rnet fre&#173;ely.</h1>
<a class="homebutton" href="#scrollfix">Tr&#173;y H&#173;U L&#173;TS F&#173;or Fr&#173;ee</a>
<a class="homebutton mobile" href="/browsing">Tr&#173;y H&#173;U L&#173;TS F&#173;or Fr&#173;ee</a>
</div>
</div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
@ -745,6 +486,6 @@
<script>
AOS.init();
</script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -1,53 +0,0 @@
{
"short_name": "Holy Unblocker LTS",
"name": "Holy Unblocker LTS | Free Web Proxy Service",
"icons": [
{
"src": "https://holyunblocker.org/assets/img/icon.png",
"type": "image/png",
"sizes": "300x300"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#b4213b",
"background_color": "#1f003e",
"description": "Holy Unblocker LTS is a free and secure web proxy service that helps you bypass web filters and access blocked websites. Enjoy anonymous browsing and internet freedom on devices like Chromebooks at school or work.",
"short_description": "Free web proxy service for bypassing filters and accessing blocked sites.",
"keywords": [
"proxy",
"web proxy",
"unblock websites",
"free web proxy",
"proxy list",
"online proxy",
"proxy server",
"proxy YouTube",
"bypass web filters",
"Holy Unblocker",
"unblock Chromebook",
"Titanium Network",
"fast proxy",
"secure proxy",
"anonymous browsing",
"internet freedom"
],
"related_applications": [
{
"platform": "web",
"url": "https://holyunblocker.org"
},
{
"platform": "github",
"url": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
},
{
"platform": "twitter",
"url": "https://twitter.com/titaniumnetdev"
},
{
"platform": "youtube",
"url": "https://www.youtube.com/channel/UC6LaREFvs9L72SK1s2PcxNg"
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,12 @@
// This file overwrites the stock UV config.js
self['{{__uv$config}}'] = {
prefix: '/network/service/',
encodeUrl: Ultraviolet.codec.xor.encode,
decodeUrl: Ultraviolet.codec.xor.decode,
handler: '/network/network.handler.js',
client: '/network/network.client.js',
bundle: '/network/network.bundle.js',
config: '/network/network.config.js',
sw: '/network/network.sw.js',
};

File diff suppressed because it is too large Load diff

445
views/network/network.sw.js Normal file
View file

@ -0,0 +1,445 @@
/*globals __uv$config*/
// Users must import the config (and bundle) prior to importing uv.sw.js
// This is to allow us to produce a generic bundle with no hard-coded paths.
/**
* @type {import('../network').UltravioletCtor}
*/
const Ultraviolet = self.Ultraviolet;
const cspHeaders = [
'cross-origin-embedder-policy',
'cross-origin-opener-policy',
'cross-origin-resource-policy',
'content-security-policy',
'content-security-policy-report-only',
'expect-ct',
'feature-policy',
'origin-isolation',
'strict-transport-security',
'upgrade-insecure-requests',
'x-content-type-options',
'x-download-options',
'x-frame-options',
'x-permitted-cross-domain-policies',
'x-powered-by',
'x-xss-protection',
];
const emptyMethods = ['GET', 'HEAD'];
class UVServiceWorker extends Ultraviolet.EventEmitter {
constructor(config = self['{{__uv$config}}']) {
super();
if (!config.prefix) config.prefix = '/service/';
this.config = config;
/**
* @type {InstanceType<Ultraviolet['BareClient']>}
*/
this.bareClient = new Ultraviolet.BareClient();
}
/**
*
* @param {Event & {request: Request}} param0
* @returns
*/
route({ request }) {
if (request.url.startsWith(location.origin + this.config.prefix))
return true;
else return false;
}
/**
*
* @param {Event & {request: Request}} param0
* @returns
*/
async fetch({ request }) {
/**
* @type {string|void}
*/
let fetchedURL;
try {
if (!request.url.startsWith(location.origin + this.config.prefix))
return await fetch(request);
const ultraviolet = new Ultraviolet(this.config);
if (typeof this.config.construct === 'function') {
this.config.construct(ultraviolet, 'service');
}
const db = await ultraviolet.cookie.db();
ultraviolet.meta.origin = location.origin;
ultraviolet.meta.base = ultraviolet.meta.url = new URL(
ultraviolet.sourceUrl(request.url)
);
const requestCtx = new RequestContext(
request,
ultraviolet,
!emptyMethods.includes(request.method.toUpperCase())
? await request.blob()
: null
);
if (ultraviolet.meta.url.protocol === 'blob:') {
requestCtx.blob = true;
requestCtx.base = requestCtx.url = new URL(requestCtx.url.pathname);
}
if (request.referrer && request.referrer.startsWith(location.origin)) {
const referer = new URL(ultraviolet.sourceUrl(request.referrer));
if (
requestCtx.headers.origin ||
(ultraviolet.meta.url.origin !== referer.origin &&
request.mode === 'cors')
) {
requestCtx.headers.origin = referer.origin;
}
requestCtx.headers.referer = referer.href;
}
const cookies = (await ultraviolet.cookie.getCookies(db)) || [];
const cookieStr = ultraviolet.cookie.serialize(
cookies,
ultraviolet.meta,
false
);
requestCtx.headers['user-agent'] = navigator.userAgent;
if (cookieStr) requestCtx.headers.cookie = cookieStr;
const reqEvent = new HookEvent(requestCtx, null, null);
this.emit('request', reqEvent);
if (reqEvent.intercepted) return reqEvent.returnValue;
fetchedURL = requestCtx.blob
? 'blob:' + location.origin + requestCtx.url.pathname
: requestCtx.url;
const response = await this.bareClient.fetch(fetchedURL, {
headers: requestCtx.headers,
method: requestCtx.method,
body: requestCtx.body,
credentials: requestCtx.credentials,
mode: requestCtx.mode,
cache: requestCtx.cache,
redirect: requestCtx.redirect,
});
const responseCtx = new ResponseContext(requestCtx, response);
const resEvent = new HookEvent(responseCtx, null, null);
this.emit('beforemod', resEvent);
if (resEvent.intercepted) return resEvent.returnValue;
for (const name of cspHeaders) {
if (responseCtx.headers[name]) delete responseCtx.headers[name];
}
if (responseCtx.headers.location) {
responseCtx.headers.location = ultraviolet.rewriteUrl(
responseCtx.headers.location
);
}
// downloads
if (['document', 'iframe'].includes(request.destination)) {
const header = responseCtx.getHeader('content-disposition');
// validate header and test for filename
if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) {
// if filename= wasn't specified then maybe the remote specified to download this as an attachment?
// if it's invalid then we can still possibly test for the attachment/inline type
const type = /^\s*?attachment/i.test(header)
? 'attachment'
: 'inline';
// set the filename
const [filename] = new URL(response.finalURL).pathname
.split('/')
.slice(-1);
responseCtx.headers['content-disposition'] =
`${type}; filename=${JSON.stringify(filename)}`;
}
}
if (responseCtx.headers['set-cookie']) {
Promise.resolve(
ultraviolet.cookie.setCookies(
responseCtx.headers['set-cookie'],
db,
ultraviolet.meta
)
).then(() => {
self.clients.matchAll().then(function (clients) {
clients.forEach(function (client) {
client.postMessage({
msg: 'updateCookies',
url: ultraviolet.meta.url.href,
});
});
});
});
delete responseCtx.headers['set-cookie'];
}
if (responseCtx.body) {
switch (request.destination) {
case 'script':
responseCtx.body = ultraviolet.js.rewrite(await response.text());
break;
case 'worker':
{
// craft a JS-safe list of arguments
const scripts = [
ultraviolet.bundleScript,
ultraviolet.clientScript,
ultraviolet.configScript,
ultraviolet.handlerScript,
]
.map((script) => JSON.stringify(script))
.join(',');
responseCtx.body = `if (!self.__uv) {
${ultraviolet.createJsInject(
ultraviolet.cookie.serialize(
cookies,
ultraviolet.meta,
true
),
request.referrer
)}
importScripts(${scripts});
}\n`;
responseCtx.body += ultraviolet.js.rewrite(await response.text());
}
break;
case 'style':
responseCtx.body = ultraviolet.rewriteCSS(await response.text());
break;
case 'iframe':
case 'document':
if (
responseCtx.getHeader('content-type') &&
responseCtx.getHeader('content-type').startsWith('text/html')
) {
let modifiedResponse = await response.text();
if (Array.isArray(this.config.inject)) {
const headPosition = modifiedResponse.indexOf('<head>');
const upperHead = modifiedResponse.indexOf('<HEAD>');
const bodyPosition = modifiedResponse.indexOf('<body>');
const upperBody = modifiedResponse.indexOf('<BODY>');
const url = new URL(fetchedURL);
const injectArray = this.config.inject;
for (const inject of injectArray) {
const regex = new RegExp(inject.host);
if (regex.test(url.host)) {
if (inject.injectTo === 'head') {
if (headPosition !== -1 || upperHead !== -1) {
modifiedResponse =
modifiedResponse.slice(0, headPosition) +
`${inject.html}` +
modifiedResponse.slice(headPosition);
}
} else if (inject.injectTo === 'body') {
if (bodyPosition !== -1 || upperBody !== -1) {
modifiedResponse =
modifiedResponse.slice(0, bodyPosition) +
`${inject.html}` +
modifiedResponse.slice(bodyPosition);
}
}
}
}
}
responseCtx.body = ultraviolet.rewriteHtml(modifiedResponse, {
document: true,
injectHead: ultraviolet.createHtmlInject(
ultraviolet.handlerScript,
ultraviolet.bundleScript,
ultraviolet.clientScript,
ultraviolet.configScript,
ultraviolet.cookie.serialize(cookies, ultraviolet.meta, true),
request.referrer
),
});
}
break;
default:
break;
}
}
if (requestCtx.headers.accept === 'text/event-stream') {
responseCtx.headers['content-type'] = 'text/event-stream';
}
if (crossOriginIsolated) {
responseCtx.headers['Cross-Origin-Embedder-Policy'] = 'require-corp';
}
this.emit('response', resEvent);
if (resEvent.intercepted) return resEvent.returnValue;
return new Response(responseCtx.body, {
headers: responseCtx.headers,
status: responseCtx.status,
statusText: responseCtx.statusText,
});
} catch (err) {
if (!['document', 'iframe'].includes(request.destination))
return new Response(undefined, { status: 500 });
console.error(err);
return renderError(err, fetchedURL);
}
}
static Ultraviolet = Ultraviolet;
}
self.UVServiceWorker = UVServiceWorker;
class ResponseContext {
/**
*
* @param {RequestContext} request
* @param {import('@mercuryworkshop/bare-mux').BareResponseFetch} response
*/
constructor(request, response) {
this.request = request;
this.raw = response;
this.ultraviolet = request.ultraviolet;
this.headers = {};
// eg set-cookie
for (const key in response.rawHeaders)
this.headers[key.toLowerCase()] = response.rawHeaders[key];
this.status = response.status;
this.statusText = response.statusText;
this.body = response.body;
}
get url() {
return this.request.url;
}
get base() {
return this.request.base;
}
set base(val) {
this.request.base = val;
}
//the header value might be an array, so this function is used to
//retrieve the value when it needs to be compared against a string
getHeader(key) {
if (Array.isArray(this.headers[key])) {
return this.headers[key][0];
}
return this.headers[key];
}
}
class RequestContext {
/**
*
* @param {Request} request
* @param {Ultraviolet} ultraviolet
* @param {BodyInit} body
*/
constructor(request, ultraviolet, body = null) {
this.ultraviolet = ultraviolet;
this.request = request;
this.headers = Object.fromEntries(request.headers.entries());
this.method = request.method;
this.body = body || null;
this.cache = request.cache;
this.redirect = request.redirect;
this.credentials = 'omit';
this.mode = request.mode === 'cors' ? request.mode : 'same-origin';
this.blob = false;
}
get url() {
return this.ultraviolet.meta.url;
}
set url(val) {
this.ultraviolet.meta.url = val;
}
get base() {
return this.ultraviolet.meta.base;
}
set base(val) {
this.ultraviolet.meta.base = val;
}
}
class HookEvent {
#intercepted;
#returnValue;
constructor(data = {}, target = null, that = null) {
this.#intercepted = false;
this.#returnValue = null;
this.data = data;
this.target = target;
this.that = that;
}
get intercepted() {
return this.#intercepted;
}
get returnValue() {
return this.#returnValue;
}
respondWith(input) {
this.#returnValue = input;
this.#intercepted = true;
}
}
/**
*
* @param {string} trace
* @param {string} fetchedURL
* @returns
*/
function errorTemplate(
trace,
fetchedURL,
) {
// turn script into a data URI so we don't have to escape any HTML values
const script = `
errorTrace.value = ${JSON.stringify(trace)};
fetchedURL.textContent = ${JSON.stringify(fetchedURL)};
for (const node of document.querySelectorAll('#uvHostname')) node.textContent = ${JSON.stringify(
location.hostname
)};
reload.addEventListener('click', () => location.reload());
uvVersion.textContent = ${JSON.stringify(
'3.2.7'
)};
`
return (
'{{ultraviolet-error}}'.replace('{{src}}', 'data:application/javascript,' + encodeURIComponent(script))
);
}
/**
*
* @param {unknown} err
* @param {string} fetchedURL
*/
function renderError(err, fetchedURL) {
let headers = {
'content-type': 'text/html',
};
if (crossOriginIsolated) {
headers['Cross-Origin-Embedder-Policy'] = 'require-corp';
}
return new Response(errorTemplate(String(err), fetchedURL), {
status: 500,
headers: headers,
});
}

View file

@ -1,6 +1,6 @@
importScripts('/uv/uv.bundle.js');
importScripts('/uv/uv.config.js');
importScripts(self['{{__uv$config}}'].sw || '/uv/uv.sw.js');
importScripts('/network/network.bundle.js');
importScripts('/network/network.config.js');
importScripts(self['{{__uv$config}}'].sw || '/network/network.sw.js');
/*

View file

@ -1,6 +1,6 @@
importScripts('/uv/uv.bundle.js');
importScripts('/uv/uv.config.js');
importScripts(self['{{__uv$config}}'].sw || '/uv/uv.sw.js');
importScripts('/network/network.bundle.js');
importScripts('/network/network.config.js');
importScripts(self['{{__uv$config}}'].sw || '/network/network.sw.js');
const uv = new UVServiceWorker();

View file

@ -6,34 +6,22 @@
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<title>Ho&#173;ly Unbloc&#173;ker</title>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="/baremux/index.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script>
<script src="/network/network.bundle.js" defer></script>
<script src="/network/network.config.js" defer></script>
<link rel="prefetch" href="/worker/w.worker.js" />
<link rel="prefetch" href="/worker/w.shared.js" />
<script src="/assets/js/register-sw.js" defer></script>
<!-- Arc widget causes lag on some gams, so it is created by js below if &nolag isn't specified in the querystring -->
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="/worker/w.controller.js"></script>
<iframe id="frame" allow="fullscreen" autofocus></iframe>
<script>
document.getElementById('frame').src = localStorage.getItem('huframesrc');

View file

@ -2,10 +2,10 @@
<h1
id="holy-unblocker-img-align-left-src-https-raw-githubusercontent-com-titaniumnetwork-dev-holy-unblocker-master-views-assets-img-icon-png-img-"
>
Holy Unblocker Documentation
H&#173;oly Unb&#173;locker Documentation
</h1>
<p>
Holy Unblocker, an official flagship Titanium Network site, can bypass web
H&#173;oly Unbl&#173;ocker, an official flagship Titanium Network site, can bypass web
filters regardless of whether it is an extension or network-based. Being a
secure web proxy service, it supports numerous sites while being updated
frequently and concentrating on detail with design, mechanics, and features.

View file

@ -1,5 +1,5 @@
<div class="faq-center">
<h2>Official Holy Unblocker FAQ and Support</h2>
<h2>Offi&#173;cial Ho&#173;ly Unb&#173;loc&#173;ker F&#173;AQ and Su&#173;pport</h2>
</div>
<div class="faq-box">
<input
@ -13,122 +13,103 @@
</div>
<div class="box-clear text-center textm">
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<h2 class="bigtitle">Icon Information</h2>
<h3>How to find the Icon URL of a Site</h3>
<h2 class="bigtitle">Ic&#173;on Inf&#173;ormat&#173;ion</h2>
<h3>H&#173;ow to fin&#173;d the I&#173;con U&#173;RL of a Si&#173;t&#173;e</h3>
<p>
Go to the website you want an icon from, then use this bookmarklet (drag it
to your bookmarks bar):
Go to th&#173;e webs&#173;ite y&#173;ou w&#173;ant an i&#173;con from, then use th&#173;is bookm&#173;arklet (drag it
to your bo&#173;okmarks ba&#173;r):
</p>
<div id="bks-parent">
<a id="iconfinder" class="fancybutton fb-l glowbutton">Find Icon URL</a>
<a id="iconfinder" class="fancybutton fb-l glowbutton">Fi&#173;nd I&#173;con U&#173;RL</a>
</div>
<script>
document.getElementById('iconfinder').href =
`javascript:alert((Array.from(document.head.querySelectorAll("link[rel*='icon']")).slice(-1)[0]||0).href||location.origin+"/favicon.ico")`;
</script>
<p>
Copy the URL that the bookmarklet gives you. Then go back to HU and enter in
the URL for the Icon URL in Settings. Enjoy!
Cop&#173;y the UR&#173;L that the bo&#173;okmar&#173;klet gi&#173;ves yo&#173;u. Then go back to H&#173;U and en&#173;ter in
the U&#173;RL for the Ico&#173;n UR&#173;L in Sett&#173;ings. Enj&#173;oy!
</p>
</div>
<div id="faqs" class="faq">
<div class="faq-text">
<h4><strong>I am getting 502 errors. What do I do?</strong></h4>
<p>The proxy may be down, being worked on or is under high load.</p>
<h4><strong>I am get&#173;ting 50&#173;2 err&#173;ors. Wh&#173;at do I d&#173;o?</strong></h4>
<p>The pro&#173;xy may be down, being wo&#173;rked on or is un&#173;der high lo&#173;ad.</p>
<p>
When this happens you may either switch sites to fix the error or wait a
bit. Sometimes clearing your cache can help by doing Ctrl+Shift+R or
reloading the page normally. (Hard Reload which purges cache.)
When this happens you may either switch sites to fi&#173;x the error or w&#173;ait a
bit. S&#173;ometi&#173;mes clear&#173;ing your cache can help by do&#173;ing Ctrl+S&#173;hif&#173;t+R or
reloading the page norm&#173;ally. (Hard Reload which purges cache.)
</p>
</div>
<div class="faq-text">
<h4>
<strong
>I am getting an error similar to: "'cdn.example.com' cannot be
>I am get&#173;ting an e&#173;rror similar to: "'cdn.exam&#173;ple.com' cannot be
reached."</strong
>
</h4>
<p>
Right-click the page and do Reload Frame. If that doesn't work the first
time, try waiting a bit or switching sites. Lastly doing a Hard Reload may
Right-click the page and do Re&#173;load Fra&#173;me. If that doesn't work the first
time, try wa&#173;iting a bit or switching sites. Lastly doing a Hard Re&#173;load may
help. (Ctrl+Shift+R)
</p>
</div>
<div class="faq-text">
<h4>
<strong
>Is Discord supported? And can I gain access to a better proxy for
Discord?</strong
>Is Disc&#173;ord supported? And can I gain acc&#173;ess to a better p&#173;roxy for
Disc&#173;ord?</strong
>
</h4>
<p>
Yes, Discord is supported. You can now login normally with Womginx but
most of the proxies still require you to login via QR Code or Token. You
may view the extended Discord proxy information below for more
information.
Yes, Discor&#173;d is sup&#173;ported. You can now login normally with W&#173;o&#173;m&#173;g&#173;inx but
most of the pro&#173;xies still require you to lo&#173;gin via QR Cod&#173;e or Token. You
may view the ext&#173;ended Disc&#173;ord proxy info&#173;rmation below for more
infor&#173;mation.
</p>
<ul>
<li>
When either instances are under high load occasionally Discord may be
slow or not work. In this case simply wait a bit or try using the TN
subscriber booster proxy.
When eith&#173;er instan&#173;ces are under high lo&#173;ad occas&#173;ionally D&#173;iscord/Spo&#173;ti&#173;fy may be
slow or not work. In this case s&#173;imply w&#173;ait a b&#173;it.
</li>
</ul>
<p>
If you wish for a proxy with better support for Discord, be sure to join
the TN Discord.
</p>
<p>
By donating $3 (simply type $upgrade in the TN Discord) you can gain
access to the premium Discord proxy which is faster, more secure and
outside of the current limitation of using Discord normally with any of
the free proxies.
</p>
<p>The premium Discord proxy is outside of these issues:</p>
<ul>
<li>Being prompted to verify by email or via phone number</li>
<li>Slow messaging or invalid invites</li>
<li>Possible VC support</li>
<li>Sites getting blocked often</li>
<li>And more!</li>
</ul>
</div>
<div class="faq-text">
<h4><strong>Why are YouTube videos not working?</strong></h4>
<h4><strong>Why are YouT&#173;ube videos not working?</strong></h4>
<p>
If you are having persistent issues even after doing the steps above there
is a chance that the instance is down temporarily, especially if large
groups of people are also having the issue. The latest release of Alloy
<strong>currently</strong> does not have support for YouTube. However
manually putting in full links like
<code>https://www.youtube.com/watch?v=mauV2NdCs60</code> will work. You
may also try doing a Hard Reload (Ctrl+Shift+R)
If you are hav&#173;ing persistent iss&#173;ues even after doing the steps above there
is a chance that the instance is down te&#173;porarily, especially if large
groups of peopl&#173;e are also ha&#173;ving the issue. The latest release of U&#173;ltrav&#173;iolet
<strong>currently</strong> does not have support for YouT&#173;ube. Howe&#173;ver
manually putting in full lin&#173;ks like
<code>ht&#173;tps://www.youtube.&#173;com/watch?v=ma&#173;uV2Nd&#173;Cs60</code> will work. Y&#173;ou
may also try doing a Hard Rel&#173;oad (Ctrl+Shift+R)
</p>
<p>A later release of Alloy may fix this issue. Sorry.</p>
<p>A la&#173;ter release of U&#173;ltra&#173;violet will fix this issue. Sor&#173;ry.</p>
</div>
<div class="faq-text">
<h4>
<strong
>When using YouTube I get a similar error to "Cannot GET /watch"</strong
>When u&#173;sing YouT&#173;ube I get a similar error to "Cann&#173;ot GET /wat&#173;ch"</strong
>
</h4>
<p>
Do Ctrl+Shift+R (Hard Reload which clears your cache) and if that doesn't
work use the full URL of the video you want to watch with either Alloy or
Womginx, Alloy being preferred for an option as it has the best YouTube
Do Ctrl+Sh&#173;ift+R (Hard Reload which clears your cache) and if that doesn't
work use the full URL of the video you want to watch with either Ul&#173;tra&#173;vio&#173;let or
Ram&#173;merh&#173;ead, Ultr&#173;violet being prefe&#173;rred for an option as it has the best You&#173;Tube
support.
</p>
</div>
<div class="faq-text">
<h4>
<strong
>Parse error, etc. or perhaps even Cannot GET /gkfdsgkfgfdkg
>Parse error, etc. or perh&#173;aps even Cannot GET /gkfd&#173;sgkfgfdkg
</strong>
</h4>
<p>
Might be possible that you need to wait a bit because of updates that may
have occurred and are not visible yet due to cache. In this situation do a
Hard Reload or switch Holy Unblocker sites. (Ctrl + Shift + R)
Might be possible that you need to wait a bit because of upd&#173;ates that may
have occurred and are not visible yet due to cache. In this sit&#173;uation do a
Hard Reload or switch H&#173;oly Unblo&#173;cker sites. (Ctrl + Shift + R)
</p>
</div>
<div class="faq-text">
@ -139,48 +120,48 @@
>
</h4>
<p>
Captcha support is currently not available on all of the current proxies
Captcha suppo&#173;rt is currently not avail&#173;able on all of the current proxies
sadly. Therefore some sites may not work with any of the sites. Read below
for issues with links on sites.
</p>
</div>
<div class="faq-text">
<h4>
<strong>Why are page links not working or leading to 404 pages?</strong>
<strong>Why are page links not working or leading to 404 p&#173;ages?</strong>
</h4>
<p>
This is an issue with the latest release of Alloy proxy but it may also
occur with other proxies. In this case manually entering the URL of the
This is an is&#173;sue with the latest release of Al&#173;loy pro&#173;xy but it may also
occur with other p&#173;rox&#173;ies. In this case manually entering the URL of the
page you would like to view can solve this or try navigating using the
home button. (Reddit, Twitter) The next release of Alloy may fix this
home button. (R&#173;eddit, Twitter) The next release of Al&#173;lo&#173;y may fix this
also.
</p>
</div>
<div class="faq-text">
<h4>
<strong>
When using YouTube on any of the proxy sites, why does the page not load
When using YouT&#173;ube on any of the prox&#173;y sites, why does the page not load
fully or the video is just white?</strong
>
</h4>
<p>There are two methods for fixing this:</p>
<p>There are two methods for fixi&#173;ng this:</p>
<ul>
<li>
<p>
Reloading the page normally when the error above happens should load
Reloading the page norm&#173;ally when the error above happens s&#173;hould load
the video.
</p>
</li>
<li>
<p>
Or right-clicking the page and doing <code>Reload Frame</code> if you
are using some form of Stealth Mode.
are using some form of S&#173;teal&#173;th Mod&#173;e.
</p>
</li>
</ul>
<h4>
<strong
>When using Discord under Alloy or Powermouse, why does the page stay
>When using Disc&#173;ord under All&#173;oy or Powermo&#173;use, why does the page stay
gray/white or the QR code not load?</strong
>
</h4>
@ -197,101 +178,65 @@
<li>
<p>
Or right-clicking the page and doing <code>Reload Frame</code> if you
are using some form of Stealth Mode. Make sure you are also doing the
steps correctly. Simply view below for extended Discord proxy
are using some form of St&#173;ealth Mode. Make sure you are also doing the
steps correctly. Simp&#173;ly view below for extended Discord proxy
information/steps.
</p>
</li>
</ul>
</div>
<div class="faq-text">
<h3 id="discord-proxy-information-">Discord Proxy Information:</h3>
<h3 id="discord-proxy-information-">Disco&#173;rd P&#173;roxy Info&#173;rmation:</h3>
<p><strong>Disclaimer:</strong></p>
<p></p>
Your account may be at risk of being disabled by Discord if you are using
any of the proxies in general, Womginx being a possible exception. Unless
any of the proxies in general, Wo&#173;m&#173;gin&#173;x being a possible exception. Unless
you have 2FA or a phone number <strong>be careful</strong>.
<p></p>
</div>
<div class="faq-text">
<h4 id="general-steps-">General Steps:</h4>
<p>
1) Go to either Surf Freely/Web Proxies if you wish to access Discord
1) Go to either Sur&#173;f Freely/We&#173;b Pr&#173;xies if you wish to access Discord
manually or the Discord page from the navbar.
</p>
<p>
If you selected the Discord page simply choose either Stealth Mode or
If you selected the D&#173;iscord page simply choose either St&#173;ealth Mode or
Classic Mode. For any support view the FAQ questions above.
</p>
<p>
2) Select either Womginx or Alloy. Womginx has support for normal logins
but may not work for every filter while Alloy is QR login only but has
2) Select either W&#173;om&#173;ginx or All&#173;oy. W&#173;om&#173;gi&#173;nx has support for normal logins
but may not work for every filter while Al&#173;oy is Q&#173;R log&#173;in only but has
generally better support in some cases.
</p>
<p>3) Type out one of these terms:</p>
<p><code>- https://discord.com/login</code></p>
<p><code>- https://discord.com/app</code></p>
<p><code>- https://disc&#173;ord.com/log&#173;in</code></p>
<p><code>- https://discord.c&#173;om/app</code></p>
<p>
4) Then hit either Stealth or Classic as a mode. Stealth mode hides your
history while Classic mode is the normal method of accessing a site.
4) Then hit either Ste&#173;alth or Clas&#173;sic as a mode. Stealth mode hides your
history while Clas&#173;sic mode is the normal method of accessing a site.
</p>
</div>
<div class="faq-text">
<h4 id="qr-login-faq-">QR Login FAQ:</h4>
<p>
Make sure you are using Alloy + QR Code for Discord. You CANNOT login
normally with Alloy.
</p>
<p>
Powermouse also has QR login support if you wish for an alternative proxy.
</p>
<h5
id="qr-code-information-https-support-discord-com-hc-en-us-articles-360039213771-qr-code-login-faq"
>
QR Code Information:
<a
href="https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ"
>https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ</a
>
</h5>
<p>Use the link above through one of the proxies to read if you can't.</p>
<p><strong>Common Issues with Solutions:</strong></p>
<p>Use the link above through one of the prox&#173;ies to read if you can't.</p>
<p><strong>Common Issues with So&#173;lutions:</strong></p>
<ul>
<li>
If the page appears gray on the first load, reload/spam reload the page
If the page appears g&#173;ray on the first load, reload/spa&#173;m reload the page
a bunch.
</li>
<li>If the QR code doesn't load, reload/spam reload the page a bunch.</li>
<li>If the Q&#173;R code do&#173;esn't load, reload/spam relo&#173;ad the page a bunch.</li>
<li>
If the page/discord logo keeps loading, reload/spam the page also.
If the page/disc&#173;ord logo keeps loading, reload/spam the page also.
<em
>You may also right-click the page and do "Reload Frame" to reload
>You may also right-click the page and do "Relo&#173;ad Frame" to reload
also.</em
>
</li>
</ul>
<p>
If none of these solutions work either the proxy is down or you can try to
If none of these solutions work either the pro&#173;xy is down or you can try to
do a hard reload. (Ctrl+Shift+R)
</p>
</div>
<div class="faq-text">
<p>
PM also has amazing support for QR logins. Feel free to mess around
between PM and Alloy.
</p>
<p><strong>Token Login Extended:</strong></p>
<p>
Also, search up on YT on How to find your Discord Token when using Token
Login. This only works on Powermouse but not the best option.
</p>
<p>
Token logins on Powermouse (PM Proxy) will require another device also for
recovering your Discord account.
</p>
<h4>
<strong>Best Solution:</strong> Do Ctrl+Shift+R (Hard Reload which clears
your cache). Sites here are often updated hence issues that may arise.
</h4>
</div>
</div>

View file

@ -1,19 +1,19 @@
<div class="footerflex">
<div class="footerbrand">
<h3><a href="/" title="Holy Unblocker Homepage">Holy Unblocker</a></h3>
<p>Global Web Proxy Innovation, Done Right.</p>
<div class="logo-potato" aria-label="Holy Unblocker Logo"></div>
<h3><a href="/" title="Ho&#173;ly Unbl&#173;ocker Hom&#173;epage">Ho&#173;ly U&#173;nbl&#173;ock&#173;er</a></h3>
<p>Glob&#173;al W&#173;eb Pro&#173;xy Innovati&#173;on, Do&#173;ne Rig&#173;ht.</p>
<div class="logo-potato" aria-label="H&#173;oly Un&#173;loc&#173;ker L&#173;ogo"></div>
</div>
<div class="footerlist">
<h3>Dependencies</h3>
<h3>Dep&#173;en&#173;denc&#173;ies</h3>
<ul>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/fastify"
title="Fastify - Fast and low overhead web framework, for Node.js "
>Fastify</a
title="Fas&#173;tify - Fas&#173;t and low ov&#173;erhead web frame&#173;work, for No&#173;de.js "
>Fast&#173;ify</a
>
</li>
<li>
@ -21,8 +21,8 @@
target="_blank"
rel="noopener noreferrer"
href="/github/nord-theme"
title="Nord Theme - An arctic, north-bluish color palette."
>Nord Theme</a
title="No&#173;rd Th&#173;eme - An arc&#173;tic, north-blu&#173;ish color palet&#173;te."
>No&#173;rd Th&#173;eme</a
>
</li>
<li>
@ -30,8 +30,8 @@
target="_blank"
rel="noopener noreferrer"
href="/github/aos"
title="AOS - Animate on scroll library "
>AOS</a
title="AO&#173;S - Anim&#173;ate on sc&#173;oll lib&#173;rary "
>A&#173;OS</a
>
</li>
<li>
@ -39,81 +39,67 @@
target="_blank"
rel="noopener noreferrer"
href="/github/font-awesome"
title="Font Awesome - The iconic SVG, font, and CSS toolkit"
>Font Awesome
title="F&#173;ont Awe&#173;some - The ic&#173;onic S&#173;VG, fo&#173;nt, and C&#173;SS tool&#173;kit"
>Fo&#173;nt Aweso&#173;me
</a>
</li>
</ul>
</div>
<div class="footerlist">
<h3>Transports</h3>
<h3>Tr&#173;ansp&#173;orts</h3>
<ul>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/epoxy"
title="Epoxy - Epoxy is an encrypted proxy for browser javascript. It allows you to make requests that bypass CORS without compromising security, by running SSL/TLS inside webassembly."
>Epoxy</a
href="/github/ep">Epo&#173;xy</a
>
</li>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/libcurl-js"
title="A port of libcurl to WebAssembly, for proxying HTTPS requests from the browser with full TLS encryption"
>Libcurl</a
href="/github/lj">Lib&#173;c&#173;url</a
>
</li>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/bare-module"
title="Bare Module - Tomp Bare Client as a bare-mux module"
>Bare Module</a
href="/github/bam">B&#173;are Mod&#173;ule</a
>
</li>
</ul>
</div>
<div class="footerlist">
<h3>Services</h3>
<h3>Serv&#173;ices</h3>
<ul>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/ultraviolet"
title="Ultraviolet - Explore Ultraviolet"
>Ultraviolet</a
href="/github/config">Ultr&#173;aviole&#173;t</a
>
</li>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/wisp"
title="Wisp - Wisp is a low-overhead, easy to implement protocol for proxying multiple TCP/UDP sockets over a single websocket. "
>Wisp Protocol</a
href="/github/wm">Wi&#173;sp Prot&#173;ocol</a
>
</li>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/rammerhead-discord"
title="Rammerhead - Join Rammerhead on Discord"
>Rammerhead</a
href="/config-chat">Ram&#173;erhe&#173;ad</a
>
</li>
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/github/bare-mux"
title="BareMux - A system for managing http transports in a project such as Ultraviolet"
>Bare-Mux</a
href="/github/bm">Ba&#173;re-M&#173;ux</a
>
</li>
</ul>
@ -125,18 +111,16 @@
<a
target="_blank"
rel="noopener noreferrer"
href="/github"
title="Holy Unblocker GitHub Repository"
>GitHub</a
href="/github">GitH&#173;ub</a
>
</li>
<li>
<a href="/terms" title="Privacy Policy and Terms of Service"
>Privacy and Terms of Service</a
>Priv&#173;acy and T&#173;erms of Servi&#173;ce</a
>
</li>
<li>
<a href="/credits" title="Credits and Acknowledgements">Credits</a>
<a href="/credits" title="Credits and Acknowledgements">Credi&#173;ts</a>
</li>
</ul>
</div>
@ -151,17 +135,13 @@
target="_blank"
rel="noopener noreferrer"
class="soc-github"
href="/github"
title="Follow Holy Unblocker on GitHub"
><i class="fab fa-github" aria-hidden="true"></i
href="/github"><i class="fab fa-github" aria-hidden="true"></i
></a>
<a
target="_blank"
rel="noopener noreferrer"
class="soc-patreon"
href="/titaniumnetwork-documentation"
title="View Documentation on Titanium Network"
><i class="fas fa-file-code" aria-hidden="true"></i
href="/config-docs"><i class="fas fa-file-code" aria-hidden="true"></i
></a>
</div>
<p class="copyright">Holy Unblocker LTS &copy; 2020-2024</p>
<p class="copyright">Ho&#173;ly Unb&#173;locker L&#173;TS &copy; 20&#173;20-20&#173;24</p>

View file

@ -1,7 +1,7 @@
<div class="brand-logo-container" aria-label="Brand Logo">
<div class="logo" role="img" aria-label="Holy Unblocker Logo"></div>
<a href="/" class="brand pulse" title="Holy Unblocker Home Page"
>Holy Unblocker v6.3.x</a
<div class="brand-logo-container" aria-label="B&#173;ran&#173;d Lo&#173;go">
<div class="logo" role="img" aria-label="Ho&#173;ly Unb&#173;loc&#173;ker Log&#173;o"></div>
<a href="/" class="brand pulse" title="Ho&#173;ly Un&#173;bloc&#173;k&#173;er H&#173;ome Pa&#173;ge"
>H&#173;oly U&#173;nbl&#173;ocke&#173;r v6.4&#173;.x</a
>
</div>
@ -9,29 +9,29 @@
<li class="pulse" style="margin-left: 0" role="listitem">
<a
href="/browsing"
title="Web Proxies - Access various web proxies to bypass restrictions"
>Web Proxies</a
title="We&#173;b Pr&#173;o&#173;xi&#173;es - Acc&#173;ess vario&#173;us we&#173;b pr&#173;oxi&#173;es to bypas&#173;s res&#173;tri&#173;ctions"
>W&#173;eb P&#173;roxi&#173;es</a
>
</li>
<li class="pulse" role="listitem">
<a
href="/games"
title="Games - Explore a range of games available through our service"
>Games</a
href="/g"
title="Ga&#173;mes - Explo&#173;re a ran&#173;ge of ga&#173;mes availab&#173;le throug&#173;h our ser&#173;vice"
>Ga&#173;me&#173;s</a
>
</li>
<li class="pulse" role="listitem">
<a
href="/youtube"
title="YouTube - Access YouTube content through our proxy service"
>YouTube</a
title="Yo&#173;uT&#173;ube - Acc&#173;ess Y&#173;ouT&#173;ube co&#173;nte&#173;nt thro&#173;ugh o&#173;ur pr&#173;oxy ser&#173;vice"
>Yo&#173;uTu&#173;be</a
>
</li>
<li class="pulse new" role="listitem">
<a
href="/apps"
title="Applications - Browse a selection of useful applications"
>Applications</a
title="App&#173;licati&#173;ons - Brow&#173;se a s&#173;elect&#173;ion o&#173;f use&#173;ful app&#173;licati&#173;ons"
>App&#173;lic&#173;ati&#173;ons</a
>
</li>
</ul>
@ -45,7 +45,7 @@
<li class="dropdown-parent" role="listitem">
<div class="pulse white-text" aria-haspopup="true" aria-expanded="false">
<a href="#" aria-label="More options"
>More <i class="fas fa-ellipsis-v" aria-hidden="true"></i
>M&#173;ore <i class="fas fa-ellipsis-v" aria-hidden="true"></i
></a>
</div>
<div
@ -58,34 +58,34 @@
<li role="menuitem">
<a
href="/bookmarklets"
title="Bookmarklets - Useful tools and shortcuts for your browser"
>Bookmarklets</a
title="B&#173;ook&#173;ma&#173;rklets - Use&#173;ful t&#173;ools and sh&#173;ortcu&#173;ts for your bro&#173;wser"
>Boo&#173;kmar&#173;klets</a
>
</li>
<li role="menuitem">
<a
href="/?documentation"
title="Documentation - Detailed information and guides"
>Docs</a
title="Docu&#173;men&#173;tation - Det&#173;ailed inf&#173;orma&#173;tion and gui&#173;des"
>D&#173;ocs</a
>
</li>
<li role="menuitem">
<a
href="/questions"
title="FAQ - Frequently asked questions and answers"
>FAQ</a
title="F&#173;AQ - Fre&#173;quently as&#173;ked qu&#173;estions and ans&#173;wers"
>F&#173;AQ</a
>
</li>
<li role="menuitem">
<a
href="/credits"
title="Credits - Acknowledgements and contributions"
>Credits</a
title="Cre&#173;dits - Acknowled&#173;gements and contribu&#173;tions"
>Cre&#173;dits</a
>
</li>
<li role="menuitem">
<a href="/terms" title="Terms of Service - Rules and policies of use"
>TOS</a
<a href="/terms" title="Te&#173;rms of Ser&#173;vice - Rul&#173;es and polic&#173;ies of u&#173;se"
>T&#173;OS</a
>
</li>
</ul>
@ -94,7 +94,7 @@
<li class="dropdown-parent" role="listitem">
<div class="pulse white-text" aria-haspopup="true" aria-expanded="false">
<a href="#" aria-label="Settings menu"
>Settings <i class="fas fa-cog pulse" aria-hidden="true"></i
>Sett&#173;ings <i class="fas fa-cog pulse" aria-hidden="true"></i
></a>
</div>
<div

View file

@ -1,11 +1,11 @@
<div id="csel" class="settings-content">
<div class="settings-header">
<p class="cseltitle-main">Settings</p>
<p class="cseltitle-main">Setti&#173;ngs</p>
<i class="far fa-times-circle close-settings-btn"></i>
</div>
<div class="settings-content-body">
<div class="csel-container-left">
<p class="cseltitle">Tab Cloak</p>
<p class="cseltitle">T&#173;ab Clo&#173;ak</p>
<form id="titleform" class="cloakform">
<input type="text" placeholder="Tab Title" spellcheck="false" />
<input type="submit" value="Apply" />
@ -14,53 +14,61 @@
<input type="text" placeholder="Icon URL" spellcheck="false" />
<input type="submit" value="Apply" />
</form>
<p class="cseltitle">Ultraviolet Proxy Transport</p>
<p class="cseltitle">Ultr&#173;avio&#173;let P&#173;roxy Tr&#173;ansport</p>
<div class="radio-group" id="uv-transport-list">
<label>
<p>
Libcurl
<span class="default-badge">Cross-Browser/Secure (Firefox)</span>
<span class="default-badge">Cr&#173;oss-Bro&#173;wser/Secu&#173;re (Fi&#173;refox)</span>
</p>
<input type="radio" name="uv-transport" value="libcurl" checked />
</label>
<label>
<p>
Epoxy
<span class="bare-badge">Fastest/Secure (Chromium, Apple)</span>
<span class="bare-badge">Fa&#173;stest/Se&#173;cure (Chro&#173;mium, App&#173;le)</span>
</p>
<input type="radio" name="uv-transport" value="epoxy" />
</label>
<label>
<p>Bare <span class="beta-badge">Least Secure (All)</span></p>
<p>Bare <span class="beta-badge">L&#173;east Sec&#173;ure (All)</span></p>
<input type="radio" name="uv-transport" value="bare" />
</label>
</div>
<p class="cseltitle">Advanced Options</p>
<p class="cseltitle">Adva&#173;nced Opt&#173;ions</p>
<div class="radio-group">
<label>
<p>Hide Ads <span class="default-badge">AdGuard</span></p>
<p>Hi&#173;de Ad&#173;s <span class="default-badge">AdGu&#173;ard</span></p>
<input type="checkbox" id="hideads" class="switch" checked />
</label>
<label>
<p>Enable Tor <span class="bare-badge">SOCKS5 Onion Routing</span></p>
<p>En&#173;able T&#173;or <span class="bare-badge">SOC&#173;KS5 On&#173;ion Rou&#173;ting</span></p>
<input type="checkbox" id="useonion" class="switch" />
</label>
</div>
</div>
<div class="settings-right-column">
<p class="cseltitle">Search Engine</p>
<p class="cseltitle">Se&#173;arch Eng&#173;ine</p>
<select>
<option>Goog&#173;le</option>
<option>Bi&#173;ng</option>
<option>DuckD&#173;uckGo</option>
<option>Yah&#173;oo</option>
</select>
<p class="cseltitle">Ic&#173;on Pres&#173;ets</p>
<select id="icon-list">
<option><!-- Leave this blank to avoid a bug. --></option>
<option>Google</option>
<option>Bing</option>
<option>DuckDuckGo</option>
<option>Yahoo</option>
<option>Google Drive</option>
<option>Gmail</option>
</select>
<p class="cseltitle">About:Blank</p>
<p class="cseltitle">About:Bla&#173;nk (Bet&#173;a)</p>
<div class="switch-container">
<p>Stealth Tab <span class="default-badge">Default</span></p>
<p>Stealth Tab <span class="default-badge">Def&#173;ault</span></p>
<input type="checkbox" class="switch" />
</div>
<p class="cseltitle">Select Theme</p>
<p class="cseltitle">Se&#173;lect The&#173;me (Bet&#173;a)</p>
<div class="radio-group">
<label>
<p>Light</p>
@ -71,18 +79,10 @@
<input type="radio" name="theme" value="darktheme" />
</label>
</div>
<p class="cseltitle">Icon Presets</p>
<select id="icon-list">
<option><!-- Leave this blank to avoid a bug. --></option>
<option>Google</option>
<option>Bing</option>
<option>Google Drive</option>
<option>Gmail</option>
</select>
<p class="cseltitle">Enable Devtools</p>
<p class="cseltitle">En&#173;able De&#173;vtools (Bet&#173;a)</p>
<div class="radio-group">
<label>
<p>Eruda Devtools<span class="bare-badge">CTRL+SHIFT+I</span></p>
<p>Eru&#173;da Devto&#173;ols<span class="bare-badge">CT&#173;RL+SHI&#173;FT+&#173;I</span></p>
<input type="radio" name="theme" value="lighttheme" checked />
</label>
</div>

View file

@ -2,116 +2,115 @@
<div style="margin: 2%">
<div class="text-center">
<h1 class="bigtitle">Privacy Policy</h1>
<h4>Holy Unblocker, a private web proxy service.</h4>
<h4>Ho&#173;ly Unb&#173;locker, a pri&#173;vate web pr&#173;xy ser&#173;vice.</h4>
</div>
<p><strong>Effective Date: 07-16-2021</strong></p>
<p><strong>Updated Date: 07-07-2024</strong></p>
<h4>What is Holy Unblocker?</h4>
<p><strong>Updated Date: 12-16-2024</strong></p>
<h4>What is Ho&#173;ly Unbloc&#173;ker?</h4>
<p>
Holy Unblocker LTS, an experimental web proxy service, can bypass web
filters or 'blockers' regardless of whether the method of censorship is
client-side or network-based. This includes the potential ability to
bypass content blockers overseas, Chrome extensions, localized client
firewalls, and network-related filters.<br />This project serves mostly as
a proof of concept for the ideal clientless solution to bypassing
censorship. Being a secure web proxy service, it supports numerous sites
H&#173;oly Unb&#173;locker L&#173;TS, an experi&#173;mental w&#173;eb pro&#173;xy ser&#173;vice, can byp&#173;ass web
fil&#173;ters or 'b&#173;lockers' regardless of whether the method of censo&#173;rship is
client-side or network-based. This includes the pot&#173;ential ability to
bypass content blo&#173;ckers overseas, Chr&#173;ome extensions, localized client
fir&#173;ewalls, and netw&#173;ork-rel&#173;ated fi&#173;lters.<br />This p&#173;roject serves mostly as
a proof of concept for the ideal clien&#173;tless solution to bypa&#173;ssing
censorship. Being a secure w&#173;eb pr&#173;oxy service, it supports numerous sites
while being updated frequently and concentrating on detail with design,
mechanics, and features.
</p>
<h4>Is any data being collected?</h4>
<p>
Nope! No data is logged or collected by any of our web proxes featured.
Holy Unblocker values its statement of ending intenet censorship along
with valuing user privacy.<br /><br />If you wish to make a privacy
statement or request please contact us via Discord:
Nope! No data is logged or collected by any of our w&#173;eb prox&#173;ies featured.
Ho&#173;ly Unblo&#173;cker values its statem&#173;ent of ending inte&#173;net cens&#173;orship along
with valuing user privacy. This servi&#173;ce is m&#173;ade to be as transpar&#173;ent as po&#173;ssible and reme&#173;mber you can self-host at any ti&#173;me.<br /><br />If you wish to make a privacy
statement or request please contact us via Disco&#173;rd:
</p>
<h4 id="Security">Security</h4>
<p>
Holy Unblocker LTS is built on cutting-edge technology to ensure a secure
and reliable web proxy service for its users. One of the core technologies
behind HU LTS is the new Wisp protocol, developed by Mercury Workshop.<br /><br />This
H&#173;ol&#173;y Unblo&#173;cker L&#173;TS is built on cutting-edge technology to ensure a secure
and reliable w&#173;eb pr&#173;oxy serv&#173;ice for its users. One of the core technologies
behind H&#173;U LT&#173;S is the new Wi&#173;sp protocol, developed by Mercu&#173;ry Work&#173;shop.<br /><br />This
protocol brings several innovative features and enhancements that
contribute to the robustness and efficiency of the service.
</p>
<p>
The Wisp protocol is designed to handle modern web traffic demands while
maintaining high security standards. By implementing Wisp, HU LTS
leverages the following benefits:
The W&#173;isp pro&#173;tocol is designed to ha&#173;ndle mod&#173;ern web tra&#173;ffic dem&#173;ands whi&#173;le
maintai&#173;ning high secur&#173;ity st&#173;andards. By implement&#173;ing Wi&#173;sp, H&#173;U L&#173;TS
levera&#173;ges the follow&#173;ing be&#173;nefits:
</p>
<p>
Enhanced Performance: The Wisp protocol optimizes data transfer speeds,
Enhanc&#173;ed Perfor&#173;mance: The W&#173;isp pro&#173;tocol optimi&#173;zes data tra&#173;nsfer speeds,
ensuring that users experience minimal latency while browsing.
</p>
<p>
Improved Compatibility: Wisp is built to be compatible with a wide range
Impr&#173;oved Compa&#173;tibility: Wis&#173;p is built to be compati&#173;ble with a wide range
of web technologies, ensuring seamless access to various websites and
online services.
</p>
<p>
Resilience Against Censorship: The protocol is designed to bypass
Resil&#173;ience Against Cen&#173;sorship: The protocol is designed to bypass
sophisticated censorship techniques employed by restrictive networks,
allowing users to access blocked content with ease.
</p>
<p>
Strong Fingerprint Resistance: HU LTS employs strong fingerprint
resistance mechanisms within its reverse proxy setup for official
instances. This means that the proxy is designed to minimize the unique
identifiers that can be used to track or identify users, thereby enhancing
Strong Fingerprint Resistance: H&#173;U L&#173;TS employs strong fingerprint
resistance mechanisms within its reverse pro&#173;xy setup for official
instances. This means that the p&#173;roxy is designed to minimize the unique
identifiers that can be used to track or identify users, thereby enhanc&#173;ing
privacy. By following industry best practices and continually updating its
methods, HU LTS ensures that users can browse anonymously without leaving
methods, H&#173;U LT&#173;S ensures that users can browse anonymously without leaving
identifiable traces.
</p>
<p>
Transparency: Transparency is a key principle for HU LTS. The project
operates with an open-source model, allowing the community to review and
contribute to the codebase. This openness not only fosters trust but also
enables continuous improvement through community feedback and
collaboration. By adhering to transparent practices, HU LTS ensures that
users are aware of how their data is handled and what measures are in
place to protect their privacy.
Transpa&#173;rency: Tra&#173;nsparency is a key principle for H&#173;U L&#173;TS. The project
operates with an open-source model, allowing the com&#173;munity to review and
contribute to the codebase. This openness not only fost&#173;ers trust but also
enables continu&#173;ous improvem&#173;ent through community feedback and
collabo&#173;ration. By adhering to trans&#173;parent pra&#173;ctices, H&#173;U L&#173;TS ensures that
use&#173;rs are aware of how their da&#173;ta is handled and what measures are in
place to prote&#173;ct the&#173;ir priva&#173;cy.
</p>
<p>
URL Rewriting: HU LTS employs URL rewriting techniques to maintain
seamless browsing experiences while ensuring that the actual URLs accessed
remain obfuscated, adding an additional layer of security.
U&#173;RL Rewr&#173;iting: H&#173;U LT&#173;S employs U&#173;RL rew&#173;riting techniques to maintain
seamless br&#173;owsing experi&#173;ences while en&#173;suring that the actual UR&#173;Ls accessed
remain obf&#173;uscated, adding an addi&#173;tional layer of secu&#173;rity.
</p>
<p>
Encryption: HU LTS utilizes advanced proxy technologies that focus on
encryption and secure data transfer, particularly in the context of URL
rewriting proxies. NOTE: This is still a massive work in progress and open
to contributions.
En&#173;cryp&#173;tion: H&#173;U LT&#173;S utilizes advan&#173;ced prox&#173;y tec&#173;hnologies that focus on
encrypt&#173;ion and sec&#173;ure dat&#173;a tr&#173;ansfer, particularly in the contex&#173;t of U&#173;RL
rewriting proxies. N&#173;OTE: This is still a massive work in prog&#173;ress and open
to contribu&#173;tions.
</p>
<p>
Regular Audits: Conducting regular security audits to identify and address
Regular Audi&#173;ts: Condu&#173;cting regular secur&#173;ity audits to identify and ad&#173;dress
potential vulnerabilities.
</p>
<h4 id="Cookies">Cookie Usage</h4>
<p>
Holy Unblocker uses "Cookies" and similar technologies to maintain a user
H&#173;oly Unb&#173;loc&#173;ker uses "Cook&#173;ies" and simi&#173;lar technologies to maintain a user
session (described more below) and store your preferences on your
computer. All of this information is completely private being only local
content withFGF no analytical purposes.
content with no analytical purposes.
</p>
<p>
A cookie is a string of information that a website stores on a visitor's
computer, and that the visitor's browser provides to the website each time
the visitor returns. Holy Unblocker uses cookies to help Holy Unblocker
with security on ${document.domain} and its proxy instances, and lastly
the visitor returns. Ho&#173;ly Unblo&#173;cker uses cookies to help ensure usea&#173;blity with the Setti&#173;ngs menu, and lastly
for user preferences. Users who do not wish to have cookies placed on
their computers should set their browsers to refuse cookies before using
Holy Unblocker's websites, with the drawback that certain features of Holy
Unblocker may not function properly without the aid of cookies.
Ho&#173;ly Unb&#173;lock&#173;er's websites, with the drawback that certain features of H&#173;oly
U&#173;nblo&#173;cker may not function properly without the aid of cookies. No cookies are sto&#173;red for anal&#173;ytical purp&#173;oses only fun&#173;ctions such as the Ta&#173;b Clo&#173;ak menu, etc. rely on it for storing data locally.
</p>
<p>
By continuing to navigate our website without changing your cookie
settings, you hereby acknowledge and agree to Holy Unblocker's use of
settings, you hereby acknowledge and agree to Ho&#173;ly Unb&#173;locker's use of
cookies.
</p>
<h4 id="Changes">Ending Note</h4>
<p>
Although most changes are likely to be minor, Holy Unblocker may change
its Privacy Policy from time to time, and in Holy Unblocker's sole
discretion. Holy Unblocker encourages visitors to frequently check this
Although most changes are likely to be minor, Hol&#173;y Unblo&#173;cker may change
its Privacy Policy from time to time, and in Ho&#173;ly Unbloc&#173;ker's sole
discretion. H&#173;ol&#173;y Unblo&#173;c&#173;ker encourages visitors to frequently check this
page for any changes to its Privacy Policy. Your continued use of this
site after any change in this Privacy Policy will constitute your
acceptance of such change.
@ -119,7 +118,7 @@
<h4 id="Credit">Contact Information &amp; Credit</h4>
<p>
If you have any questions about our Privacy Policy, please contact us via
<br /><br />Discord:&nbsp;https://discord.gg/unblock<br />
<br /><br />Di&#173;scord:&nbsp;https://disco&#173;rd.gg/unb&#173;lock<br />
</p>
</div>
</div>

View file

@ -2,38 +2,24 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box text-center"></div>
</div>
@ -41,6 +27,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,38 +2,23 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box text-center textm">
<h1 class="bigtitle">Bookmarklets</h1>
@ -70,6 +55,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,104 +2,88 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div class="box-clear box-credits text-center textm">
<h1 class="bigtitle">Credits</h1>
<p>Contact information can be viewed <a href="/?t">here.</a></p>
<h2>What is Holy Unblocker?</h2>
<h2>What is H&#173;oly Unblo&#173;cker?</h2>
<p>
Holy Unblocker, an official flagship Titanium Network site, can bypass
web filters regardless of whether it is an extension or
network-based.<br />Being a secure web proxy service, it supports
numerous sites while being updated frequently and concentrating on
detail with design, mechanics, and features.
Ho&#173;ly Un&#173;blo&#173;cker, an off&#173;icial fla&#173;gship Titan&#173;ium Netwo&#173;rk site, can byp&#173;ass
we&#173;b filte&#173;rs regardless of whet&#173;her it is an exten&#173;sion or
netwo&#173;rk-based.<br />Being a secu&#173;re web p&#173;roxy ser&#173;vice, it s&#173;upports
nume&#173;rous sites while being up&#173;dated freq&#173;uently and concent&#173;rating on
detail with de&#173;sign, mech&#173;anics, and featur&#173;es.
</p>
<h2>What is Titanium Network about?</h2>
<h2>What is Tit&#173;anium Ne&#173;twork about?</h2>
<p>
Titanium Network is an organization dedicated to providing private
internet access by bypassing the over-restrictive filters employed by
institutions like schools or workplaces.
T&#173;itani&#173;um Ne&#173;two&#173;rk is an o&#173;rganization dedicated to provi&#173;ding priv&#173;ate
inte&#173;rnet access by bypa&#173;ssing the over-restricti&#173;ve filt&#173;ers employed by
institutions like sc&#173;hools or workp&#173;laces.
</p>
<div>
<h3>Main Developers:</h3>
<h3>M&#173;ain Develo&#173;pers:</h3>
<ul class="binside">
<li>
Quite A Fancy Emerald (Creator and Owner, Discord: @quiteafancyemerald)
Qui&#173;te A Fa&#173;ncy Emera&#173;ld (Creat&#173;or and Ow&#173;ner, Disco&#173;rd: @quiteafa&#173;ncyemerald)
</li>
<li>
OlyB/BinBashBanana (Co-Owner, Main Contributor, v5 rewrite, Tab Cloak,
webretro dev, Discord: OlyB#9420)
Ol&#173;yB/BinBash&#173;Banana (Co-Own&#173;er, Main Contr&#173;ibutor, v5 rewrite, Tab Cloak,
webret&#173;ro dev, Dis&#173;cord: OlyB#942&#173;0)
</li>
<li>
YOCTDONALD'S (Co-Owner, v6+, Main Contributor, "HU no-lifer", Obfuscated Bughunter Legend)
YOC&#173;TDONA&#173;LD'S (Co-O&#173;wner, v6&#173;+, M&#173;ain Contribu&#173;tor, "H&#173;U no-lifer", Obfusc&#173;ated Bug&#173;hunter Le&#173;gend)
</li>
</ul>
<h3>Contributors and Notable Mentions:</h3>
<h3>Contributo&#173;rs and Not&#173;able Menti&#173;ons:</h3>
<ul class="binside">
<li>Kinglalu (Games Page, Developer)</li>
<li>MotorTruck1221 (Massive Contributor, Fastify Rewrite, Developer)</li>
<li>percs (Ultraviolet, Wisp, Developer)</li>
<li>scaratek (Contributor, Refactor Support)</li>
<li>Kin&#173;glalu (Ga&#173;mes Page, Develop&#173;er)</li>
<li>Motor&#173;Truck1221 (Mass&#173;ive Contr&#173;ibutor, Fast&#173;ify Rewrite, De&#173;veloper)</li>
<li>pe&#173;rcs (Ultr&#173;av&#173;iolet, Wi&#173;sp, Deve&#173;loper)</li>
<li>scarat&#173;ek (Con&#173;tributor, Ref&#173;actor Sup&#173;port)</li>
<li>
MikeLime (Old Co-Owner of TitaniumNetwork &amp; Mass Proxy Site Maker,
Web Developer, and Software Developer)
MikeLim&#173;e (O&#173;ld Co-Ow&#173;ner of Ti&#173;taniu&#173;mNe&#173;twork &amp; Mass Prox&#173;y Site Ma&#173;er,
W&#173;eb D&#173;eveloper, and Sof&#173;tware De&#173;veloper)
</li>
<li>SexyDuceDuce (Proxy and Web Developer)</li>
<li>Divide (Chatbox, Proxy/Web Developer)</li>
<li>LQ16 (Creator of TN, Retired)</li>
<li>Shirt (Old Co-Owner of TN, Everything Developer And King Of Pokemon)</li>
<li>Soup (Cat Lady) hehe</li>
<li>aub (Owner of Titanium Network)</li>
<li>Binary Person (pretty pog)</li>
<li>Pillow (Hosting Contributor, Developer)</li>
<li>Navyyy</li>
<li>luphoria (Developer)</li>
<li>trentwiles (Developer)</li>
<li>Degen-dev (Developer)</li>
<li>B3ATDROP3R</li>
<li>Catolan</li>
<li>Nautica (Reinin)</li>
<li>LinuxTerm (Contributor)</li>
<li>H (Not Speed)</li>
<li>BananaVeyLover</li>
<li>IronApple (The Apple Addict)</li>
<li>Se&#173;xyDu&#173;ceDu&#173;ce (P&#173;roxy and We&#173;b Develo&#173;per)</li>
<li>Divi&#173;de (Chatbo&#173;x, Pr&#173;oxy/We&#173;b Devel&#173;oper)</li>
<li>LQ&#173;16 (Cre&#173;ator of T&#173;N, Ret&#173;ired)</li>
<li>S&#173;hirt (O&#173;ld Co&#173;-O&#173;wner of TN, Everyth&#173;ing D&#173;evel&#173;oper And K&#173;ing O&#173;f Pok&#173;em&#173;on)</li>
<li>So&#173;up (C&#173;at Lad&#173;y) he&#173;&#173;he</li>
<li>a&#173;ub (Ow&#173;ner of T&#173;itani&#173;um Net&#173;work)</li>
<li>Bin&#173;ary Pe&#173;rson (pretty pog)</li>
<li>Pillo&#173;w (Hos&#173;ting Con&#173;tributor, Develo&#173;per)</li>
<li>lup&#173;horia (Deve&#173;loper)</li>
<li>tr&#173;entwiles (Devel&#173;oper)</li>
<li>De&#173;gen-d&#173;ev (Deve&#173;loper)</li>
<li>B3&#173;ATDRO&#173;P3R</li>
<li>Ca&#173;tol&#173;an</li>
<li>Naut&#173;ica (Rei&#173;nin)</li>
<li>Linu&#173;xTerm (Contr&#173;ibutor)</li>
<li>H (N&#173;ot Sp&#173;eed)</li>
<li>Banan&#173;aVeyLov&#173;er</li>
<li>IronAp&#173;ple (The A&#173;pple Ad&#173;dict)</li>
</ul>
<p>
And everyone else inside Titanium Network, the various testers and
of course Mercury Workshop. Also a certain Michael :D
And ever&#173;yone el&#173;se in&#173;side Ti&#173;tanium Net&#173;work, the vari&#173;ous testers and
of course Mer&#173;cury Work&#173;shop. Also a certain Mic&#173;ael :D
</p>
<div class="text-center">
<div class="image-container-hero">
@ -112,6 +96,6 @@
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<script src="assets/js/csel.js"></script>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,43 +2,28 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-g text-center textm">
<div id="emu-nav" class="glist"></div>
<div class="gfooter">
<p>I promise I'll fix N64 and add DS soon ._.</p>
<p>I promi&#173;se I'll fix N6&#173;4 and add D&#173;S soon ._.</p>
</div>
</div>
</div>
@ -46,6 +31,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,47 +2,32 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-g text-center textm">
<div id="emulib-nav" class="glist"></div>
<div class="gfooter">
<p>
Have a game request? Contact us on <a id="tnlink">discord</a> or
make a <a id="hblink">pull request or issue</a>!
Have a game request? Contact us on <a id="tnlink">disc&#173;ord</a> or
make a <a id="hblink">p&#173;ull re&#173;quest or iss&#173;ue</a>!
</p>
<p>More games coming soon!</p>
<p>More g&#173;ames co&#173;ming soon!</p>
</div>
</div>
</div>
@ -50,6 +35,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,38 +2,23 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-g text-center textm">
<input
@ -47,8 +32,8 @@
<div id="flash-nav" class="flist"></div>
<div class="gfooter-only">
<p>
Have a game request? Contact us on <a id="tnlink">discord</a> or
make a <a id="hblink">pull request or issue</a>!
Ha&#173;ve a ga&#173;me re&#173;quest? Contact us on <a id="tnlink">dis&#173;cord</a> or
make a <a id="hblink">pull req&#173;uest or issue</a>!
</p>
</div>
</div>
@ -57,6 +42,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -6,28 +6,14 @@
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<title>Hol&#173;y Un&#173;blo&#173;cker LT&#173;S</title>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="/baremux/index.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script>
<script src="/network/network.bundle.js" defer></script>
<script src="/network/network.config.js" defer></script>
<script src="/assets/js/register-sw.js" defer></script>
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
@ -37,23 +23,24 @@
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-g text-center textm">
<div id="h5-nav" class="glist"></div>
<div class="gfooter">
<p>
Have a game request? Contact us on <a id="tnlink">discord</a> or
make a <a id="hblink">pull request or issue</a>!
Ha&#173;ve a g&#173;ame request? Con&#173;tact us on <a id="tnlink">di&#173;scord</a> or
ma&#173;ke a <a id="hblink">pull request or issue</a>!
</p>
<p>More games coming soon!</p>
<p>More ga&#173;mes coming soon!</p>
</div>
</div>
</div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="/scram/w.controller.js"></script>
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,62 +2,47 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="ad" id="ad-left"></div>
<div class="ad" id="ad-right"></div>
<div class="box box-medium text-center textm">
<h1 class="bigtitle">Games Directory</h1>
<h1 class="bigtitle">Game&#173;s Direc&#173;tory</h1>
<p class="responsive-fix">
Choose where you would like to go. Below is some information.
Ch&#173;oose where you would like to go. Below is some information.
</p>
<div class="font3">
<h3>Information:</h3>
<p class="accented">
Here you can find cool stuff like emulators and games!<br />
<br />Emulators Featured: GB(A/C), N64(Broken), NES, SNES, Genesis
<br />EmuLibrary: Collection of games you can play with the various
emulators here. (WIP) <br />Games Featured: Lots. Flash support is
spotty.
Here you can find cool stuff like emul&#173;ators and g&#173;ames!<br />
<br />Emul&#173;ators Feat&#173;ured: GB(A/C), N6&#173;4(Broken), N&#173;ES, SN&#173;ES, Gen&#173;esis
<br />EmuLi&#173;brary: Collec&#173;tion of ga&#173;mes you can play with the va&#173;rious
emula&#173;tors here. (WIP) <br />Gam&#173;es Feat&#173;ured: Lots. Fl&#173;ash supp&#173;ort is
sp&#173;otty.
</p>
<p>Most of the games here should hopefully be updated.</p>
<p>Mos&#173;t of the g&#173;ames h&#173;ere shou&#173;ld hop&#173;efully be updat&#173;ed.</p>
</div>
<div class="responsive-fix">
<a class="fancybutton glowbutton" href="/emulators">Emulators</a>
<a class="fancybutton glowbutton" href="/retro-games">EmuLibrary</a>
<a class="fancybutton glowbutton" href="/web-games">Web Games</a>
<a class="fancybutton glowbutton" href="/flash-games">Flash Games</a>
<a class="fancybutton glowbutton" href="/c">Em&#173;ulators</a>
<a class="fancybutton glowbutton" href="/d">E&#173;muL&#173;ibrary</a>
<a class="fancybutton glowbutton" href="/e">W&#173;eb Ga&#173;mes</a>
<a class="fancybutton glowbutton" href="/f">Fla&#173;sh Gam&#173;es</a>
</div>
</div>
</div>
@ -65,6 +50,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,50 +2,35 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="box-clear text-center textm">
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<h1 class="bigtitle">Icon Information</h1>
<h3>How to find the Icon URL of a Site</h3>
<h1 class="bigtitle">Icon In&#173;formation</h1>
<h3>How to find the Ic&#173;on URL of a Site</h3>
<p>
Go to the website you want an icon from, then use this bookmarklet
(drag it to your bookmarks bar):
Go to the website you want an icon from, then use this boo&#173;kmarklet
(drag it to your bookma&#173;rks bar):
</p>
<div id="bks-parent">
<a id="iconfinder" class="fancybutton fb-l glowbutton"
>Find Icon URL</a
>Find Ic&#173;on URL</a
>
</div>
<script>
@ -53,7 +38,7 @@
`javascript:alert((Array.from(document.head.querySelectorAll("link[rel*='icon']")).slice(-1)[0]||0).href||location.origin+"/favicon.ico")`;
</script>
<p>
Copy the URL that the bookmarklet gives you. Then go back to HU and
Copy the URL that the bookm&#173;arklet gives you. Then go back to H&#173;U and
enter in the URL for the Icon URL in Settings. Enjoy!
</p>
</div>
@ -62,6 +47,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -2,42 +2,27 @@
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="version" content="<!-- VERSION -->" />
<title>Hol&#173;y Un&#173;b&#173;l&#173;ock&#173;e&#173;r</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth"><!--TOS--></div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -11,23 +11,13 @@
name="description"
content="Ho&#173;ly Unbl&#173;o&#173;c&#173;ker is a se&#173;c&#173;ure we&#173;b pr&#173;ox&#173;y se&#173;rvi&#173;ce with sup&#173;po&#173;rt for many sit&#173;es. By&#173;pa&#173;ss fi&#173;l&#173;ter&#173;s and fr&#173;ee&#173;ly enj&#173;oy a saf&#173;er pr&#173;iva&#173;te b&#173;rowsi&#173;ng expe&#173;ri&#173;ence or u&#173;nblo&#173;ck webs&#173;ites on de&#173;vices such as Chr&#173;omebo&#173;oks and at plac&#173;es li&#173;ke sch&#173;o&#173;ol or wor&#173;k with&#173;out do&#173;wnload&#173;ing anythi&#173;ng."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="/baremux/index.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script>
<script src="/network/network.bundle.js" defer></script>
<script src="/network/network.config.js" defer></script>
<script src="/assets/js/register-sw.js" defer></script>
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
@ -37,58 +27,22 @@
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="ad" id="ad-left"></div>
<div class="ad" id="ad-right"></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div class="box box-medium text-center textm">
<h1 class="bigtitle">Di&#173;sc&#173;ord Pr&#173;oxy</h1>
<div class="font3">
<p>
If you wish for a pro&#173;xy with better support for Disc&#173;ord,
be sure to join the <a id="tnlink">T&#173;N Disco&#173;rd</a> and
check out our <a id="ptlink">Patreo&#173;n!</a> <br />Each of the
various <a id="ptlink">P&#173;atre&#173;on</a> tiers helps out
significan&#173;tly wi&#173;th ser&#173;ver expens&#173;es and
do&#173;main rest&#173;ocks. <br />Although you can continue
supporting H&#173;oly Unb&#173;lo&#173;ck&#173;er for free with
Ar&#173;c/Ads (by simply using HU&#173; more), do&#173;nati&#173;ng
helps a lot more when upgradi&#173;ng or maintain&#173;ing its
serv&#173;ces.
</p>
<h4>Rough summary of possible benef&#173;its ($2-10):</h4>
<ul class="accented binside">
<li>
Su&#173;bscr&#173;iber Lib&#173;rary Ac&#173;cess (Subscriber
D&#173;isc&#173;ord Pro&#173;x&#173;y)
</li>
<li>Be&#173;ta Mem&#173;bersh&#173;ip for H&#173;U</li>
<li>Feat&#173;ure Requests</li>
<li>Monthly shout-outs in announcements</li>
<li>
Personal&#173;ized Domai&#173;ns (Can requ&#173;est for your own
doma&#173;in with H&#173;U)
</li>
<li>
Excl&#173;usive rol&#173;e (Su&#173;pport&#173;er and
Sub&#173;scri&#173;ber)
</li>
</ul>
<h4>
The prem&#173;ium Di&#173;sco&#173;rd p&#173;r&#173;ox&#173;y is
outside of these issues:
</h4>
<ul class="accented binside">
<li>
Being prompted to ve&#173;rify by ema&#173;il or via pho&#173;ne
numb&#173;er
</li>
<li>S&#173;low mess&#173;aging or in&#173;valid invit&#173;es</li>
<li>Si&#173;tes getting bl&#173;ock&#173;ed often</li>
<li>And more!</li>
</ul>
</div>
<p class="responsive-fix">
Choose which pr&#173;oxy you would like to use. Below is some informat&#173;ion.
</p>
<h3>Having Issues?</h3>
<p class="font3 accented">
Read the <a href="/questions">FAQ pa&#173;ge</a> for more info&#173;rmation.
<br />Sometim&#173;es the p&#173;rox&#173;ies are under high load so things may be sl&#173;ow,
sorry. In th&#173;at case sim&#173;ply wait for the pa&#173;ge to load.
</p>
<div>
<div id="pr-rh-dc">
<a href="#" class="fancybutton glowbutton pr-go1"
@ -115,6 +69,6 @@
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -6,22 +6,8 @@
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker</title>
<meta
name="description"
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<title>Ho&#173;ly Unbl&#173;ocker</title>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
@ -30,48 +16,49 @@
"></script>
<script src="/baremux/index.js" defer></script>
<script src="/epoxy/index.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script>
<script src="/network/network.bundle.js" defer></script>
<script src="/network/network.config.js" defer></script>
<script src="/assets/js/register-sw.js" defer></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="ad" id="ad-left"></div>
<div class="ad" id="ad-right"></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div class="box box-medium text-center textm">
<h1 class="bigtitle">Youtube Proxy</h1>
<h1 class="bigtitle">Yout&#173;ube Pro&#173;xy</h1>
<p class="responsive-fix">
Choose which proxy you would like to use. Below is some information.
<br />YouTube now has enhanced support with onsite navigation w/
Corrosion! Simply use the buttons below to access YouTube via
Corrosion.
Choose which pr&#173;oxy you would like to use. Below is some in&#173;formation.
<br />Y&#173;ouTube now has e&#173;nhanced support with onsite navigation w/
Ultr&#173;avi&#173;olet! Simply use the butt&#173;ons below to access Yo&#173;uTu&#173;be via
Ult&#173;ravi&#173;olet.
</p>
<h3>Having Issues?</h3>
<p class="font3 accented">
Read the <a href="/questions">FAQ page</a> for more information.
<br />Sometimes the proxies are under high load so things may be slow,
sorry. In that case simply wait for the page to load.
<br />Sometimes the pro&#173;xi&#173;es are under high load so things m&#173;ay be slow,
sorry. In th&#173;at case simply wait f&#173;or the page to load.
</p>
<div id="pr-yt" class="responsive-fix">
<a
href="#"
style="display: none"
class="fancybutton glowbutton pr-go1"
>Classic</a
>Clas&#173;sic</a
>
<a href="#" class="fancybutton glowbutton pr-go2">Stealth</a>
<a href="#" class="fancybutton glowbutton pr-go2">Ste&#173;alth</a>
</div>
</div>
</div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="/scram/w.controller.js"></script>
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -6,22 +6,8 @@
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Holy Unblocker LTS</title>
<meta
name="description"
content="Shark your way through the landmines of network filtrs and the eyes of your ISP with Rammerhead!"
/>
<meta
name="theme-color"
media="(prefers-color-scheme: dark)"
content="#434c5e"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="assets/img/icon.png"
/>
<title>Ho&#173;ly Unbl&#173;ocke&#173;r LT&#173;S</title>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
@ -33,49 +19,49 @@
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="background-animated" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="ad" id="ad-left"></div>
<div class="ad" id="ad-right"></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div class="box box-medium text-center textm">
<h1 class="bigtitle">Rammerhead</h1>
<p>Rammerhead is one of the most advanced free secure web proxies.</p>
<h1 class="bigtitle">Ra&#173;mm&#173;erhe&#173;ad</h1>
<p>Ram&#173;mer&#173;hea&#173;d is one of the m&#173;ost adva&#173;nce&#173;d fr&#173;ee s&#173;ecure web p&#173;rox&#173;ies.</p>
<p>
Its session-based proxying concept enables much support for webites
like Discord, YouTube, and more!
Its sess&#173;ion-based pr&#173;ox&#173;ying con&#173;cept en&#173;ables much supp&#173;ort for webs&#173;ites
like D&#173;iscord, YouTu&#173;be, and m&#173;ore!
</p>
<div id="pr-rh" class="pr-form">
<input
type="text"
spellcheck="false"
autocomplete="off"
placeholder="Search or enter in a target site!"
placeholder="Sea&#173;rch or enter in a ta&#173;rget site!"
/>
<a href="#" class="pr-button glowbutton pr-go1">Cl&#173;assic</a>
</div>
<p>
Important: Make sure you treat this as a PRIVATE session. Do NOT share
Rammerhead links.
Important: Make sure you treat this as a PRI&#173;VA&#173;TE session. Do N&#173;OT share
Ram&#173;mer&#173;head links.
</p>
<h3>More Information:</h3>
<h3>More Info&#173;rmation:</h3>
<div class="font3">
<p class="accented">
Works with YouTube, Discord, Spotify (spotty support) and much much
Works with You&#173;Tube, Di&#173;sc&#173;ord, Spoti&#173;fy (spot&#173;ty support) and muc&#173;h much
more.
<br />Rameerhead with its session support and improved speeds make
it reliable as a web proxy choice.
<br />R&#173;amme&#173;rhe&#173;ad with its sess&#173;ion support and impro&#173;ved speeds make
it reliable as a w&#173;eb pro&#173;xy choice.
</p>
<p class="accented">
Common Errors with Solutions:
<br />- Try using Classic mode or doing 'Reload Frame'.
("client.example.com" cannot be reached.) <br />- You cannot login
normally into the majority of sites. Phone verification on a select
number of sites may occur also with no real soluion.
<br />- Try using Cl&#173;assic mode or doing 'Reload Frame'.
("client.exa&#173;mple.com" cannot be reached.) <br />- You cannot login
norm&#173;ally into the major&#173;ity of sites. Ph&#173;one verifi&#173;cation on a select
number of sit&#173;es may occur also with no rea&#173;l soluion.
</p>
<p>
Discord:&nbsp;<a class="bluelink" id="rhlink"
><strong>https://discord.gg/VNT4E7gN5Y</strong></a
Disc&#173;ord:&nbsp;<a class="bluelink" id="rhlink"
><strong>https://di&#173;sco&#173;rd.gg/VNT4E7&#173;gN5Y</strong></a
>
</p>
</div>
@ -85,6 +71,6 @@
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Ho&#173;ly Unbl&#173;ock&#173;er</title>
<link rel="icon" href="assets/ico/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="stylesheet" href="assets/css/styles.css" />
<script src="/baremux/index.js" defer></script>
<script src="/network/network.bundle.js" defer></script>
<script src="/network/network.config.js" defer></script>
<link rel="prefetch" href="/worker/w.worker.js" />
<link rel="prefetch" href="/worker/w.shared.js" />
<script src="/assets/js/register-sw.js" defer></script>
<script src="
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
"></script>
</head>
<body>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div id="header" class="fullwidth"><!--HEADER--></div>
<div id="particles-js" class="fullwidth"></div>
<div id="mainbody" class="fullwidth">
<div class="ad" id="ad-left"></div>
<div class="ad" id="ad-right"></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<div class="box box-medium text-center textm">
<h1 class="bigtitle">Scram&#173;jet (Be&#173;ta)</h1>
<p>
Scra&#173;mjet is an experi&#173;mental inte&#173;rcept&#173;ion based w&#173;eb pr&#173;oxy that ai&#173;ms to
b&#173;e the succ&#173;essor to Ultr&#173;aviole&#173;t.<br>
</p>
<div id="pr-sj" class="pr-form">
<input
type="text"
spellcheck="false"
autocomplete="off"
placeholder="Search or enter in a target site!"
/>
<a href="#" style="display: none" class="pr-button glowbutton pr-go1"
>Stea&#173;lth</a
>
<a href="#" class="pr-button glowbutton pr-go2">Stea&#173;lth</a>
</div>
<h3>
N<wbr />etwo<wbr />rk fi<wbr />x i<wbr />f erro<wbr />rs occ<wbr />urs
or bla<wbr />nk pa<wbr />ge:
</h3>
<button id="reload" class="homebutton glowbutton">
Ref<wbr />re<wbr />sh
</button>
<br /><br />
<h3>Mo&#173;re Informat&#173;ion:</h3>
<div class="font3">
<p class="accented">
Scr&#173;amjet w&#173;orks with almo&#173;st all s&#173;ites includ&#173;ing Goo&#173;gle, Yo&#173;utube, Sp&#173;otify, Disc&#173;ord,
Redd&#173;it, GeF&#173;orce NO&#173;W, and no&#173;w.g&#173;g!
<br><br />Scra&#173;mjet is highly recomme&#173;nded due
to sec&#173;urity, de&#173;velo&#173;per friend&#173;liness, and pe&#173;rform&#173;ance along en&#173;hanced
supp&#173;ort for almost eve&#173;ry s&#173;ite maki&#173;ng it on&#173;e of the most adv&#173;an&#173;ced w&#173;eb
pr&#173;oxi&#173;es. <br />
</p>
<p class="accented">
Common Errors with Solutions:
<br />- Havi&#173;ng issues with CA&#173;PTC&#173;HAs? It will take tri&#173;al and er&#173;ror
but try to go slow when it comes to solvi&#173;ng them. C&#173;APTCH&#173;A is a given
but will take a few at&#173;tempts.<br />- You may not be able to login
norma&#173;lly into a number of sites. Phon&#173;e ver&#173;ifica&#173;tion on a select
numb&#173;er of sites may oc&#173;cur also with n&#173;o real solu&#173;tion.
</p>
<p>
Git&#173;Hub:&nbsp;<a class="bluelink" id="sjlink"
><strong>htt&#173;ps://gith&#173;ub.com/Mer&#173;curyWorks&#173;hop/sc&#173;ram&#173;je&#173;t</strong></a
>
</p>
</div>
</div>
</div>
<div id="footer" class="fullwidth"><!--FOOTER--></div>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="/worker/w.controller.js"></script>
<script src="assets/js/common.js"></script>
<script src="assets/js/csel.js"></script>
<script src="{{src}}"></script>
<script defer="defer" src="assets/js/background/main.js"></script>
</body>
</html>

View file

@ -1,46 +1,166 @@
<!doctype html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Error</title>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>H&#8203;oly Unb&#8203;loc&#8203;ke&#8203;r | Error</title>
<link rel="icon" href="assets/ico/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://arc.io" />
<link rel="dns-prefetch" href="https://arc.io" />
<link
rel="stylesheet"
href="https://www.nerdfonts.com/assets/css/webfont.css"
/>
<link
href="https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"
rel="stylesheet"
/>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css"
rel="stylesheet"
/>
<style>
* {
background-color: white;
*,
body {
color: #eceff4;
background-color: #1d232a;
font-family: "Figtree", sans-serif;
font-optical-sizing: auto;
background-image: radial-gradient(circle, rgba(131, 131, 131, 0.02) 1px, transparent 1px), radial-gradient(circle, rgba(148, 148, 148, 0.02) 1px, transparent 1px);
background-position: 0 0, 5px 5px;
background-size: 10px 10px;
}
h1 {
color: #ff5861;
font-size: 64px;
font-weight: 900;
margin-top: 0.8%;
}
code {
color: #e5e9f0;
font-size: 24px;
font-weight: 500;
}
.uv-small {
color: #e5e9f0;
font-size: 20px;
font-weight: 500;
}
i {
color: #e5e9f0;
font-size: 20px;
font-weight: 900;
text-decoration: none;
font-style: normal;
}
.footer-spacing {
margin-top: 0.5%;
}
button {
display: inline-block;
text-decoration: none;
padding: 15px 50px;
border-radius: 8px;
margin: 10px;
margin-top: 20px;
transition: 0.3s ease-in-out;
-webkit-transition: 0.3s ease-in-out;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
button:hover {
background-color: #434c5e;
}
.container {
max-width: 650px;
}
.list-group-item {
background-color: #2e3440;
color: #eceff4;
}
.list-group {
border-radius: 18px;
}
textarea {
border-radius: 18px;
outline: none;
resize: none;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
padding: 25px;
box-sizing: border-box;
width: 450px;
}
.nf-fa-heart {
color: #ff5861;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<h1 id="errorTitle">Error processing your request</h1>
<hr />
<p>Failed to load <b id="fetchedURL"></b></p>
<p id="errorMessage">Internal Server Error</p>
<textarea id="errorTrace" cols="40" rows="10" readonly></textarea>
<p>Try:</p>
<ul>
<li>Checking your internet connection</li>
<li>Verifying you entered the correct address</li>
<li>Clearing the site data</li>
<li>Contacting <b id="uvHostname"></b>'s administrator</li>
<li>Verify the server isn't censored</li>
</ul>
<p>If you're the administrator of <b id="uvHostname"></b>, try:</p>
<ul>
<li>Restarting your server</li>
<li>Updating Ultraviolet</li>
<li>
Troubleshooting the error on the
<a
href="/github/ultraviolet"
target="_blank"
>GitHub repository</a
>
</li>
</ul>
<button id="reload">Reload</button>
<hr />
<p>
<i>Ultraviolet v<span id="uvVersion"></span></i>
</p>
<script src={{src}}></script>
<span style="display: none" data-cooking="cooks"
>Boost your confidence in the kitchen with our trusted tips, tricks and
expert advice to master the basics and build upon your existing cooking
skills and knowledge.</span
>
<div class="container-fluid text-center">
<h1>Netwo<wbr>rk Er<wbr>ror</h1>
<code>Fa<wbr>iled to l<wbr>oad: <b id="fetchedURL"></b></code>
<br>
<button id="reload">Ref<wbr>resh</button>
<br><br>
<h5>
<p>
<textarea id="errorTrace" cols="40" rows="10" readonly>test</textarea>
</p>
</h5>
<code class="uv-small">Ref<wbr>res<wbr>h the net<wbr>work serv<wbr>ice | Ul<wbr>tra<wbr>vio<wbr>let v<span id="uvVersion"></span>.</code>
<br><br>
<div class="container text-wrap">
<ul class="list-group text-start">
<li class="list-group-item">
- Verif<wbr>ying you ente<wbr>red the cor<wbr>rect add<wbr>ress
</li>
<li class="list-group-item">
- Clear<wbr>ing your bro<wbr>wser or site cache data via Ctr<wbr>l+Sh<wbr>ift+<wbr>R and b<wbr>rowser setti<wbr>ngs
</li>
<li class="list-group-item">
- In t<wbr>he case of web<wbr>site ma<wbr />inte<wbr>nan<wbr />ce or updates, please wait for the issue to
be resol<wbr>ved.
</li>
<li class="list-group-item">
- If the iss<wbr>ue per<wbr>sists be su<wbr>re to m<wbr>ention t<wbr>his in the Ti<wbr />ta<wbr />nium
Net<wbr />work D<wbr>is<wbr />cor<wbr />d.
</li>
<li class="list-group-item">
- View the F<wbr />AQ page for specific si<wbr>te compa<wbr>tibility issues.
</li>
</ul>
</div>
<br />
<p class="footer-spacing">
<i>Ho<wbr>ly Unbloc<wbr>ke<wbr>r LT<wbr>S © 20<wbr>2<wbr>0-202<wbr>4 | Ma<wbr>de Wit<wbr>h Lov<wbr>e </i><i class="nf nf-fa-heart"></i>
</p>
<script src="{{src}}"></script>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show more