├── .gitmodules ├── server ├── env.d.ts ├── full │ ├── serverFactory.ts │ └── server.ts ├── message.ts ├── standalone │ └── standalone.ts ├── config │ └── config.ts └── cli.ts ├── vendor └── scramjet │ ├── lib │ ├── index.d.ts │ └── index.cjs │ ├── LICENSE │ ├── dist │ ├── scramjet.sync.js │ ├── scramjet.sync.js.map │ ├── scramjet.controller.js │ ├── scramjet.controller.js.map │ └── scramjet.worker.js │ ├── README.md │ └── package.json ├── src ├── assets │ ├── apps │ │ ├── tt.jpg │ │ ├── y8.png │ │ ├── yt.png │ │ ├── gfnow.png │ │ ├── google.jpg │ │ ├── reddit.png │ │ ├── twitch.jpg │ │ ├── coolmath.png │ │ ├── discord.jpg │ │ ├── retroarch.png │ │ ├── spotify.png │ │ └── twitter.png │ └── games │ │ ├── 2048.png │ │ ├── gm2.jpeg │ │ ├── hexgl.jpg │ │ ├── moke.png │ │ ├── run3.png │ │ ├── slope.jpg │ │ ├── snake.png │ │ ├── ssf.jpeg │ │ ├── stack.png │ │ ├── vex3.png │ │ ├── vex4.png │ │ ├── vex5.jpeg │ │ ├── vex6.jpeg │ │ ├── vex7.png │ │ ├── 1v1-lol.png │ │ ├── bloons.webp │ │ ├── bloonstd.jpg │ │ ├── bloxors.png │ │ ├── dadish-2.png │ │ ├── dadish.png │ │ ├── eaglerx.webp │ │ ├── frogger.jpeg │ │ ├── gpacman.jpg │ │ ├── mario.webp │ │ ├── pacman.jpg │ │ ├── slope-2.png │ │ ├── tanuki.jpg │ │ ├── webretro.png │ │ ├── yohoho.jpeg │ │ ├── bloonstd2.png │ │ ├── cat-ninja.png │ │ ├── chromedino.png │ │ ├── cybertanks.png │ │ ├── ducklife.webp │ │ ├── ducklife2.jpg │ │ ├── ducklife3.jpg │ │ ├── emulatorjs.png │ │ ├── fruitninja.jpg │ │ ├── miniagario.png │ │ ├── paper.io2.webp │ │ ├── retrobowl.jpg │ │ ├── shellshock.png │ │ ├── slitherio.webp │ │ ├── stuntcars2.png │ │ ├── stuntcars3.jpg │ │ ├── superhot.webp │ │ ├── templerun2.jpg │ │ ├── watermelon.png │ │ ├── cookieclicker.jpg │ │ ├── crossy-road.png │ │ ├── doodle-jump.png │ │ ├── flashtetris.png │ │ ├── fruit-ninja.png │ │ ├── geometrydash.png │ │ ├── hardestgame.jpg │ │ ├── monkey-mart.png │ │ ├── riddleschool.webp │ │ ├── riddleschool3.jpg │ │ ├── riddleschool4.jpg │ │ ├── sticmanhook.jpg │ │ ├── supermario64.jpeg │ │ ├── tanktrouble.webp │ │ ├── tunnel-rush.jpg │ │ ├── riddleschool2.webp │ │ ├── riddleschool5.webp │ │ ├── subway-surfers.png │ │ ├── basketball-stars.png │ │ ├── binding-of-isaac.jpeg │ │ ├── portaltheflashversion.jpg │ │ └── the-worlds-hardest-game-2.jpg ├── env.d.ts ├── pages │ ├── index.astro │ ├── community.astro │ ├── load.astro │ ├── gs │ │ ├── index.astro │ │ └── [game].astro │ ├── support.astro │ ├── options │ │ ├── bt.astro │ │ ├── about.astro │ │ └── index.astro │ └── apps.astro ├── components │ ├── Header.astro │ ├── NavLinks.astro │ ├── settings │ │ └── Loader.astro │ ├── MobileNav.astro │ ├── Scripts.astro │ ├── FrameManager.astro │ └── Search.astro ├── global.d.ts ├── ts │ ├── settings.ts │ └── serviceWorker.ts ├── layouts │ └── Layout.astro └── data │ └── games.json ├── config.example.toml ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── ISSUE-TEMPLATE.md ├── PULL_REQUEST_TEMPLATE │ └── pull_request_template.md └── workflows │ ├── release.yml │ ├── docker-build.yml │ └── binaries.yml ├── .dockerignore ├── package.json ├── tailwind.config.mjs ├── tsconfig.json ├── .changeset └── config.json ├── .gitignore ├── Dockerfile ├── public ├── logo.svg ├── uv │ └── uv.config.js ├── search.js └── sw.js ├── docker-builds.yml ├── docker-compose.yml ├── CHANGELOG.md ├── astro.config.ts ├── deno.jsonc └── README.md /.gitmodules: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /vendor/scramjet/lib/index.d.ts: -------------------------------------------------------------------------------- 1 | declare const scramjetPath: string; 2 | 3 | export { scramjetPath }; 4 | -------------------------------------------------------------------------------- /src/assets/apps/tt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/tt.jpg -------------------------------------------------------------------------------- /src/assets/apps/y8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/y8.png -------------------------------------------------------------------------------- /src/assets/apps/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/yt.png -------------------------------------------------------------------------------- /src/assets/apps/gfnow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/gfnow.png -------------------------------------------------------------------------------- /src/assets/apps/google.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/google.jpg -------------------------------------------------------------------------------- /src/assets/apps/reddit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/reddit.png -------------------------------------------------------------------------------- /src/assets/apps/twitch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/twitch.jpg -------------------------------------------------------------------------------- /src/assets/games/2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/2048.png -------------------------------------------------------------------------------- /src/assets/games/gm2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/gm2.jpeg -------------------------------------------------------------------------------- /src/assets/games/hexgl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/hexgl.jpg -------------------------------------------------------------------------------- /src/assets/games/moke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/moke.png -------------------------------------------------------------------------------- /src/assets/games/run3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/run3.png -------------------------------------------------------------------------------- /src/assets/games/slope.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/slope.jpg -------------------------------------------------------------------------------- /src/assets/games/snake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/snake.png -------------------------------------------------------------------------------- /src/assets/games/ssf.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/ssf.jpeg -------------------------------------------------------------------------------- /src/assets/games/stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/stack.png -------------------------------------------------------------------------------- /src/assets/games/vex3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/vex3.png -------------------------------------------------------------------------------- /src/assets/games/vex4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/vex4.png -------------------------------------------------------------------------------- /src/assets/games/vex5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/vex5.jpeg -------------------------------------------------------------------------------- /src/assets/games/vex6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/vex6.jpeg -------------------------------------------------------------------------------- /src/assets/games/vex7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/vex7.png -------------------------------------------------------------------------------- /src/assets/apps/coolmath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/coolmath.png -------------------------------------------------------------------------------- /src/assets/apps/discord.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/discord.jpg -------------------------------------------------------------------------------- /src/assets/apps/retroarch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/retroarch.png -------------------------------------------------------------------------------- /src/assets/apps/spotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/spotify.png -------------------------------------------------------------------------------- /src/assets/apps/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/apps/twitter.png -------------------------------------------------------------------------------- /src/assets/games/1v1-lol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/1v1-lol.png -------------------------------------------------------------------------------- /src/assets/games/bloons.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/bloons.webp -------------------------------------------------------------------------------- /src/assets/games/bloonstd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/bloonstd.jpg -------------------------------------------------------------------------------- /src/assets/games/bloxors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/bloxors.png -------------------------------------------------------------------------------- /src/assets/games/dadish-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/dadish-2.png -------------------------------------------------------------------------------- /src/assets/games/dadish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/dadish.png -------------------------------------------------------------------------------- /src/assets/games/eaglerx.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/eaglerx.webp -------------------------------------------------------------------------------- /src/assets/games/frogger.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/frogger.jpeg -------------------------------------------------------------------------------- /src/assets/games/gpacman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/gpacman.jpg -------------------------------------------------------------------------------- /src/assets/games/mario.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/mario.webp -------------------------------------------------------------------------------- /src/assets/games/pacman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/pacman.jpg -------------------------------------------------------------------------------- /src/assets/games/slope-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/slope-2.png -------------------------------------------------------------------------------- /src/assets/games/tanuki.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/tanuki.jpg -------------------------------------------------------------------------------- /src/assets/games/webretro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/webretro.png -------------------------------------------------------------------------------- /src/assets/games/yohoho.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/yohoho.jpeg -------------------------------------------------------------------------------- /src/assets/games/bloonstd2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/bloonstd2.png -------------------------------------------------------------------------------- /src/assets/games/cat-ninja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/cat-ninja.png -------------------------------------------------------------------------------- /src/assets/games/chromedino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/chromedino.png -------------------------------------------------------------------------------- /src/assets/games/cybertanks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/cybertanks.png -------------------------------------------------------------------------------- /src/assets/games/ducklife.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/ducklife.webp -------------------------------------------------------------------------------- /src/assets/games/ducklife2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/ducklife2.jpg -------------------------------------------------------------------------------- /src/assets/games/ducklife3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/ducklife3.jpg -------------------------------------------------------------------------------- /src/assets/games/emulatorjs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/emulatorjs.png -------------------------------------------------------------------------------- /src/assets/games/fruitninja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/fruitninja.jpg -------------------------------------------------------------------------------- /src/assets/games/miniagario.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/miniagario.png -------------------------------------------------------------------------------- /src/assets/games/paper.io2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/paper.io2.webp -------------------------------------------------------------------------------- /src/assets/games/retrobowl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/retrobowl.jpg -------------------------------------------------------------------------------- /src/assets/games/shellshock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/shellshock.png -------------------------------------------------------------------------------- /src/assets/games/slitherio.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/slitherio.webp -------------------------------------------------------------------------------- /src/assets/games/stuntcars2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/stuntcars2.png -------------------------------------------------------------------------------- /src/assets/games/stuntcars3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/stuntcars3.jpg -------------------------------------------------------------------------------- /src/assets/games/superhot.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/superhot.webp -------------------------------------------------------------------------------- /src/assets/games/templerun2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/templerun2.jpg -------------------------------------------------------------------------------- /src/assets/games/watermelon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/watermelon.png -------------------------------------------------------------------------------- /src/assets/games/cookieclicker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/cookieclicker.jpg -------------------------------------------------------------------------------- /src/assets/games/crossy-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/crossy-road.png -------------------------------------------------------------------------------- /src/assets/games/doodle-jump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/doodle-jump.png -------------------------------------------------------------------------------- /src/assets/games/flashtetris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/flashtetris.png -------------------------------------------------------------------------------- /src/assets/games/fruit-ninja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/fruit-ninja.png -------------------------------------------------------------------------------- /src/assets/games/geometrydash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/geometrydash.png -------------------------------------------------------------------------------- /src/assets/games/hardestgame.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/hardestgame.jpg -------------------------------------------------------------------------------- /src/assets/games/monkey-mart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/monkey-mart.png -------------------------------------------------------------------------------- /src/assets/games/riddleschool.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/riddleschool.webp -------------------------------------------------------------------------------- /src/assets/games/riddleschool3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/riddleschool3.jpg -------------------------------------------------------------------------------- /src/assets/games/riddleschool4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/riddleschool4.jpg -------------------------------------------------------------------------------- /src/assets/games/sticmanhook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/sticmanhook.jpg -------------------------------------------------------------------------------- /src/assets/games/supermario64.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/supermario64.jpeg -------------------------------------------------------------------------------- /src/assets/games/tanktrouble.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/tanktrouble.webp -------------------------------------------------------------------------------- /src/assets/games/tunnel-rush.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/tunnel-rush.jpg -------------------------------------------------------------------------------- /src/assets/games/riddleschool2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/riddleschool2.webp -------------------------------------------------------------------------------- /src/assets/games/riddleschool5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/riddleschool5.webp -------------------------------------------------------------------------------- /src/assets/games/subway-surfers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/subway-surfers.png -------------------------------------------------------------------------------- /src/assets/games/basketball-stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/basketball-stars.png -------------------------------------------------------------------------------- /src/assets/games/binding-of-isaac.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/binding-of-isaac.jpeg -------------------------------------------------------------------------------- /src/assets/games/portaltheflashversion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/portaltheflashversion.jpg -------------------------------------------------------------------------------- /src/assets/games/the-worlds-hardest-game-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titaniumnetwork-dev/Incognito/HEAD/src/assets/games/the-worlds-hardest-game-2.jpg -------------------------------------------------------------------------------- /config.example.toml: -------------------------------------------------------------------------------- 1 | [buildOpts] 2 | games = true 3 | 4 | [server] 5 | wisp = true 6 | port = 8000 7 | 8 | [seo] 9 | enabled = false 10 | both = false 11 | domain = "http://localhost:8000" 12 | -------------------------------------------------------------------------------- /vendor/scramjet/lib/index.cjs: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { resolve } = require("node:path"); 4 | 5 | const scramjetPath = resolve(__dirname, "..", "dist"); 6 | 7 | exports.scramjetPath = scramjetPath; 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Communtiy Support 4 | url: https://discord.gg/unblock 5 | about: Please ask and answer questions here. 6 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .vscode 3 | npm-debug.log 4 | yarn-error.log 5 | .github/ 6 | .env.example 7 | .env 8 | dist/ 9 | .git/ 10 | .astro/ 11 | ~/ 12 | .gitignore 13 | biome.json 14 | docker-compose.yml 15 | Dockerfile 16 | README.md 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "incognito", 3 | "version": "1.1.8", 4 | "private": true, 5 | "type": "module", 6 | "dependencies": { 7 | "@iconify-json/fa-solid": "^1.1.8", 8 | "@iconify-json/fa6-solid": "^1.1.21", 9 | "@iconify-json/mdi": "^1.2.1" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | variants: { 9 | extend: { 10 | display: ['group-hover'], 11 | }, 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "exclude": ["server/**/*", "dist/**/*", "node_modules/**/*", "public/**/*", "vendor/**"], 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "@components/*": ["src/components/*"], 8 | "@layouts/*": ["src/layouts/*"], 9 | "@scripts/*": ["src/ts/*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", 3 | "changelog": ["@changesets/changelog-github", { "repo": "titaniumnetwork-dev/incognito" }], 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [], 11 | "privatePackages": { "version": true, "tag": true } 12 | } 13 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | declare var search: (input: string, template: string) => any; 6 | type Suggestion = { 7 | phrase: string; 8 | }; 9 | declare var BareMux: any; 10 | declare var EpxMod: any; 11 | declare var ScramjetController: any; 12 | declare var $scramjet: any; 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | !vendor/scramjet/dist/ 4 | 5 | # generated types 6 | .astro/ 7 | 8 | # dependencies 9 | node_modules/ 10 | 11 | # logs 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | pnpm-debug.log* 16 | 17 | # environment variables 18 | .env 19 | .env.production 20 | 21 | #Config stuff 22 | config.toml 23 | 24 | # macOS-specific files 25 | .DS_Store 26 | 27 | # jetbrains setting folder 28 | .idea/ 29 | 30 | # Stupidness 31 | ~/ 32 | 33 | -------------------------------------------------------------------------------- /vendor/scramjet/LICENSE: -------------------------------------------------------------------------------- 1 | Scramjet is licensed under AGPL-3. You can view the full terms of the license here: https://www.gnu.org/licenses/agpl-3.0.txt 2 | 3 | - Your project using scramjet MUST be open source, and must be compatible with GPL 4 | - Your project must include clear and prominent credit to the scramjet project, with a link to https://discord.gg/88CapFYSEd 5 | 6 | If these terms cannot work for your project, email contact@mercurywork.shop for information on a obtaining a dual license. 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM denoland/deno:debian-2.1.4 2 | 3 | WORKDIR /app 4 | 5 | COPY package*.json . 6 | COPY deno.jsonc . 7 | COPY . . 8 | 9 | RUN apt update 10 | RUN apt install -y python3 python3-pip libssl-dev build-essential python3-dev nodejs 11 | RUN cp -n config.example.toml config.toml 12 | RUN deno install --allow-scripts 13 | RUN deno task build 14 | RUN export TERM=xterm-256color 15 | ENV PORT="8000" 16 | VOLUME /app 17 | EXPOSE 8000 18 | ENTRYPOINT ["deno", "task", "start", "--color", "--server"] 19 | CMD ["full"] 20 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Links from '@components/NavLinks.astro'; 3 | import Search from '@components/Search.astro'; 4 | import Layout from '@layouts/Layout.astro'; 5 | --- 6 | 7 | 8 |
9 | 10 | 11 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | -------------------------------------------------------------------------------- /src/components/Header.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | const { pageName, pageLocation } = Astro.props; 4 | --- 5 | 6 |
7 |
8 | 9 | 10 | 11 |

12 | {pageName} 13 |

14 |
15 |
16 | -------------------------------------------------------------------------------- /docker-builds.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | # This file is for building the docker images and pushing them to the registry. You can safely ignore this 4 | 5 | services: 6 | incognito: 7 | image: motortruck1221/incognito:latest 8 | build: 9 | context: . 10 | dockerfile: Dockerfile 11 | container_name: incognito 12 | restart: unless-stopped 13 | incognito-versioned: 14 | image: motortruck1221/incognito:1.1.7 15 | build: 16 | context: . 17 | dockerfile: Dockerfile 18 | container_name: incognito 19 | restart: unless-stopped 20 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/pull_request_template.md: -------------------------------------------------------------------------------- 1 | - **Please check if the PR fulfills these requirements** 2 | 3 | * [ ] Tests for the changes have been added (for bug fixes / features) 4 | * [ ] Docs have been added / updated (for bug fixes / features) 5 | 6 | - **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...) 7 | 8 | - **What is the current behavior?** (You can also link to an open issue here) 9 | 10 | - **What is the new behavior (if this is a feature change)?** 11 | 12 | - **Does this PR introduce a breaking change?** (What changes might users need to make in their application due to this PR?) 13 | 14 | - **Other information**: 15 | -------------------------------------------------------------------------------- /vendor/scramjet/dist/scramjet.sync.js: -------------------------------------------------------------------------------- 1 | addEventListener("message",({data:{sab:e,args:[t,n,s,r,o],body:a,headers:g}})=>{let i=new DataView(e),l=new Uint8Array(e),d=new XMLHttpRequest;if(d.responseType="arraybuffer",d.open(t,n,!0,r,o),g)for(let[e,t]of Object.entries(g))d.setRequestHeader(e,t);d.send(a),d.onload=()=>{let t=1;i.setUint16(t,d.status),t+=2;let n=d.getAllResponseHeaders();i.setUint32(t,n.length),t+=4,e.byteLength{console.error("xhr failed"),i.setUint8(0,1)}}); 2 | //# sourceMappingURL=scramjet.sync.js.map -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { 3 | openApp(url: string): void; 4 | searchApps(val: string): void; 5 | setTheme(val: string): void; 6 | setProxy(val: string): void; 7 | transport(val: string): void; 8 | changeTitle(val: string): void; 9 | changeFavicon(val: string): void; 10 | searchGames(val: string): void; 11 | fullScreenGame(val: string): void; 12 | loadProxyScripts(): Promise; 13 | setTransport(transport: string): Promise; 14 | loadMobileNav(): void; 15 | closeMobileNav(): void; 16 | createLink(): void; 17 | exitIframe(): void; 18 | refreshIframe(): void; 19 | setTitle(): void; 20 | __uv: any; 21 | __get$ProxyUrl: any; 22 | $scramjet: any; 23 | } 24 | } 25 | 26 | export {}; 27 | -------------------------------------------------------------------------------- /src/pages/community.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Header from '@components/Header.astro'; 3 | import Layout from '@layouts/Layout.astro'; 4 | --- 5 | 6 |
7 |
8 |
9 |

You are being taken to another website (discord.gg/unblock)

10 |

11 | Are you sure you want to proceed? 17 |

18 |
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | incognito: 5 | image: motortruck1221/incognito:latest 6 | container_name: incognito 7 | restart: unless-stopped 8 | ports: 9 | # The ports work like this: Host:Container (DO NOT MODIFY THE CONTAINER PORT) 10 | - '8081:8000' 11 | volumes: 12 | - ./config.toml:/app/config.toml # This can be removed if you need the image to be stateless 13 | #environment: 14 | #- DOMAIN=https://incog.works # If you don't have a config.toml file and you want to still use the SEO build, set this variable 15 | command: 16 | - "full" # Full is the server type. Change to "standalone" if you want something simpler and lighter. 17 | #- "--seo" # Enable this line if you wish to use the SEO build. (NOTE: the domain env var MUST be set OR SEO must be enabled in your config.toml) 18 | -------------------------------------------------------------------------------- /public/uv/uv.config.js: -------------------------------------------------------------------------------- 1 | self.__uv$config = { 2 | prefix: '/~/uv/', 3 | encodeUrl: function encode(str) { 4 | if (!str) return str; 5 | return encodeURIComponent( 6 | str 7 | .toString() 8 | .split('') 9 | .map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 3) : char)) 10 | .join(''), 11 | ); 12 | }, 13 | decodeUrl: function decode(str) { 14 | if (!str) return str; 15 | let [input, ...search] = str.split('?'); 16 | 17 | return ( 18 | decodeURIComponent(input) 19 | .split('') 20 | .map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 3) : char)) 21 | .join('') + (search.length ? '?' + search.join('?') : '') 22 | ); 23 | }, 24 | handler: '/uv/uv.handler.js', 25 | client: '/uv/uv.client.js', 26 | bundle: '/uv/uv.bundle.js', 27 | config: '/uv/uv.config.js', 28 | sw: '/uv/uv.sw.js', 29 | }; 30 | -------------------------------------------------------------------------------- /server/full/serverFactory.ts: -------------------------------------------------------------------------------- 1 | import { createServer } from 'node:http'; 2 | import { Socket } from 'node:net'; 3 | import { 4 | type FastifyServerFactory, 5 | FastifyServerFactoryHandler, 6 | RawServerDefault, 7 | } from 'npm:fastify'; 8 | import wisp from 'npm:wisp-server-node'; 9 | import { config } from '../config/config.ts'; 10 | 11 | const sFactory = async (configPath: string): Promise => { 12 | const parsedDoc = await config(configPath); 13 | const serverFactory: FastifyServerFactory = (handler: FastifyServerFactoryHandler): RawServerDefault => { 14 | return createServer() 15 | .on('request', (req, res) => { 16 | handler(req, res); 17 | }) 18 | .on('upgrade', (req, socket, head) => { 19 | if (req.url?.endsWith('/wisp/') && parsedDoc.server.wisp === true) { 20 | wisp.routeRequest(req, socket as Socket, head); 21 | } 22 | }); 23 | }; 24 | return serverFactory; 25 | } 26 | 27 | export { sFactory }; 28 | -------------------------------------------------------------------------------- /public/search.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** 3 | * @param {string} input 4 | * @param {string} template Template for a search query. 5 | * @returns {string} Fully qualified URL 6 | */ 7 | function search(input, template) { 8 | try { 9 | // input is a valid URL: 10 | // eg: https://example.com, https://example.com/test?q=param 11 | return new URL(input).toString(); 12 | } catch (err) { 13 | // input was not a valid URL 14 | } 15 | 16 | try { 17 | // input is a valid URL when http:// is added to the start: 18 | // eg: example.com, https://example.com/test?q=param 19 | const url = new URL(`http://${input}`); 20 | // only if the hostname has a TLD/subdomain 21 | if (url.hostname.includes('.')) return url.toString(); 22 | } catch (err) { 23 | // input was not valid URL 24 | } 25 | 26 | // input may have been a valid URL, however the hostname was invalid 27 | 28 | // Attempts to convert the input to a fully qualified URL have failed 29 | // Treat the input as a search query 30 | return template.replace('%s', encodeURIComponent(input)); 31 | } 32 | -------------------------------------------------------------------------------- /src/components/NavLinks.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { GAMES_LINK } from 'astro:env/client'; 3 | import NavMenu from '@components/MobileNav.astro'; 4 | import { Icon } from 'astro-icon/components'; 5 | --- 6 |
7 | 23 | 30 | 31 |
32 | -------------------------------------------------------------------------------- /src/ts/settings.ts: -------------------------------------------------------------------------------- 1 | function setTheme(name: string | null) { 2 | if (name === 'ocean') { 3 | localStorage.setItem('incog||currentTheme', 'ocean'); 4 | document.documentElement.className = ''; 5 | } else { 6 | localStorage.setItem('incog||currentTheme', name as string); 7 | document.documentElement.className = name as string; 8 | } 9 | } 10 | function setProxy(name: string) { 11 | localStorage.setItem('incog||proxy', name); 12 | } 13 | function setTransport(name: string) { 14 | localStorage.setItem('incog||transport', name); 15 | } 16 | function changeTitle(title: string | null) { 17 | localStorage.setItem('incog||title', title as string); 18 | if (title === null || title === 'null') { 19 | return; 20 | } else { 21 | document.title = title; 22 | } 23 | } 24 | function changeFavicon(url: string | null) { 25 | localStorage.setItem('incog||favicon', url as string); 26 | if (url === null || url === 'null') { 27 | return; 28 | } else { 29 | let favicon = document.getElementById('favicon') as HTMLLinkElement; 30 | favicon.href = url; 31 | } 32 | } 33 | 34 | export { changeFavicon, changeTitle, setProxy, setTheme, setTransport }; 35 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | defaults: 10 | run: 11 | shell: bash 12 | 13 | env: 14 | FORCE_COLOR: true 15 | 16 | jobs: 17 | changelog: 18 | name: Release TAG 19 | if: ${{ github.repository_owner == 'titaniumnetwork-dev' }} 20 | runs-on: ubuntu-latest 21 | permissions: 22 | contents: write 23 | id-token: write 24 | steps: 25 | - uses: actions/checkout@v4 26 | 27 | - name: Setup Deno 28 | uses: denoland/setup-deno@v2 29 | with: 30 | deno-version: 2.1.4 31 | 32 | - name: Install dependencies 33 | run: deno install --allow-scripts 34 | 35 | - name: Create Release Pull Request or Publish 36 | id: changesets 37 | uses: changesets/action@v1 38 | with: 39 | version: deno task changeset:version 40 | publish: deno task changeset:publish 41 | commit: "[ci] release" 42 | title: "[ci] release" 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | 46 | - name: Push tags if created. 47 | run: git push --follow-tags 48 | env: 49 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 50 | -------------------------------------------------------------------------------- /public/sw.js: -------------------------------------------------------------------------------- 1 | importScripts( 2 | '/uv/uv.bundle.js', 3 | '/uv/uv.config.js', 4 | '/scram/scramjet.wasm.js', 5 | '/scram/scramjet.shared.js', 6 | '/scram/scramjet.worker.js' 7 | ); 8 | importScripts(__uv$config.sw || '/uv/uv.sw.js'); 9 | const uv = new UVServiceWorker(); 10 | const sj = new ScramjetServiceWorker(); 11 | (async function () { 12 | await sj.loadConfig(); 13 | })(); 14 | self.addEventListener('fetch', function (event) { 15 | if (event.request.url.startsWith(location.origin + __uv$config.prefix)) { 16 | event.respondWith( 17 | (async function () { 18 | return await uv.fetch(event); 19 | })(), 20 | ); 21 | } 22 | else if (sj.route(event)) { 23 | event.respondWith( 24 | (async function() { 25 | return await sj.fetch(event); 26 | })() 27 | ); 28 | } 29 | else { 30 | event.respondWith( 31 | (async function () { 32 | return await fetch(event.request); 33 | })() 34 | ); 35 | } 36 | }); 37 | 38 | assets = [ 39 | '/', 40 | '/favicon.ico', 41 | '/manifest.json', 42 | '/transports/bareTransport.js', 43 | 'sw.js', 44 | 'uv.config.js', 45 | 'logo.svg', 46 | ]; 47 | -------------------------------------------------------------------------------- /src/pages/load.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '@layouts/Layout.astro'; 3 | --- 4 | 5 |
6 |
7 |

8 | Please wait a moment. Our service maybe under high load causing some slowness on our 9 | servers. Your request will eventually be responded to. 10 |

11 |
12 | 38 |
39 | -------------------------------------------------------------------------------- /src/components/settings/Loader.astro: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /server/message.ts: -------------------------------------------------------------------------------- 1 | import gradient from 'npm:gradient-string'; 2 | import chalk from 'chalk'; 3 | const message = ` 4 | ___ _ _ 5 | |_ _|_ __ ___ ___ _ __ (_) |_ ___ 6 | | || '_ \\ / __/ _ \\| '_ \\| | __/ _ \\ 7 | | || | | | (_| (_) | | | | | || (_) | 8 | |___|_| |_|\\___\\___/|_| |_|_|\\__\\___/ 9 | `; 10 | const messageColors = { 11 | green: '#34b874', 12 | white: '#ffffff', 13 | blue: '#161923', 14 | }; 15 | 16 | const listeningMessage = (port: number, server: 'fastify' | 'hono') => { 17 | console.log( 18 | `${chalk.hex('#34b874')('Server listening on')} ${ 19 | chalk.white.bold('http://localhost:' + port) 20 | }`, 21 | ); 22 | console.log( 23 | chalk.white.bold( 24 | `Server also listening on ${chalk.hex('#34b874').bold('http://0.0.0.0:' + port)}`, 25 | ), 26 | ); 27 | console.log( 28 | chalk.hex('#34b874').bold( 29 | `The server in use ${ 30 | server === 'fastify' 31 | ? chalk.bold.whiteBright('Fastify (Not Deno native, includes wisp server)') 32 | : chalk.bold.whiteBright('Hono (no wisp server, deno-native)') 33 | }`, 34 | ), 35 | ); 36 | }; 37 | 38 | export { listeningMessage, message, messageColors }; 39 | -------------------------------------------------------------------------------- /src/ts/serviceWorker.ts: -------------------------------------------------------------------------------- 1 | function initServiceWorker() { 2 | return new Promise((resolve) => { 3 | if ('serviceWorker' in navigator) { 4 | console.log('OOGOGOGOGO'); 5 | //@ts-ignore these are a fucking thing 6 | //wait for the scripts to load 7 | const scram = window.loadProxyScripts().then(async (): typeof ScramjetController => { 8 | const scramjet = new ScramjetController({ 9 | prefix: "/~/scramjet/", 10 | files: { 11 | wasm: "/scram/scramjet.wasm.js", 12 | worker: "/scram/scramjet.worker.js", 13 | client: "/scram/scramjet.client.js", 14 | shared: "/scram/scramjet.shared.js", 15 | sync: "/scram/scramjet.sync.js" 16 | } 17 | }); 18 | //@ts-ignore these fucking exist 19 | //make sure the transport is set before continuing 20 | await window.setTransport(localStorage.getItem('incog||transport')); 21 | await scramjet.init('/sw.js'); 22 | return scramjet; 23 | }); 24 | return resolve(scram); 25 | }; 26 | }); 27 | } 28 | 29 | export { initServiceWorker }; 30 | -------------------------------------------------------------------------------- /server/standalone/standalone.ts: -------------------------------------------------------------------------------- 1 | import { Hono } from 'jsr:@hono/hono'; 2 | import { serveStatic } from 'jsr:@hono/hono/deno'; 3 | import { compress } from 'jsr:@hono/hono/compress'; 4 | import { listeningMessage } from '../message.ts'; 5 | import { config } from '../config/config.ts'; 6 | import { fromFileUrl } from 'jsr:@std/path'; 7 | 8 | const startServer = async (configPath: string, seo?: boolean) => { 9 | const parsedDoc = await config(configPath); 10 | const app = new Hono(); 11 | const distPath = fromFileUrl(new URL('../../dist', import.meta.url)); 12 | 13 | app.use(compress({ 14 | encoding: 'gzip', 15 | })); 16 | 17 | app.use('/*', (ctx, next) => { 18 | if (new URL(ctx.req.url).host === new URL(Deno.env.get('DOMAIN') || parsedDoc.seo.domain).host && seo || parsedDoc.seo.enabled) { 19 | return serveStatic({ root: `${distPath}/seo` })(ctx, next); 20 | } 21 | else { 22 | return serveStatic({ root: `${distPath}/noseo` })(ctx, next); 23 | } 24 | }); 25 | 26 | Deno.serve({ 27 | hostname: '0.0.0.0', 28 | port: parseInt(Deno.env.get('PORT') as string) || parsedDoc.server.port || 8000, 29 | onListen() { 30 | listeningMessage(parseInt(Deno.env.get('PORT') as string) || parsedDoc.server.port || 8000, 'hono'); 31 | }, 32 | }, app.fetch); 33 | } 34 | 35 | export { startServer } 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/ISSUE-TEMPLATE.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report Or Feature request 3 | about: Report a Bug or submit a Feature that you would like to see 4 | title: "[BUG/Feature Request]" 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | **Note: for support questions, please use our [Discord](https://discord.gg/unblock)**. This repository's issues are reserved for feature requests and bug reports. 10 | 11 | - **I'm submitting a ...** 12 | - [ ] bug report 13 | - [ ] feature request 14 | - [ ] support request => Please do not submit support request here, see note at the top of this template. 15 | 16 | - **Do you want to request a _feature_ or report a _bug_?** 17 | 18 | - **What is the current behavior?** 19 | 20 | - **If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem** 21 | 22 | - **What is the expected behavior?** 23 | 24 | - **What is the motivation / use case for changing the behavior?** 25 | 26 | - **Please tell us about your environment:** 27 | 28 | - Version: 2.0.0-beta.X 29 | - Browser: [all | Chrome XX | Firefox XX | IE XX | Safari XX | Mobile Chrome XX | Android X.X Web Browser | iOS XX Safari | iOS XX UIWebView | iOS XX WKWebView ] 30 | - Language: [all | TypeScript X.X | ES6/7 | ES5 | Dart] 31 | 32 | - **Other information** (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, gitter, etc) 33 | -------------------------------------------------------------------------------- /.github/workflows/docker-build.yml: -------------------------------------------------------------------------------- 1 | name: Build Docker image 2 | on: 3 | push: 4 | tags: 5 | - v* 6 | workflow_dispatch: 7 | 8 | env: 9 | REGISTRY: ghcr.io 10 | IMAGE_NAME: ${{ github.repository }} 11 | 12 | jobs: 13 | build-and-push: 14 | name: Build and push Docker image to registry 15 | runs-on: ubuntu-latest 16 | if: ${{ github.repository_owner == 'titaniumnetwork-dev' }} 17 | permissions: 18 | contents: write 19 | packages: write 20 | steps: 21 | - name: Checkout repo 22 | uses: actions/checkout@v3 23 | - name: Setup docker buildx 24 | uses: docker/setup-buildx-action@v3 25 | - name: Login To registry ${{ env.REGISTRY }} 26 | uses: docker/login-action@v3 27 | with: 28 | registry: ${{ env.REGISTRY }} 29 | username: ${{ github.actor }} 30 | password: ${{ github.token }} 31 | - name: Extract Docker metadata 32 | id: meta 33 | uses: docker/metadata-action@v3 34 | with: 35 | images: ${{ env.REGISTRY }}/titaniumnetwork-dev/incognito 36 | - name: Build and push 37 | id: build-and-push 38 | uses: docker/build-push-action@v4 39 | with: 40 | context: . 41 | platforms: linux/amd64,linux/arm64 42 | file: ./Dockerfile 43 | name: incognito 44 | push: ${{ github.event_name != 'pull_request' }} 45 | tags: ${{ steps.meta.outputs.tags }} 46 | labels: ${{ steps.meta.outputs.labels }} 47 | cache-from: type=gha 48 | cache-to: type=gha,mode=max 49 | -------------------------------------------------------------------------------- /server/config/config.ts: -------------------------------------------------------------------------------- 1 | import { parse } from "smol-toml"; 2 | 3 | interface Data { 4 | buildOpts: { 5 | games: boolean; 6 | }; 7 | server: { 8 | wisp: boolean; 9 | port: number; 10 | }; 11 | seo: { 12 | enabled: boolean; 13 | domain: string; 14 | }; 15 | } 16 | 17 | const config = async (configFile: string): Promise => { 18 | const doc = await Deno.readTextFile(configFile); 19 | const parsedDoc = parse(doc) as unknown as Data; 20 | 21 | if (typeof parsedDoc.buildOpts !== "object") { 22 | throw new Error(`Invalid structure: "buildOpts" should be an object`); 23 | } 24 | if (typeof parsedDoc.server !== "object") { 25 | throw new Error(`Invalid structure: "server" should be an object`); 26 | } 27 | if (typeof parsedDoc.buildOpts.games !== "boolean") { 28 | throw new Error(`Invalid type for "buildOpts.games"! It should be a boolean (true/false)`); 29 | } 30 | if (typeof parsedDoc.server.wisp !== "boolean") { 31 | throw new Error(`Invalid type for "server.wisp"! It should be a boolean (true/false)`); 32 | } 33 | if (typeof parsedDoc.server.port !== "number") { 34 | throw new Error(`Invalid type for "server.port"! It should be a number`); 35 | } 36 | if (typeof parsedDoc.seo.enabled !== "boolean") { 37 | throw new Error(`Invalid type for "seo.enabled"! It should be an boolean (true/false)`); 38 | } 39 | if (typeof parsedDoc.seo.domain !== "string") { 40 | throw new Error(`Invalid type for "seo.domain"! It should be an string`); 41 | } else { 42 | try { 43 | new URL(parsedDoc.seo.domain); 44 | } catch (e: any) { 45 | throw new Error(e); 46 | } 47 | } 48 | return parsedDoc; 49 | } 50 | 51 | export { type Data as TOMLConfig, config }; 52 | -------------------------------------------------------------------------------- /vendor/scramjet/README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | --- 6 | 7 | > [!WARNING] 8 | > Scramjet is not currently production ready, DO NOT USE THIS AS THE MAIN OPTION IN YOUR SITE. 9 | 10 | npm version 11 | 12 | Scramjet is an experimental interception based web proxy that aims to be the successor to Ultraviolet. It is designed with security, developer friendliness, and performance in mind. Scramjet strives to have a clean, organized codebase to improve maintainability. Scramjet is made to evade internet censorship and bypass arbitrary web browser restrictions. 13 | 14 | ## Supported Sites 15 | 16 | Some of the popular websites that Scramjet supports include: 17 | 18 | - [Google](https://google.com) 19 | - [Youtube](https://www.youtube.com) 20 | - [Spotify](https://spotify.com) 21 | - [Discord](https://discord.com) 22 | - [Reddit](https://reddit.com) 23 | - [GeForce NOW](https://play.geforcenow.com/) 24 | - [now.gg](https://now.gg) 25 | 26 | ## Development 27 | 28 | ### Dependencies 29 | 30 | - Recent versions of `node.js` and `pnpm` 31 | - `rustup` 32 | - `wasm-bindgen` 33 | - `wasm-opt` 34 | - [this `wasm-snip` fork](https://github.com/r58Playz/wasm-snip) 35 | 36 | #### Building 37 | 38 | - Clone the repository with `git clone --recursive https://github.com/MercuryWorkshop/scramjet` 39 | - Install the dependencies with `pnpm i` 40 | - Build the rewriter with `pnpm rewriter:build` 41 | - Build Scramjet with `pnpm build` 42 | 43 | ### Running Scramjet Locally 44 | 45 | You can run the Scramjet dev server with the command 46 | 47 | ```sh 48 | pnpm dev 49 | ``` 50 | 51 | Scramjet should now be running at `localhost:1337` and should rebuild upon a file being changed (excluding the rewriter). 52 | -------------------------------------------------------------------------------- /server/full/server.ts: -------------------------------------------------------------------------------- 1 | import fastifyCompress from '@fastify/compress'; 2 | import fastifyCookie from '@fastify/cookie'; 3 | import fastifyHttpProxy from '@fastify/http-proxy'; 4 | import fastifyMiddie from '@fastify/middie'; 5 | import fastifyStatic from '@fastify/static'; 6 | import Fastify from 'fastify'; 7 | import { sFactory } from './serverFactory.ts'; 8 | import { listeningMessage } from "../message.ts"; 9 | import { config } from "../config/config.ts"; 10 | import { fromFileUrl } from "jsr:@std/path"; 11 | 12 | const startServer = async (configPath: string, seo?: boolean) => { 13 | const parsedDoc = await config(configPath); 14 | const serverFactory = await sFactory(configPath); 15 | const distPath = fromFileUrl(new URL('../../dist', import.meta.url)); 16 | const app = Fastify({ logger: false, serverFactory: serverFactory }); 17 | 18 | await app.register(fastifyCookie, { 19 | secret: Deno.env.get('COOKIE_SECRET') || 'yes', 20 | parseOptions: {} 21 | }); 22 | await app.register(fastifyCompress, { 23 | encodings: ['br', 'gzip', 'deflate'] 24 | }); 25 | 26 | await app.register(fastifyStatic, { 27 | root: `${distPath}/noseo`, 28 | etag: false, 29 | lastModified: false 30 | }); 31 | if (seo || parsedDoc.seo.enabled) { 32 | await app.register(fastifyStatic, { 33 | root: `${distPath}/seo`, 34 | constraints: { host: new URL(Deno.env.get('DOMAIN') || parsedDoc.seo.domain).host }, 35 | etag: false, 36 | lastModified: false, 37 | decorateReply: false 38 | }) 39 | } 40 | 41 | await app.register(fastifyMiddie); 42 | await app.register(fastifyHttpProxy, { 43 | upstream: 'https://rawcdn.githack.com/ruby-network/ruby-assets/main/', 44 | prefix: '/gms/', 45 | http2: false 46 | }); 47 | 48 | const port = parseInt(Deno.env.get('PORT') as string) || parsedDoc.server.port || 8000; 49 | 50 | app.listen({ port: port, host: '0.0.0.0' }).then(() => { 51 | listeningMessage(port, "fastify"); 52 | }); 53 | } 54 | 55 | export { startServer } 56 | -------------------------------------------------------------------------------- /vendor/scramjet/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mercuryworkshop/scramjet", 3 | "version": "1.0.2-dev", 4 | "description": "An experimental web proxy that aims to be the successor to Ultraviolet", 5 | "main": "./lib/index.cjs", 6 | "types": "./lib/index.d.js", 7 | "type": "module", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/MercuryWorkshop/scramjet" 11 | }, 12 | "files": [ 13 | "dist/*.js", 14 | "dist/*.js.map", 15 | "lib" 16 | ], 17 | "keywords": [], 18 | "author": "", 19 | "license": "MIT", 20 | "devDependencies": { 21 | "@eslint/eslintrc": "^3.2.0", 22 | "@eslint/js": "^9.17.0", 23 | "@estruyf/github-actions-reporter": "^1.9.2", 24 | "@fastify/static": "^8.0.3", 25 | "@mercuryworkshop/bare-as-module3": "^2.2.5", 26 | "@mercuryworkshop/epoxy-transport": "^2.1.27", 27 | "@mercuryworkshop/libcurl-transport": "^1.3.14", 28 | "@nebula-services/bare-server-node": "^2.0.4", 29 | "@playwright/test": "^1.49.1", 30 | "@rsdoctor/rspack-plugin": "^0.4.11", 31 | "@rspack/cli": "^1.1.6", 32 | "@rspack/core": "^1.1.6", 33 | "@types/eslint": "^9.6.1", 34 | "@types/estree": "^1.0.6", 35 | "@types/node": "^22.10.2", 36 | "@types/serviceworker": "^0.0.107", 37 | "@typescript-eslint/eslint-plugin": "^8.18.0", 38 | "@typescript-eslint/parser": "^8.18.0", 39 | "dotenv": "^16.4.7", 40 | "eslint": "^9.17.0", 41 | "fastify": "^5.1.0", 42 | "playwright": "^1.49.1", 43 | "prettier": "^3.4.2", 44 | "tslib": "^2.8.1", 45 | "typescript": "^5.7.2", 46 | "wisp-server-node": "^1.1.7" 47 | }, 48 | "dependencies": { 49 | "@mercuryworkshop/bare-mux": "^2.1.7", 50 | "dom-serializer": "^2.0.0", 51 | "domhandler": "^5.0.3", 52 | "domutils": "^3.1.0", 53 | "htmlparser2": "^9.1.0", 54 | "parse-domain": "^8.2.2", 55 | "set-cookie-parser": "^2.7.1" 56 | }, 57 | "scripts": { 58 | "build": "rspack build --mode production", 59 | "rewriter:build": "cd rewriter/wasm/ && bash build.sh && cd ../../", 60 | "dev": "node server.js", 61 | "pub": "npm publish --no-git-checks --access public", 62 | "format": "prettier --config .prettierrc.js --write .", 63 | "lint": "eslint ./src/", 64 | "lint:fix": "eslint ./src/ --fix", 65 | "test": "npx playwright test" 66 | } 67 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 1.0.0 2 | - The initial rewrite to Astro. Includes: 3 | - Fully static 4 | - Easier to build 5 | - Feels/is faster to use 6 | - Fixes some bugs 7 | - Among tons of other stuff 8 | 9 | # 1.0.1 10 | - Fixes the games and apps page looking weird 11 | 12 | # 1.0.2 13 | - Fixes Dockerfile issues 14 | 15 | # 1.0.3 16 | - Turns off Rammerhead by default for now 17 | - Docker env fixes again 18 | - SEO 19 | 20 | # 1.0.4 21 | - Bumps RH 22 | - Fixes issues with bare-server-node 23 | 24 | # 1.1.0 25 | - Switches to Deno (mostly) 26 | - General bug fixes 27 | - Removes Rammerhead as an option and replaces it with Scramjet (coming soon) 28 | - Removes bare server and adds libcurl as an option 29 | - Adds a different Deno native server (Hono) - Command: `deno task start:standalone` 30 | - Removes Masqr 31 | - No more SSR, it's purely statically generated 32 | - CI fixes and other general improvements 33 | - Configuration is done via TOML over a bunch of environment vars 34 | - Removes Biome in place of Deno's native formatter 35 | - A better roadmap of what should be done in the future. 36 | 37 | # 1.1.1 38 | - Fixes a bug where if games aren't enabled it redirects to localhost:8080 over just / 39 | - Fixes a bug where if games aren't enabled, it still loads and compresses images over just ignoring them. 40 | 41 | # 1.1.2 42 | - Fixes bugs with apps opening as the full url instead of just the correct link 43 | - Fixes a bug with the iFrame panel where it copies & pastes the full link instead of just the normal link. 44 | - Add Scramjet 45 | 46 | # 1.1.3 47 | - Add the notice that ScramJet is in beta and may break 48 | 49 | # 1.1.4 50 | - Add the ability to disable/enable SEO or selectively render/show it 51 | - Adds the docker-builds.yml file to show the builds I am doing for the docker images. 52 | 53 | # 1.1.5 54 | - Fixes the games (mostly) 55 | 56 | # 1.1.6 57 | - Add the ability to run Incog from a prebuilt file 58 | 59 | # 1.1.7 60 | - Builds both the SEO & non SEO versions of the website for easier deployment 61 | - Adds a `--seo` CLI flag which can enable the SEO build without the config.toml file 62 | - CLI is now easier to use & interact with 63 | - Change and cleanup docs 64 | - Docker command cleanup to reflect new changes 65 | - docker-compose.build.yml no longer exists. 66 | 67 | # v1.1.8 68 | - Add the ability to self update your binary 69 | - Change the way parts of the CLI look 70 | -------------------------------------------------------------------------------- /src/components/MobileNav.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | const { options, page } = Astro.props; 4 | import { GAMES_LINK } from 'astro:env/client'; 5 | --- 6 |
7 | 10 |
11 | 29 | 39 | -------------------------------------------------------------------------------- /src/pages/gs/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Image } from 'astro:assets'; 3 | import { GAMES_LINK } from 'astro:env/client'; 4 | import Layout from '@layouts/Layout.astro'; 5 | import type { ImageMetadata } from 'astro'; 6 | import { Icon } from 'astro-icon/components'; 7 | import games from "../../data/games.json"; 8 | const images = import.meta.glob<{ default: ImageMetadata }>( 9 | '/src/assets/games/*.{jpeg,jpg,png,gif,webp}' 10 | ); 11 | --- 12 | 13 |
14 | {GAMES_LINK && 15 |
16 |
17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 | {games.map((game) => ( 25 | 26 | {`${game.name}'s 27 | 28 | ))} 29 |
30 | } 31 |
32 |
33 | 55 | -------------------------------------------------------------------------------- /vendor/scramjet/dist/scramjet.sync.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"scramjet.sync.js","sources":["webpack://@mercuryworkshop/scramjet/./src/sync.ts"],"sourcesContent":["addEventListener(\n\t\"message\",\n\t({\n\t\tdata: {\n\t\t\tsab,\n\t\t\targs: [method, url, _, username, password],\n\t\t\tbody,\n\t\t\theaders,\n\t\t},\n\t}) => {\n\t\tconst view = new DataView(sab);\n\t\tconst u8view = new Uint8Array(sab);\n\n\t\tconst xhr = new XMLHttpRequest();\n\t\txhr.responseType = \"arraybuffer\";\n\n\t\t// force async since we need it to resolve to the sw\n\t\txhr.open(method, url, true, username, password);\n\n\t\tif (headers)\n\t\t\tfor (const [k, v] of Object.entries(headers)) {\n\t\t\t\txhr.setRequestHeader(k, v as string);\n\t\t\t}\n\n\t\txhr.send(body);\n\n\t\txhr.onload = () => {\n\t\t\tlet cursor = 1; // first byte is the lock\n\n\t\t\tview.setUint16(cursor, xhr.status);\n\t\t\tcursor += 2;\n\n\t\t\t// next write the header string\n\t\t\tconst headers = xhr.getAllResponseHeaders();\n\t\t\tview.setUint32(cursor, headers.length);\n\t\t\tcursor += 4;\n\n\t\t\tif (sab.byteLength < cursor + headers.length)\n\t\t\t\tsab.grow(cursor + headers.length);\n\t\t\tu8view.set(new TextEncoder().encode(headers), cursor);\n\t\t\tcursor += headers.length;\n\n\t\t\tview.setUint32(cursor, xhr.response.byteLength);\n\t\t\tcursor += 4;\n\n\t\t\tif (sab.byteLength < cursor + xhr.response.byteLength)\n\t\t\t\tsab.grow(cursor + xhr.response.byteLength);\n\t\t\tu8view.set(new Uint8Array(xhr.response), cursor);\n\n\t\t\t// release the lock, main thread will stop spinning now\n\t\t\tview.setUint8(0, 1);\n\t\t};\n\t\txhr.ontimeout =\n\t\t\txhr.onerror =\n\t\t\txhr.onabort =\n\t\t\t\t() => {\n\t\t\t\t\tconsole.error(\"xhr failed\");\n\t\t\t\t\tview.setUint8(0, 1);\n\t\t\t\t};\n\t}\n);\n"],"names":["addEventListener","sab","method","url","_","username","password","body","headers","view","DataView","u8view","Uint8Array","xhr","XMLHttpRequest","k","v","Object","cursor","TextEncoder","console"],"mappings":"AAAAA,iBACC,UACA,CAAC,CACA,KAAM,CACLC,IAAAA,CAAG,CACH,KAAM,CAACC,EAAQC,EAAKC,EAAGC,EAAUC,EAAS,CAC1CC,KAAAA,CAAI,CACJC,QAAAA,CAAO,CACP,CACD,IACA,IAAMC,EAAO,IAAIC,SAAST,GACpBU,EAAS,IAAIC,WAAWX,GAExBY,EAAM,IAAIC,eAMhB,GALAD,EAAI,YAAY,CAAG,cAGnBA,EAAI,IAAI,CAACX,EAAQC,EAAK,GAAME,EAAUC,GAElCE,EACH,IAAK,GAAM,CAACO,EAAGC,EAAE,GAAIC,OAAO,OAAO,CAACT,GACnCK,EAAI,gBAAgB,CAACE,EAAGC,GAG1BH,EAAI,IAAI,CAACN,GAETM,EAAI,MAAM,CAAG,KACZ,IAAIK,EAAS,EAEbT,EAAK,SAAS,CAACS,EAAQL,EAAI,MAAM,EACjCK,GAAU,EAGV,IAAMV,EAAUK,EAAI,qBAAqB,GACzCJ,EAAK,SAAS,CAACS,EAAQV,EAAQ,MAAM,EACrCU,GAAU,EAENjB,EAAI,UAAU,CAAGiB,EAASV,EAAQ,MAAM,EAC3CP,EAAI,IAAI,CAACiB,EAASV,EAAQ,MAAM,EACjCG,EAAO,GAAG,CAAC,IAAIQ,cAAc,MAAM,CAACX,GAAUU,GAC9CA,GAAUV,EAAQ,MAAM,CAExBC,EAAK,SAAS,CAACS,EAAQL,EAAI,QAAQ,CAAC,UAAU,EAC9CK,GAAU,EAENjB,EAAI,UAAU,CAAGiB,EAASL,EAAI,QAAQ,CAAC,UAAU,EACpDZ,EAAI,IAAI,CAACiB,EAASL,EAAI,QAAQ,CAAC,UAAU,EAC1CF,EAAO,GAAG,CAAC,IAAIC,WAAWC,EAAI,QAAQ,EAAGK,GAGzCT,EAAK,QAAQ,CAAC,EAAG,EAClB,EACAI,EAAI,SAAS,CACZA,EAAI,OAAO,CACXA,EAAI,OAAO,CACV,KACCO,QAAQ,KAAK,CAAC,cACdX,EAAK,QAAQ,CAAC,EAAG,EAClB,CACH"} -------------------------------------------------------------------------------- /src/components/Scripts.astro: -------------------------------------------------------------------------------- 1 | 57 | -------------------------------------------------------------------------------- /src/pages/support.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Header from '@components/Header.astro'; 3 | import Layout from '@layouts/Layout.astro'; 4 | --- 5 | 6 |
7 |
8 |
9 | A page is not functioning or loading on the proxy 11 |

12 | Our web servers are either under really high load, or the web page you tried 13 | accessing is not currently supported. 14 |

15 |
16 |
17 |
18 | Is my information secure 19 |

20 | Yes, your informaton is as secure as the sites visiting them. Our end to end TLS encryption through websockets ensures even more that it is 26 | secure. 27 |

28 |
29 |
30 |
31 | Where can I obtain more links to Incognito 33 |

34 | Links to incognito can be generated at Titanium Network 40 | 41 |

42 |
43 |
44 |
45 | Why is GeForce Now is responding with "403 Access Denied" 47 |

48 | At the moment, too many people are using GeForce Now on our servers. Try again 49 | later. 50 |

51 |
52 |
53 |
54 | Google login is saying this app is insecure 56 |

57 | At the moment, Google login is not supported for @gmail accounts. However, it is 58 | supported for GSuite accounts (School / work email). 59 |

60 |
61 |
62 |
63 |
64 | -------------------------------------------------------------------------------- /src/components/FrameManager.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | --- 4 | 19 | 61 | -------------------------------------------------------------------------------- /.github/workflows/binaries.yml: -------------------------------------------------------------------------------- 1 | name: Add Binaries to current release. 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | #workflow_run: 8 | # workflows: 9 | # - Release 10 | # types: 11 | # - completed 12 | workflow_dispatch: 13 | 14 | #defaults: 15 | #run: 16 | #shell: bash 17 | 18 | env: 19 | FORCE_COLOR: true 20 | 21 | jobs: 22 | windows-build: 23 | name: Build Windows 24 | if: ${{ github.repository_owner == 'titaniumnetwork-dev' }} 25 | runs-on: windows-latest 26 | permissions: 27 | contents: write 28 | id-token: write 29 | steps: 30 | - uses: actions/checkout@v4 31 | 32 | - name: Setup Deno 33 | uses: denoland/setup-deno@v2 34 | with: 35 | deno-version: 2.1.4 36 | 37 | - name: Install dependencies 38 | run: deno install --allow-scripts 39 | 40 | - name: Build Incog 41 | run: cp config.example.toml config.toml && deno task build 42 | 43 | - name: Compile Windows Binaries 44 | run: deno task exe:windows 45 | 46 | - name: Upload artifacts 47 | uses: actions/upload-artifact@v4 48 | with: 49 | name: incognito-windows 50 | path: | 51 | *.exe 52 | maclinux-build: 53 | name: Build MacOS & Linux 54 | if: ${{ github.repository_owner == 'titaniumnetwork-dev' }} 55 | runs-on: ubuntu-latest 56 | permissions: 57 | contents: write 58 | id-token: write 59 | steps: 60 | - uses: actions/checkout@v4 61 | 62 | - name: Setup Deno 63 | uses: denoland/setup-deno@v2 64 | with: 65 | deno-version: 2.1.4 66 | 67 | - name: Install dependencies 68 | run: deno install --allow-scripts 69 | 70 | - name: Build Incog 71 | run: cp config.example.toml config.toml && deno task build 72 | 73 | - name: Compile MacOS 74 | run: deno task exe:macOS 75 | 76 | - name: Compile MacOS Arm64 77 | run: deno task exe:macOSarm 78 | 79 | - name: Compile Linux 80 | run: deno task exe:linux 81 | 82 | - name: Compile Linux Arm64 83 | run: deno task exe:linuxArm 84 | 85 | - name: Upload artifacts 86 | uses: actions/upload-artifact@v4 87 | with: 88 | name: incognito-linux-mac 89 | retention-days: 1 90 | path: | 91 | incognito-* 92 | 93 | 94 | upload-release: 95 | name: Upload the binary files 96 | if: ${{ github.repository_owner == 'titaniumnetwork-dev' }} 97 | runs-on: ubuntu-latest 98 | needs: [windows-build, maclinux-build] 99 | 100 | steps: 101 | - uses: actions/checkout@v4 102 | with: 103 | fetch-depth: 0 104 | fetch-tags: true 105 | - name: Make sure tag is there 106 | id: tag 107 | run: 108 | echo "tag=$(git describe --tags --abbrev=0)" >> $GITHUB_OUTPUT 109 | 110 | - name: Download artifacts for Linux & MacOS 111 | uses: actions/download-artifact@v4 112 | with: 113 | path: . 114 | 115 | - name: Upload Linux & MacOS 116 | uses: svenstaro/upload-release-action@v2 117 | with: 118 | repo_token: ${{ secrets.GITHUB_TOKEN }} 119 | file: incognito-linux-mac/* 120 | tag: ${{ steps.tag.outputs.tag }} 121 | overwrite: true 122 | file_glob: true 123 | 124 | - name: Upload Windows binary 125 | uses: svenstaro/upload-release-action@v2 126 | with: 127 | repo_token: ${{ secrets.GITHUB_TOKEN }} 128 | file: incognito-windows/*.exe 129 | tag: ${{ steps.tag.outputs.tag }} 130 | overwrite: true 131 | file_glob: true 132 | -------------------------------------------------------------------------------- /astro.config.ts: -------------------------------------------------------------------------------- 1 | import sitemap from '@astrojs/sitemap'; 2 | import tailwind from '@astrojs/tailwind'; 3 | import { baremuxPath } from '@mercuryworkshop/bare-mux/node'; 4 | //@ts-expect-error No types 5 | import { epoxyPath } from '@mercuryworkshop/epoxy-transport'; 6 | import { libcurlPath } from '@mercuryworkshop/libcurl-transport'; 7 | import playformCompress from '@playform/compress'; 8 | import { uvPath } from '@titaniumnetwork-dev/ultraviolet'; 9 | import icon from 'astro-icon'; 10 | import robotsTxt from 'astro-robots-txt'; 11 | import { defineConfig, envField, passthroughImageService } from 'astro/config'; 12 | import { viteStaticCopy } from 'vite-plugin-static-copy'; 13 | //we need the buildOpts from here : D 14 | import { config } from './server/config/config.ts'; 15 | const scramjetPath = `${import.meta.dirname}/vendor/scramjet/dist/` 16 | const parsedDoc = await config(`${Deno.cwd()}/config.toml`); 17 | // https://astro.build/config 18 | export default defineConfig({ 19 | site: Deno.env.get('SITE') || 'https://localhost:8080', 20 | integrations: [ 21 | tailwind(), 22 | robotsTxt(), 23 | sitemap(), 24 | icon(), 25 | playformCompress({ 26 | CSS: false, 27 | HTML: true, 28 | Image: true, 29 | JavaScript: true, 30 | SVG: true, 31 | }), 32 | ], 33 | output: 'static', 34 | image: { 35 | service: passthroughImageService() 36 | }, 37 | env: { 38 | schema: { 39 | GAMES_LINK: envField.boolean({ 40 | context: 'client', 41 | access: 'public', 42 | default: parsedDoc.buildOpts.games, 43 | }), 44 | SEO: envField.boolean({ 45 | context: 'client', 46 | access: 'public', 47 | default: Boolean(Deno.env.get('SEO')) 48 | }) 49 | }, 50 | }, 51 | vite: { 52 | plugins: [ 53 | viteStaticCopy({ 54 | targets: [ 55 | { 56 | src: `${uvPath}/**/*`.replace(/\\/g, '/'), 57 | dest: 'uv', 58 | overwrite: false, 59 | }, 60 | { 61 | src: `${epoxyPath}/**/*`.replace(/\\/g, '/'), 62 | dest: 'epoxy', 63 | overwrite: false, 64 | }, 65 | { 66 | src: `${libcurlPath}/**/*`.replace(/\\/g, '/'), 67 | dest: 'libcurl', 68 | overwrite: false, 69 | }, 70 | { 71 | src: `${baremuxPath}/**/*`.replace(/\\/g, '/'), 72 | dest: 'baremux', 73 | overwrite: false, 74 | }, 75 | { 76 | src: `${scramjetPath}/**/*`.replace(/\\/g, '/'), 77 | dest: 'scram', 78 | overwrite: false 79 | } 80 | ], 81 | }) as any, 82 | ], 83 | server: { 84 | proxy: { 85 | '/wisp/': { 86 | target: 'wss://ruby.rubynetwork.co/wisp/', 87 | changeOrigin: true, 88 | ws: true, 89 | rewrite: (path: any) => path.replace(/^\/wisp\//, ''), 90 | }, 91 | '/gms/': { 92 | target: 'https://rawcdn.githack.com/ruby-network/ruby-assets/main/', 93 | changeOrigin: true, 94 | ws: true, 95 | secure: false, 96 | rewrite: (path: any) => path.replace(/^\/gms\//, ''), 97 | }, 98 | }, 99 | }, 100 | }, 101 | }); 102 | -------------------------------------------------------------------------------- /src/pages/options/bt.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import NavMenu from '@components/MobileNav.astro'; 3 | import Layout from '@layouts/Layout.astro'; 4 | import { Icon } from 'astro-icon/components'; 5 | --- 6 | 7 | 8 |
9 |
10 |
11 | 12 | 13 | 14 |

15 | Options 16 |

17 |
18 | 23 |
24 | 25 |
26 |
27 |
28 |

Tab Title

29 | 30 |

Change the title of Incognito's browser tab title

31 |
32 |
33 |

Tab Icon

34 | 35 |

Change the icon of Incognito's browser tab. To change it into something like Google, type in "https://www.google.com/favicon.ico"

36 |
37 |
38 |
39 | 71 |
72 | -------------------------------------------------------------------------------- /src/pages/options/about.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import NavMenu from '@components/MobileNav.astro'; 3 | import Layout from '@layouts/Layout.astro'; 4 | import { Icon } from 'astro-icon/components'; 5 | --- 6 | 7 | 8 |
9 |
10 |
11 | 12 | 13 | 14 |

15 | Options 16 |

17 |
18 | 38 |
39 | 40 |
41 |
42 |
43 | About Incognito 44 |

45 | Access the world wide web, Incognito is an anti-censorship web service. 46 |

47 |
48 |
49 |
50 | Authors 51 |

52 | MotorTruck1221 - Incognito developer & maintainer 58 |

59 |

60 | Rifting/Riftriot - Incognito developer & maintainer 66 |

67 |

68 | e9x - Creator of TompHTTP 79 |

80 |

81 | Caracal.js - Creator of Ultraviolet & Incognito 92 |

93 |
94 |
95 |
96 |
97 | -------------------------------------------------------------------------------- /vendor/scramjet/dist/scramjet.controller.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e={1762:function(e,r,t){t.d(r,{Z:function(){return o}});let o={fmt:function(e,r,...t){let o=Error.prepareStackTrace;Error.prepareStackTrace=(e,r)=>{r.shift(),r.shift(),r.shift();let t="";for(let e=1;e `+t);return t+=r[0].getFunctionName()||"Anonymous"};let n=function(){try{throw Error()}catch(e){return e.stack}}();Error.prepareStackTrace=o;let c=console[e]||console.log;c(`%c${n}%c ${r}`,` 2 | background-color: ${{log:"#000",warn:"#f80",error:"#f00",debug:"transparent"}[e]}; 3 | color: ${{log:"#fff",warn:"#fff",error:"#fff",debug:"gray"}[e]}; 4 | padding: ${{log:2,warn:4,error:4,debug:0}[e]}px; 5 | font-weight: bold; 6 | font-family: monospace; 7 | font-size: 0.9em; 8 | `,`${"debug"===e?"color: gray":""}`,...t)},log:function(e,...r){this.fmt("log",e,...r)},warn:function(e,...r){this.fmt("warn",e,...r)},error:function(e,...r){this.fmt("error",e,...r)},debug:function(e,...r){this.fmt("debug",e,...r)}}}},r={};function t(o){var n=r[o];if(void 0!==n)return n.exports;var c=r[o]={exports:{}};return e[o](c,c.exports,t),c.exports}t.d=function(e,r){for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)};let o=Symbol.for("scramjet client global"),n=Symbol.for("scramjet frame handle");var c=t(1762).Z;class s extends EventTarget{controller;frame;constructor(e,r){super(),this.controller=e,this.frame=r,r[n]=this}get client(){return this.frame.contentWindow.window[o]}get url(){return this.client.url}go(e){e instanceof URL&&(e=e.toString()),c.log("navigated to",e),this.frame.src=this.controller.encodeUrl(e)}back(){this.frame.contentWindow?.history.back()}forward(){this.frame.contentWindow?.history.forward()}reload(){this.frame.contentWindow?.location.reload()}}!("$scramjet"in self)&&(self.$scramjet={version:{build:"1efcf85",version:"1.0.2-dev"},codec:{},flagEnabled:function(e,r){let t=i.config.flags[e];for(let t in i.config.siteFlags){let o=i.config.siteFlags[t];if(new RegExp(t).test(r.href)&&e in o)return o[e]}return t}});let i=self.$scramjet,a=Function;function f(){i.codec.encode=a("url",i.config.codec.encode),i.codec.decode=a("url",i.config.codec.decode)}var l=t(1762).Z;window.ScramjetController=class e{db;constructor(e){let r={prefix:"/scramjet/",globals:{wrapfn:"$scramjet$wrap",wrapthisfn:"$scramjet$wrapthis",trysetfn:"$scramjet$tryset",importfn:"$scramjet$import",rewritefn:"$scramjet$rewrite",metafn:"$scramjet$meta",setrealmfn:"$scramjet$setrealm",pushsourcemapfn:"$scramjet$pushsourcemap"},files:{wasm:"/scramjet.wasm.js",shared:"/scramjet.shared.js",worker:"/scramjet.worker.js",client:"/scramjet.client.js",sync:"/scramjet.sync.js"},flags:{serviceworkers:!1,syncxhr:!1,naiiveRewriter:!1,strictRewrites:!0,rewriterLogs:!0,captureErrors:!0,cleanErrors:!1,scramitize:!1,sourcemaps:!1},siteFlags:{},codec:{encode:`if (!url) return url; 9 | return encodeURIComponent(url);`,decode:`if (!url) return url; 10 | return decodeURIComponent(url);`}},t=(e,r)=>{for(let o in r)r[o]instanceof Object&&o in e&&Object.assign(r[o],t(e[o],r[o]));return Object.assign(e||{},r)};i.config=t(r,e)}async init(e){f(),await this.openIDB();let r=await navigator.serviceWorker.register(e);return l.log("service worker registered"),r}createFrame(e){return!e&&(e=document.createElement("iframe")),new s(this,e)}encodeUrl(e){return e instanceof URL&&(e=e.toString()),i.config.prefix+i.codec.encode(e)}decodeUrl(e){return e instanceof URL&&(e=e.toString()),i.codec.decode(e)}async openIDB(){let e=indexedDB.open("$scramjet",1);return new Promise((r,t)=>{e.onsuccess=async()=>{this.db=e.result,await this.#e(),r(e.result)},e.onupgradeneeded=()=>{let r=e.result;!r.objectStoreNames.contains("config")&&r.createObjectStore("config"),!r.objectStoreNames.contains("cookies")&&r.createObjectStore("cookies")},e.onerror=()=>t(e.error)})}async #e(){if(!this.db){console.error("Store not ready!");return}let e=this.db.transaction("config","readwrite").objectStore("config").put(i.config,"config");return new Promise((r,t)=>{e.onsuccess=r,e.onerror=t})}async modifyConfig(e){i.config=Object.assign({},i.config,e),f(),await this.#e()}}})(); 11 | //# sourceMappingURL=scramjet.controller.js.map -------------------------------------------------------------------------------- /deno.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://deno.land/x/deno@v2.1.4/cli/schemas/config-file.v1.json", 3 | "nodeModulesDir": "auto", 4 | "tasks": { 5 | "dev:server": "deno run -A --watch server/server.ts", 6 | "dev:client": "astro dev", 7 | "dev": "deno task dev:server & deno task dev:client", 8 | "build": "SEO=true astro build --outDir dist/seo/ && SEO=false astro build --outDir dist/noseo/", 9 | "exe:gen": "deno compile --target $ARC --include public --include dist --include server --include vendor --include deno.jsonc --include config.toml --include package.json --node-modules-dir --output incognito-$ARCN -A server/cli.ts", 10 | "exe:windows": "ARCN=windows ARC=x86_64-pc-windows-msvc deno task exe:gen", 11 | "exe:macOS": "ARCN=MacOS ARC=x86_64-apple-darwin deno task exe:gen", 12 | "exe:macOSarm": "ARCN=MacOS-arm ARC=aarch64-apple-darwin deno task exe:gen", 13 | "exe:linux": "ARCN=linux ARC=x86_64-unknown-linux-gnu deno task exe:gen", 14 | "exe:linuxArm": "ARCN=linux-arm ARC=aarch64-unknown-linux-gnu deno task exe:gen", 15 | "exe:all": "deno task exe:windows & deno task exe:macOS & deno task exe:macOSarm & deno task exe:linux & deno task exe:linuxArm", 16 | "exe": "deno compile --include public --include dist --include server --include vendor --include deno.jsonc --include config.toml --include package.json --node-modules-dir --output incognito -A server/cli.ts", 17 | "start": "deno run --allow-net --allow-read --allow-env --allow-ffi --allow-sys server/cli.ts", 18 | "bstart": "deno task build && deno task start", 19 | "bstart:seo": "deno task build:seo && deno task start", 20 | "check:frontend": "astro check", 21 | "check:server": "deno check server/**/*.ts", 22 | "check": "deno task check:frontend && deno task check:server", 23 | "changeset:version": "changeset version", 24 | "changeset:publish": "changeset publish" 25 | }, 26 | "fmt": { 27 | "indentWidth": 4, 28 | "lineWidth": 100, 29 | "semiColons": true, 30 | "proseWrap": "preserve", 31 | "singleQuote": true 32 | }, 33 | "imports": { 34 | // Astro deps 35 | "@astrojs/check": "npm:@astrojs/check@^0.9.4", 36 | "@astrojs/sitemap": "npm:@astrojs/sitemap@^3.2.1", 37 | "@astrojs/tailwind": "npm:@astrojs/tailwind@^5.1.3", 38 | "astro": "npm:astro@^5.2.3", 39 | "astro-seo": "npm:astro-seo@^0.8.4", 40 | "astro-icon": "npm:astro-icon@^1.1.4", 41 | "astro-robots-txt": "npm:astro-robots-txt@^1.0.0", 42 | "tailwindcss": "npm:tailwindcss@^3.4.16", 43 | "vite-plugin-static-copy": "npm:vite-plugin-static-copy@^2.2.0", 44 | "@iconify-json/fa-solid": "npm:@iconify-json/fa-solid@^1.2.0", 45 | "@iconify-json/fa6-solid": "npm:@iconify-json/fa6-solid@^1.2.2", 46 | "@iconify-json/mdi": "npm:@iconify-json/mdi@1.2.1", 47 | "@playform/compress": "npm:@playform/compress@^0.1.6", 48 | "sharp": "npm:sharp@^0.33.5", 49 | //Server stuff 50 | "@fastify/compress": "npm:@fastify/compress@^8.0.1", 51 | "@fastify/cookie": "npm:@fastify/cookie@^11.0.1", 52 | "@fastify/http-proxy": "npm:@fastify/http-proxy@^10.0.1", 53 | "@fastify/middie": "npm:@fastify/middie@^9.0.2", 54 | "@fastify/static": "npm:@fastify/static@^8.0.2", 55 | "fastify": "npm:fastify@^5.1.0", 56 | //UV, bare-mux, RH, corlink & wisp 57 | "@mercuryworkshop/bare-mux": "npm:@mercuryworkshop/bare-mux@^2.1.7", 58 | "@mercuryworkshop/epoxy-transport": "npm:@mercuryworkshop/epoxy-transport@^2.1.27", 59 | "@mercuryworkshop/libcurl-transport": "npm:@mercuryworkshop/libcurl-transport@^1.3.14", 60 | "@titaniumnetwork-dev/ultraviolet": "npm:@titaniumnetwork-dev/ultraviolet@^3.2.10", 61 | "wisp-server-node": "npm:wisp-server-node@^1.1.7", 62 | //random other deps 63 | "chalk": "npm:chalk@^5.3.0", 64 | "@changesets/cli": "npm:@changesets/cli@^2.27.10", 65 | "smol-toml": "npm:smol-toml@^1.3.1", 66 | "@types/node": "npm:@types/node@^22.9.0", 67 | "gradient-string": "npm:gradient-string@^3.0.0", 68 | "@types/deno": "npm:@types/deno@^2.0.0", 69 | "typescript": "npm:typescript@^5.7.2" //I need this for astro typechecking for some damn reason 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/pages/gs/[game].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { GetStaticPaths } from 'astro'; 3 | import games from '../../data/games.json'; 4 | const { game } = Astro.params; 5 | import { GAMES_LINK } from 'astro:env/client'; 6 | import Layout from '@layouts/Layout.astro'; 7 | import { Icon } from 'astro-icon/components'; 8 | function decode(val: string) { 9 | try { 10 | return atob(val); 11 | } catch (_) {} 12 | } 13 | if (!GAMES_LINK) { 14 | return Astro.redirect('/'); 15 | } 16 | interface Game { 17 | params: { game: string }; 18 | } 19 | export const getStaticPaths = (async () => { 20 | const gamesList: Game[] = games.map((game) => ({ 21 | params: { game: btoa(game.name) }, 22 | })); 23 | return gamesList; 24 | }) satisfies GetStaticPaths; 25 | --- 26 | 27 |
28 |
29 |
30 | 35 | 36 | 37 |

38 | {decode(game as string)} 39 |

40 | 47 |
48 |
49 |