├── .eslintrc.cjs
├── .gitattributes
├── .gitignore
├── .gitpod.yml
├── .nvmrc
├── .prettierrc
├── .replit
├── .vscode
├── settings.json
└── tasks.json
├── .yarn
├── install-state.gz
└── patches
│ └── mdsvex-npm-0.12.3-11596b7ddc.patch
├── .yarnrc.yml
├── Caddyfile
├── README.md
├── package.json
├── replit.nix
├── src
├── app.css
├── app.d.ts
├── app.html
├── global.d.ts
├── hooks.server.ts
├── lib
│ ├── 98
│ │ ├── 98.css
│ │ ├── ms_sans_serif.woff2
│ │ └── ms_sans_serif_bold.woff2
│ ├── BackAnchor.svelte
│ ├── ButtonRow.svelte
│ ├── Head.svelte
│ ├── Icon
│ │ ├── GitHub.svelte
│ │ ├── Icon.svelte
│ │ ├── JavaScript.svelte
│ │ ├── Kofi.svelte
│ │ ├── Matrix.svelte
│ │ ├── Python.svelte
│ │ ├── Rust.svelte
│ │ ├── Svelte.svelte
│ │ └── TypeScript.svelte
│ ├── IconButtonRow.svelte
│ ├── LoadingDots.svelte
│ ├── PostLayout.svelte
│ ├── PostPreview.svelte
│ ├── Project.svelte
│ ├── atkinson-hyperlegible.css
│ ├── blog.ts
│ ├── components
│ │ └── img.svelte
│ ├── fonts
│ │ ├── atkinson-hyperlegible
│ │ │ ├── latin-bold.woff2
│ │ │ ├── latin-ext-bold.woff2
│ │ │ ├── latin-ext-italic-bold.woff2
│ │ │ ├── latin-ext-italic.woff2
│ │ │ ├── latin-ext.woff2
│ │ │ ├── latin-italic-bold.woff2
│ │ │ ├── latin-italic.woff2
│ │ │ └── latin.woff2
│ │ └── minecraft.otf
│ ├── gravity
│ │ ├── explosion.gif
│ │ ├── index.ts
│ │ ├── nuclear-bomb-sound-effect.mp3
│ │ └── oneshot-my-burden-is-light.mp3
│ ├── stake-ad.ts
│ ├── topography.svg
│ └── types.d.ts
└── routes
│ ├── (blog)
│ ├── gemini
│ │ └── index.svx
│ ├── matdoes-dev-markdown
│ │ └── index.svx
│ ├── matscan
│ │ └── index.svx
│ ├── metasearch
│ │ ├── google-result-html.png
│ │ ├── index.svx
│ │ ├── kagi-results.png
│ │ ├── metasearch2-calc.png
│ │ ├── metasearch2-progress-display.png
│ │ ├── metasearch2-results.png
│ │ └── searxng-results.png
│ ├── minecraft-scanning
│ │ ├── RandomServers.svelte
│ │ ├── Server.svelte
│ │ ├── home.jpg
│ │ ├── honeypot.jpg
│ │ ├── index.svx
│ │ ├── linode-ticket.jpg
│ │ ├── minecraft-server-background.png
│ │ ├── potato.jpg
│ │ └── signs.jpg
│ ├── minecraft-uuids
│ │ ├── BarChart.svelte
│ │ ├── UserSearch.svelte
│ │ ├── hurricane-electric-example-configurations.png
│ │ ├── hypixel-forums-deleted-post.png
│ │ ├── index.svx
│ │ ├── namemc-captcha-clicking.png
│ │ ├── namemc-wildcard-scraping.png
│ │ ├── northernside-32m.png
│ │ ├── wiki-vg-uuid-endpoint.png
│ │ └── yuno-55m.png
│ ├── the-story-of-reportscammers
│ │ ├── index.svx
│ │ └── thats-crazy-but-i-dont-remember-asking.png
│ ├── uncovering-the-discord-twitch-bots
│ │ └── index.svx
│ ├── what-are-domain-hacks
│ │ ├── domain-hack-example.png
│ │ ├── domain-hack-generator.png
│ │ └── index.svx
│ └── who-is-mat
│ │ ├── favicon.png
│ │ └── index.svx
│ ├── (main)
│ ├── 404
│ │ └── +page.svelte
│ ├── 451
│ │ └── +page.svelte
│ ├── +error.svelte
│ ├── +layout.svelte
│ ├── +layout.ts
│ ├── +page.svelte
│ ├── +page.ts
│ ├── [slug]
│ │ ├── +page.svelte
│ │ ├── +page.ts
│ │ └── [asset]
│ │ │ └── +server.ts
│ ├── admin
│ │ ├── +page.svelte
│ │ └── AdminGraph.svelte
│ ├── blog
│ │ ├── +page.svelte
│ │ ├── +page.ts
│ │ └── [...path]
│ │ │ └── +server.ts
│ └── projects
│ │ ├── +page.svelte
│ │ └── +page.ts
│ ├── +layout.svelte
│ ├── .json
│ └── +server.ts
│ ├── [slug].json
│ └── +server.ts
│ ├── [slug].md
│ └── +server.ts
│ ├── [slug].txt
│ └── +server.ts
│ ├── _projects.json
│ ├── blog-preview.json
│ └── +server.ts
│ ├── blog.atom
│ └── +server.ts
│ ├── blog.json
│ ├── +server.ts
│ └── preview.ts
│ ├── blog.rss
│ └── +server.ts
│ ├── blog.txt
│ └── +server.ts
│ ├── buttons
│ ├── +layout.server.ts
│ ├── +layout.svelte
│ ├── +page.svelte
│ ├── 88x31.ts
│ ├── ButtonLink.svelte
│ ├── ExternalLink.svelte
│ ├── ExternalLinkIcon.svelte
│ ├── app.css
│ └── degrees
│ │ └── +page.svelte
│ ├── index.txt
│ └── +server.ts
│ ├── lightswitch
│ ├── +page.svelte
│ ├── +page.ts
│ ├── lightswitch-off.mp3
│ ├── lightswitch-off.png
│ ├── lightswitch-on.mp3
│ └── lightswitch-on.png
│ ├── neko
│ ├── +page.server.ts
│ ├── +page.svelte
│ ├── oneko.css
│ └── oneko.ts
│ ├── projects.json
│ └── +server.ts
│ ├── projects.txt
│ └── +server.ts
│ ├── qotd
│ └── +server.ts
│ ├── retro
│ ├── +layout.svelte
│ ├── +page.server.ts
│ ├── +page.svelte
│ ├── +page.ts
│ ├── Button.svelte
│ ├── MusicPlayer.svelte
│ ├── app.css
│ ├── contact.gif
│ ├── icons
│ │ ├── Backward.svelte
│ │ ├── Forward.svelte
│ │ ├── Pause.svelte
│ │ └── Play.svelte
│ ├── links.gif
│ └── sparkles.gif
│ └── status.json
│ └── +server.ts
├── static
├── .cobalt
│ └── help
│ │ └── ftpSite.html
├── .gitignore
├── .well-known
│ ├── discord
│ ├── dnt
│ ├── gpc.json
│ └── matrix
│ │ ├── client
│ │ └── server
├── :3.html
├── :v.html
├── ads.txt
├── apache
│ └── ubuntu-logo.png
├── bliss-hd.jpg
├── dot_git
│ ├── COMMIT_EDITMSG
│ ├── HEAD
│ ├── config
│ ├── description
│ ├── index
│ ├── info
│ │ └── exclude
│ ├── logs
│ │ ├── HEAD
│ │ └── refs
│ │ │ └── heads
│ │ │ └── master
│ ├── objects
│ │ ├── 08
│ │ │ └── 0226f1f5f9784307c3e436d45792f448338d5f
│ │ ├── 4b
│ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904
│ │ ├── 5b
│ │ │ └── 501737d80cbfcc67cfbdf6343bbafac98b8052
│ │ ├── af
│ │ │ └── e232c49b95502bd5175f0e48d325a6a0fd6bbc
│ │ └── d3
│ │ │ └── 6c0d6aa8f54b501f1785134f7688a3214d6810
│ └── refs
│ │ └── heads
│ │ └── master
├── emoji
│ ├── 1f6ab.svg
│ └── 26a0.svg
├── favicon.png
├── humans.txt
├── ibm-http-server
│ ├── background.gif
│ ├── foreground.gif
│ ├── help.gif
│ ├── http_server_styles.css
│ ├── odot.gif
│ └── support.gif
├── id_rsa.pub
├── iisstart.png
├── index.htm
│ ├── index.htm
│ │ ├── index.htm
│ │ │ ├── index.htm
│ │ │ │ ├── index.htm
│ │ │ │ │ ├── index.htm
│ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── index.htm
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ │ └── index.html
│ │ │ │ │ │ └── index.html
│ │ │ │ │ └── index.html
│ │ │ │ └── index.html
│ │ │ └── index.html
│ │ └── index.html
│ └── index.html
├── jetty.gif
├── litespeed
│ ├── 404-icon.png
│ ├── blocked_content-icon.png
│ ├── bootstrap.min.css
│ ├── cgi-icon.png
│ ├── custom.css
│ ├── file_upload-icon.png
│ ├── olsws_logo.png
│ ├── php-icon.png
│ ├── powered_by_ols-new.png
│ └── pwd_protect-icon.png
├── raq4
│ ├── RaQ_stack.jpg
│ ├── bkgnd1.gif
│ ├── black_tile8.gif
│ ├── hint3_en.gif
│ ├── p_nav_dots.gif
│ ├── spacer1.gif
│ └── top_logo_black.gif
├── retro
│ ├── background.gif
│ ├── buttons
│ │ ├── 8minty.gif
│ │ ├── README.md
│ │ ├── actuallyruben.gif
│ │ ├── adryd.png
│ │ ├── alula.png
│ │ ├── anythingbutchrome.gif
│ │ ├── archbtw.png
│ │ ├── aubrey.png
│ │ ├── caddy.png
│ │ ├── cbax.gif
│ │ ├── dam.gif
│ │ ├── edna.png
│ │ ├── ezri.png
│ │ ├── fightforprivacy.gif
│ │ ├── firefox.gif
│ │ ├── github.gif
│ │ ├── goldenstack.png
│ │ ├── haylin.png
│ │ ├── hetzner.gif
│ │ ├── honbra.png
│ │ ├── internet-archive.png
│ │ ├── izzy.gif
│ │ ├── jamie.png
│ │ ├── jamsharp.png
│ │ ├── jordan.gif
│ │ ├── kibtytown.gif
│ │ ├── kofi.gif
│ │ ├── lily.png
│ │ ├── makeafish.png
│ │ ├── mat.png
│ │ ├── matrix.png
│ │ ├── mudkip.png
│ │ ├── nap.gif
│ │ ├── netscape.gif
│ │ ├── notnite.png
│ │ ├── patsore.png
│ │ ├── pineapplecat.png
│ │ ├── rudrecciah.png
│ │ ├── sandcat.png
│ │ ├── seized.gif
│ │ ├── shwecky.png
│ │ ├── sipacid.gif
│ │ ├── slonk.png
│ │ ├── ssi.gif
│ │ ├── thunderbird.gif
│ │ ├── tor.gif
│ │ ├── ublockorigin.png
│ │ ├── vscode.gif
│ │ ├── yui.gif
│ │ └── zeroptr.png
│ ├── comicsans.ttf
│ ├── oneko.gif
│ ├── pressstart2p.ttf
│ └── purple4.gif
├── robots.txt
├── security.txt
├── stake-ad.png
├── wp-admin
│ ├── css
│ │ ├── forms.min.css
│ │ └── login.min.css
│ └── images
│ │ ├── w-logo-blue.png
│ │ └── wordpress-logo.svg
├── wp-includes
│ └── css
│ │ └── buttons.min.css
└── wp-login.php.html
├── svelte.config.js
├── tsconfig.json
├── vercel.json
├── vite.config.js
└── yarn.lock
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | parser: '@typescript-eslint/parser',
4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
5 | plugins: ['svelte3', '@typescript-eslint'],
6 | ignorePatterns: ['*.cjs'],
7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
8 | settings: {
9 | 'svelte3/typescript': () => require('typescript'),
10 | },
11 | parserOptions: {
12 | sourceType: 'module',
13 | ecmaVersion: 2020,
14 | },
15 | env: {
16 | browser: true,
17 | es2020: true,
18 | es2022: true,
19 | node: true,
20 | },
21 | rules: {
22 | '@typescript-eslint/no-non-null-assertion': 'off',
23 | '@typescript-eslint/no-explicit-any': 'off',
24 | '@typescript-eslint/ban-types': 'off',
25 | },
26 | }
27 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | /.upm
8 | /.config
9 | /.cache
10 | yarn-error.log
11 |
12 | vite.config.js.*
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | tasks:
2 | - init: yarn install && yarn run build
3 | command: yarn run dev:host
4 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | v16.14.0
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "singleQuote": true,
4 | "trailingComma": "es5",
5 | "printWidth": 100,
6 | "semi": false
7 | }
8 |
--------------------------------------------------------------------------------
/.replit:
--------------------------------------------------------------------------------
1 | run = "yarn; npm run dev:host"
2 |
3 | [packager]
4 | language = "nodejs"
5 |
6 | [packager.features]
7 | packageSearch = true
8 | guessImports = false
9 |
10 | [languages.svelte]
11 | pattern = "**/*.svelte"
12 | syntax = "svelte"
13 |
14 | [languages.svelte.languageServer]
15 | command = ["svelteserver", "--stdio"]
16 |
17 | [languages.javascript]
18 | pattern = "**/*.js"
19 | syntax = "javascript"
20 |
21 | [languages.javascript.languageServer]
22 | start = [ "typescript-language-server", "--stdio" ]
23 |
24 | [languages.typescript]
25 | pattern = "**/*.ts"
26 | syntax = "typescript"
27 |
28 | [languages.typescript.languageServer]
29 | start = [ "typescript-language-server", "--stdio" ]
30 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.defaultFormatter": "esbenp.prettier-vscode",
3 | "editor.formatOnSave": true,
4 | "[typescript]": {
5 | "editor.defaultFormatter": "esbenp.prettier-vscode"
6 | },
7 | "files.associations": { "*.svx": "markdown" }
8 | }
9 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "label": "Dev",
6 | "type": "shell",
7 | "command": "yarn dev",
8 | "group": "none",
9 | "presentation": {
10 | "reveal": "always",
11 | "panel": "new"
12 | },
13 | "runOptions": {
14 | "runOn": "folderOpen"
15 | }
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/.yarn/install-state.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/.yarn/install-state.gz
--------------------------------------------------------------------------------
/.yarn/patches/mdsvex-npm-0.12.3-11596b7ddc.patch:
--------------------------------------------------------------------------------
1 | diff --git a/dist/main.cjs b/dist/main.cjs
2 | index b62811839cec4195e00e32bbedc3ae737f93e558..c7405c089034edb708ebf46028c9fbd62fc7dbf5 100644
3 | --- a/dist/main.cjs
4 | +++ b/dist/main.cjs
5 | @@ -6423,6 +6423,10 @@ function parse$6(value, settings) {
6 |
7 | namedEntity = type === name$1 ? decodeEntity(characters) : false;
8 |
9 | + // QUICKFIX https://github.com/pngwn/MDsveX/issues/296
10 | + if (namedEntity == '<') namedEntity = '<';
11 | + if (namedEntity == '>') namedEntity = '>';
12 | +
13 | if (namedEntity) {
14 | entityCharacters = characters;
15 | entity = namedEntity;
16 | diff --git a/dist/main.mjs b/dist/main.mjs
17 | index eff3198639f55dd9f1dec8909a79aa04994c87f3..03aa401ba6ce32c20432c11314a3ff50d3f37e25 100644
18 | --- a/dist/main.mjs
19 | +++ b/dist/main.mjs
20 | @@ -6402,6 +6402,10 @@ function parse$6(value, settings) {
21 |
22 | namedEntity = type === name$1 ? decodeEntity(characters) : false;
23 |
24 | + // QUICKFIX https://github.com/pngwn/MDsveX/issues/296
25 | + if (namedEntity == '<') namedEntity = '<';
26 | + if (namedEntity == '>') namedEntity = '>';
27 | +
28 | if (namedEntity) {
29 | entityCharacters = characters;
30 | entity = namedEntity;
31 |
--------------------------------------------------------------------------------
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # matdoes.dev
2 |
3 | The source code for my portfolio website at [matdoes.dev](https://matdoes.dev). Also see [matdoesdev-protocols](https://github.com/mat-1/matdoesdev-protocols) for the code that adds support for other protocols like Gemini and SSH.
4 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "matdoesdev",
3 | "version": "0.0.1",
4 | "license": "MIT",
5 | "scripts": {
6 | "dev": "vite dev",
7 | "dev:host": "vite dev --host",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "check": "svelte-check --tsconfig ./tsconfig.json",
11 | "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
12 | "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
13 | "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
14 | },
15 | "devDependencies": {
16 | "@img/sharp-linux-x64": "^0.33.5",
17 | "@sveltejs/vite-plugin-svelte": "^5.0.3",
18 | "@types/cookie": "^1.0.0",
19 | "@types/html-minifier": "^4.0.5",
20 | "@types/matter-js": "^0.19.8",
21 | "@types/turndown": "^5.0.5",
22 | "@typescript-eslint/eslint-plugin": "^8.26.1",
23 | "@typescript-eslint/parser": "^8.26.1",
24 | "eslint": "^9.22.0",
25 | "eslint-config-prettier": "^10.1.1",
26 | "mdsvex": "patch:mdsvex@npm%3A0.12.3#~/.yarn/patches/mdsvex-npm-0.12.3-11596b7ddc.patch",
27 | "prettier": "^3.5.3",
28 | "prettier-plugin-svelte": "^3.3.3",
29 | "sharp": "^0.33.5",
30 | "svelte": "^5.23.0",
31 | "svelte-check": "^4.1.5",
32 | "svelte-preprocess": "^6.0.3",
33 | "tslib": "^2.8.1",
34 | "typescript": "^5.8.2"
35 | },
36 | "type": "module",
37 | "dependencies": {
38 | "@lukeed/uuid": "^2.0.1",
39 | "@sveltejs/adapter-node": "^5.2.12",
40 | "@sveltejs/adapter-static": "^3.0.8",
41 | "@sveltejs/kit": "^2.19.1",
42 | "@types/js-yaml": "^4.0.9",
43 | "cbor-x": "^1.6.0",
44 | "cookie": "^1.0.2",
45 | "html-minifier": "^4.0.0",
46 | "matter-js": "^0.20.0",
47 | "postinstall-postinstall": "^2.1.0",
48 | "svelte-body": "^2.0.0",
49 | "turndown": "^7.2.0",
50 | "vite": "6.2.2"
51 | },
52 | "engines": {
53 | "node": ">=16"
54 | },
55 | "packageManager": "yarn@4.5.0"
56 | }
57 |
--------------------------------------------------------------------------------
/replit.nix:
--------------------------------------------------------------------------------
1 | { pkgs }: {
2 | deps = with pkgs; [
3 | nodejs-16_x
4 | nodePackages.typescript-language-server
5 | nodePackages.svelte-language-server
6 | yarn
7 | ];
8 | }
--------------------------------------------------------------------------------
/src/app.css:
--------------------------------------------------------------------------------
1 | @import '$lib/atkinson-hyperlegible.css';
2 |
3 | :root {
4 | --background-color: #010502;
5 | /* used for gradients */
6 | --background-color-transparent: #01050200;
7 |
8 | --background-color-alt: #111;
9 | --background-color-alt-2: #222;
10 | --background-color-alt-3: #333;
11 |
12 | --text-color: #f7f4f4;
13 | --text-color-alt: #ddd;
14 | --text-color-alt-2: #bbb;
15 | --text-color-alt-3: #999;
16 |
17 | --accent-color: #0dc7f9;
18 |
19 | --warning-color: #e6b450;
20 | --error-color: #d95757;
21 | --green: #aad94c;
22 |
23 | --text-font: 'Atkinson Hyperlegible', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
24 | }
25 |
26 | *,
27 | *:before,
28 | *:after {
29 | box-sizing: border-box;
30 | }
31 |
32 | html,
33 | body,
34 | #page {
35 | height: 100%;
36 | width: 100%;
37 | scroll-behavior: smooth;
38 | }
39 |
40 | body {
41 | background-color: var(--background-color);
42 | color: var(--text-color);
43 | font-family: var(--text-font);
44 | margin: 0;
45 | }
46 |
47 | button,
48 | .button {
49 | background-color: var(--background-color-alt);
50 | border: 1px solid var(--background-color-alt-3);
51 | color: var(--text-color);
52 | font-size: inherit;
53 | border-radius: 0.25em;
54 | padding: 0.2em 0.6em;
55 | cursor: pointer;
56 | font-family: inherit;
57 | box-shadow: 0 0.1em 0.2em #000;
58 | text-decoration: none;
59 | transition: background-color 200ms;
60 | }
61 | button:hover,
62 | .button:hover {
63 | background-color: var(--background-color-alt-2);
64 | }
65 |
66 | p {
67 | margin-top: 0;
68 | }
69 |
70 | a {
71 | color: var(--accent-color);
72 | fill: var(--accent-color);
73 | }
74 |
75 | .center {
76 | width: fit-content;
77 | margin: 0 auto;
78 | }
79 |
80 | hr {
81 | background-color: var(--background-color-alt);
82 | border-color: var(--background-color-alt);
83 | width: 90%;
84 | margin: 1rem auto;
85 | }
86 |
87 | img {
88 | max-height: 100%;
89 | }
90 |
91 | pre {
92 | white-space: pre-wrap;
93 | }
94 | .token.keyword {
95 | color: #ff8f40;
96 | }
97 | .token.function,
98 | .token.builtin {
99 | color: #ffb454;
100 | }
101 | .token.number {
102 | color: #d2a6ff;
103 | }
104 | .token.string {
105 | color: #aad94c;
106 | }
107 |
108 | body.light-theme,
109 | body.extra-light-theme {
110 | --background-color: #fff;
111 | --background-color-transparent: #fff0;
112 | --background-color-alt: #f7f7f7;
113 | --background-color-alt-2: #eee;
114 | --background-color-alt-3: #ddd;
115 |
116 | --text-color: #000;
117 | --text-color-alt: #333;
118 | --text-color-alt-2: #666;
119 | --text-color-alt-3: #999;
120 | }
121 | body.extra-light-theme {
122 | filter: brightness(1) opacity(0.1);
123 | }
124 | body.extra-dark-theme {
125 | background-color: #000;
126 | filter: brightness(0.1);
127 | }
128 |
129 | body.sandcat-mode {
130 | --background-color: transparent;
131 | --background-color-alt: #0006;
132 | }
133 |
--------------------------------------------------------------------------------
/src/app.d.ts:
--------------------------------------------------------------------------------
1 | declare namespace App {
2 | // interface Locals {}
3 | // interface Platform {}
4 | // interface PrivateEnv {}
5 | // interface PublicEnv {}
6 | }
7 |
--------------------------------------------------------------------------------
/src/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | %sveltekit.head%
10 |
11 |
12 |
13 | %sveltekit.body%
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/global.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/hooks.server.ts:
--------------------------------------------------------------------------------
1 | import type { Handle } from '@sveltejs/kit'
2 |
3 | export const handle: Handle = async ({ event, resolve }) => {
4 | if (event.url.pathname.startsWith('/retro')) {
5 | return resolve(event, {
6 | transformPageChunk: ({ html }) =>
7 | html.replace(
8 | '',
9 | ``
15 | ),
16 | })
17 | }
18 |
19 | return await resolve(event)
20 | }
21 |
22 | // export async function handle({ event, resolve }) {
23 | // return resolve(event, {
24 | // transformPage: ({ html }) =>
25 | // html.replace(
26 | // '%bodyfields%',
27 | // `bgcolor="#000000"
28 | // background="/retro/background.gif"
29 | // text="#ffffff"
30 | // link="#ffffff"
31 | // alink="#ffffff"
32 | // vlink="#ffffff"`
33 | // ),
34 | // })
35 | // }
36 |
--------------------------------------------------------------------------------
/src/lib/98/ms_sans_serif.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/98/ms_sans_serif.woff2
--------------------------------------------------------------------------------
/src/lib/98/ms_sans_serif_bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/98/ms_sans_serif_bold.woff2
--------------------------------------------------------------------------------
/src/lib/BackAnchor.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | ← {#if href === '/'}Home{:else}Back{/if}
11 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/src/lib/ButtonRow.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 | {@render children?.()}
13 |
14 |
15 |
23 |
--------------------------------------------------------------------------------
/src/lib/Head.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 | {title}
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/lib/Icon/GitHub.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/Icon/Icon.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 | {@render children?.()}
12 |
13 |
14 |
30 |
--------------------------------------------------------------------------------
/src/lib/Icon/JavaScript.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/lib/Icon/Kofi.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/Icon/Matrix.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | m
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/Icon/Python.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/Icon/Rust.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/Icon/TypeScript.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/lib/IconButtonRow.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 | {@render children?.()}
15 |
16 |
17 |
18 |
23 |
--------------------------------------------------------------------------------
/src/lib/LoadingDots.svelte:
--------------------------------------------------------------------------------
1 |
2 |
12 |
22 |
32 |
33 |
34 |
42 |
--------------------------------------------------------------------------------
/src/lib/PostLayout.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
21 |
22 |
23 | {title}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
{title}
32 | {#if subtitle}
33 |
{subtitle}
34 | {/if}
35 |
{new Date(published).toLocaleDateString()}
36 |
37 |
38 | {@render children?.()}
39 |
40 |
41 |
42 |
100 |
--------------------------------------------------------------------------------
/src/lib/PostPreview.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
{post.title}
17 | {new Date(post.published).toLocaleDateString()}
18 |
19 |
20 |
21 |
22 | {@html postHtml}
23 |
24 |
25 |
26 |
27 |
76 |
--------------------------------------------------------------------------------
/src/lib/Project.svelte:
--------------------------------------------------------------------------------
1 |
41 |
42 |
43 |
46 |
82 | {#if nextId}
83 |
↓ Next
84 | {/if}
85 |
86 |
87 |
147 |
--------------------------------------------------------------------------------
/src/lib/atkinson-hyperlegible.css:
--------------------------------------------------------------------------------
1 | /* latin-ext */
2 | @font-face {
3 | font-family: 'Atkinson Hyperlegible';
4 | font-style: italic;
5 | font-weight: 400;
6 | font-display: swap;
7 | src: url($lib/fonts/atkinson-hyperlegible/latin-ext-italic.woff2) format('woff2');
8 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
9 | U+2C60-2C7F, U+A720-A7FF;
10 | }
11 | /* latin */
12 | @font-face {
13 | font-family: 'Atkinson Hyperlegible';
14 | font-style: italic;
15 | font-weight: 400;
16 | font-display: swap;
17 | src: url($lib/fonts/atkinson-hyperlegible/latin-italic.woff2) format('woff2');
18 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F,
19 | U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
20 | }
21 | /* latin-ext */
22 | @font-face {
23 | font-family: 'Atkinson Hyperlegible';
24 | font-style: italic;
25 | font-weight: 700;
26 | font-display: swap;
27 | src: url($lib/fonts/atkinson-hyperlegible/latin-ext-italic-bold.woff2) format('woff2');
28 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
29 | U+2C60-2C7F, U+A720-A7FF;
30 | }
31 | /* latin */
32 | @font-face {
33 | font-family: 'Atkinson Hyperlegible';
34 | font-style: italic;
35 | font-weight: 700;
36 | font-display: swap;
37 | src: url($lib/fonts/atkinson-hyperlegible/latin-italic-bold.woff2) format('woff2');
38 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F,
39 | U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
40 | }
41 | /* latin-ext */
42 | @font-face {
43 | font-family: 'Atkinson Hyperlegible';
44 | font-style: normal;
45 | font-weight: 400;
46 | font-display: swap;
47 | src: url($lib/fonts/atkinson-hyperlegible/latin-ext-italic-bold.woff2) format('woff2');
48 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
49 | U+2C60-2C7F, U+A720-A7FF;
50 | }
51 | /* latin */
52 | @font-face {
53 | font-family: 'Atkinson Hyperlegible';
54 | font-style: normal;
55 | font-weight: 400;
56 | font-display: swap;
57 | src: url($lib/fonts/atkinson-hyperlegible/latin.woff2) format('woff2');
58 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F,
59 | U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
60 | }
61 | /* latin-ext */
62 | @font-face {
63 | font-family: 'Atkinson Hyperlegible';
64 | font-style: normal;
65 | font-weight: 700;
66 | font-display: swap;
67 | src: url($lib/fonts/atkinson-hyperlegible/latin-ext-bold.woff2) format('woff2');
68 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
69 | U+2C60-2C7F, U+A720-A7FF;
70 | }
71 | /* latin */
72 | @font-face {
73 | font-family: 'Atkinson Hyperlegible';
74 | font-style: normal;
75 | font-weight: 700;
76 | font-display: swap;
77 | src: url($lib/fonts/atkinson-hyperlegible/latin-bold.woff2) format('woff2');
78 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F,
79 | U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
80 | }
81 |
--------------------------------------------------------------------------------
/src/lib/blog.ts:
--------------------------------------------------------------------------------
1 | import path from 'path'
2 | import fs from 'fs'
3 | import { render } from 'svelte/server'
4 |
5 | export const postsDir = 'src/routes/(blog)' as const
6 |
7 | export async function listBlogPostSlugs(): Promise {
8 | await fs.promises.readdir(postsDir)
9 |
10 | const existingPosts: string[] = await fs.promises.readdir(postsDir)
11 |
12 | // https://stackoverflow.com/a/46842181
13 | async function filter(arr: T[], callback: (item: T) => Promise): Promise {
14 | const fail = Symbol()
15 | return (
16 | await Promise.all(arr.map(async (item) => ((await callback(item)) ? item : fail)))
17 | ).filter((i) => i !== fail) as any
18 | }
19 |
20 | return await filter(existingPosts, (slug) =>
21 | fs.promises
22 | .stat(path.join(postsDir, slug, 'index.svx'))
23 | .then(() => true)
24 | .catch(() => false)
25 | )
26 | }
27 |
28 | export interface BlogPost {
29 | title: string
30 | subtitle: string | undefined
31 | published: string
32 | html: string
33 | css: string
34 | slug: string
35 | }
36 |
37 | /** Checks whether a slug is valid or not */
38 | async function doesBlogPostExist(slug: string) {
39 | const existingPosts: string[] = await fs.promises.readdir(postsDir)
40 | if (!existingPosts.includes(slug)) return false
41 | return true
42 | }
43 |
44 | /** Checks whether an asset exists in a blog post */
45 | export async function doesAssetExist(postSlug: string, assetName: string): Promise {
46 | // return false if the blog post doesn't exist
47 | if (!(await doesBlogPostExist(postSlug))) return false
48 |
49 | const existingAssets: string[] = await fs.promises.readdir(path.join(postsDir, postSlug))
50 |
51 | return existingAssets.includes(assetName)
52 | }
53 |
54 | /** Get a blog post by the slug, returning null if it doesn't exist */
55 | export async function getPost(slug: string): Promise {
56 | if (!doesBlogPostExist(slug)) return null
57 |
58 | const url = new URL(`protocol://-/${slug}`)
59 |
60 | const { default: post, metadata } = await import(`../routes/(blog)/${slug}/index.svx`)
61 |
62 | const result: {
63 | title: string
64 | subtitle: string | undefined
65 | head: string
66 | css: Set<{
67 | map: null
68 | code: string
69 | }>
70 | } = { title: '', subtitle: undefined, head: '', css: new Set() }
71 |
72 | const renderHtml = render(post, {
73 | props: result,
74 | context: new Map([
75 | [
76 | '__svelte__',
77 | {
78 | page: {
79 | // this is necessary so the page.subscribe calls in
80 | // img.svelte don't error for calling page.subscribe
81 | // outside of a component
82 | subscribe: (r: any) => {
83 | r({ url })
84 | },
85 | },
86 | navigating: {
87 | subscribe: () => {
88 | return
89 | },
90 | },
91 | },
92 | ],
93 | ]),
94 | })
95 | // console.log('renderHtml', renderHtml)
96 |
97 | // HACK: sveltekit adds garbage around the content, we just want what's in the article tag
98 | let html = /([\w\W]+)(?:)<\/article>/.exec(renderHtml.body)?.[1] ?? ''
99 | // sveltekit also adds random empty comments like "", we don't want those
100 | html = html.replace(//g, '')
101 |
102 | const css = Array.from(result.css)
103 | .map((css) => css.code)
104 | .join('')
105 |
106 | return {
107 | title: metadata.title,
108 | subtitle: metadata.subtitle || undefined,
109 | published: new Date(metadata.published).toISOString(),
110 | html,
111 | css,
112 | slug,
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/src/lib/components/img.svelte:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-bold.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-ext-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-ext-bold.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-ext-italic-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-ext-italic-bold.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-ext-italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-ext-italic.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-ext.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-ext.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-italic-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-italic-bold.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin-italic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin-italic.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/atkinson-hyperlegible/latin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/atkinson-hyperlegible/latin.woff2
--------------------------------------------------------------------------------
/src/lib/fonts/minecraft.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/fonts/minecraft.otf
--------------------------------------------------------------------------------
/src/lib/gravity/explosion.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/gravity/explosion.gif
--------------------------------------------------------------------------------
/src/lib/gravity/index.ts:
--------------------------------------------------------------------------------
1 | import Matter from 'matter-js'
2 | import music from './oneshot-my-burden-is-light.mp3'
3 | import explosionSFX from './nuclear-bomb-sound-effect.mp3'
4 | import explosionImage from './explosion.gif'
5 |
6 | const GRAVITY_QUERY_SELECTOR = 'p, h1, h2, .button, .icon'
7 |
8 | let started = false
9 |
10 | export function initGravity(): () => void {
11 | const { Engine, Bodies, Composite, Runner, Mouse, MouseConstraint } = Matter
12 |
13 | if (!started) {
14 | started = true
15 |
16 | // play explosion gif
17 | const explosionEl = document.createElement('img')
18 | explosionEl.src = explosionImage
19 | explosionEl.style.position = 'fixed'
20 | explosionEl.style.left = '0'
21 | explosionEl.style.top = '0'
22 | explosionEl.style.width = '100%'
23 | explosionEl.style.height = '100%'
24 | explosionEl.style.zIndex = '1000000'
25 | document.body.appendChild(explosionEl)
26 | // remove after 1.7 seconds
27 | explosionEl.onload = () => {
28 | setTimeout(() => {
29 | document.body.removeChild(explosionEl)
30 | }, 1700)
31 | }
32 |
33 | const explosionAudio = new Audio(explosionSFX)
34 | explosionAudio.volume = 0.5
35 | explosionAudio.play()
36 |
37 | const musicAudio = new Audio(music)
38 | musicAudio.volume = 0.1
39 | musicAudio.loop = true
40 | musicAudio.play()
41 | }
42 |
43 | console.log('gravity enabled')
44 |
45 | const pageEl = document.getElementById('page')
46 | if (pageEl) pageEl.style.overflow = 'hidden'
47 |
48 | // create an engine
49 | const engine = Engine.create({ enableSleeping: true })
50 |
51 | const floorBody = Bodies.rectangle(
52 | window.innerWidth / 2,
53 | window.innerHeight + 50,
54 | window.innerWidth,
55 | 100,
56 | {
57 | isStatic: true,
58 | }
59 | )
60 | const rightWallBody = Bodies.rectangle(
61 | window.innerWidth + 50,
62 | window.innerHeight / 2,
63 | 100,
64 | window.innerHeight,
65 | {
66 | isStatic: true,
67 | }
68 | )
69 | const leftWallBody = Bodies.rectangle(-50, window.innerHeight / 2, 100, window.innerHeight, {
70 | isStatic: true,
71 | })
72 | const ceilingBody = Bodies.rectangle(window.innerWidth / 2, -50, window.innerWidth, 100, {
73 | isStatic: true,
74 | })
75 | Composite.add(engine.world, [floorBody, rightWallBody, leftWallBody, ceilingBody])
76 |
77 | const trackedElements = new Map()
78 |
79 | async function enableGravityOnElement(el: HTMLElement) {
80 | await new Promise((resolve) => requestAnimationFrame(resolve))
81 |
82 | let originalTextContent: string | null = null
83 | if (el.classList.contains('copyright') || el.id === 'main-title') {
84 | el.style.width = 'fit-content'
85 | el.style.margin = '0 auto'
86 | if (el.id === 'main-title') {
87 | originalTextContent = el.textContent
88 | el.textContent = 'matdoesdev'
89 | }
90 | }
91 | const bb = el.getBoundingClientRect()
92 | if (originalTextContent) el.textContent = originalTextContent
93 |
94 | const body = Bodies.rectangle(
95 | bb.left + bb.width / 2,
96 | bb.top + bb.height / 2,
97 | bb.width,
98 | bb.height,
99 | { restitution: 1 }
100 | )
101 | el.style.position = 'absolute'
102 | el.style.left = bb.left + 'px'
103 | el.style.top = bb.top + 'px'
104 | el.style.width = bb.width + 'px'
105 | el.style.height = bb.height + 'px'
106 | el.style.userSelect = 'none'
107 | // el.style.outline = '1px solid red'
108 |
109 | Composite.add(engine.world, [body])
110 | trackedElements.set(el, body)
111 | }
112 |
113 | function makeAnchorUndraggable(el: HTMLAnchorElement) {
114 | // el.style.pointerEvents = 'none'
115 | // el.style.cursor = 'pointer'
116 | el.draggable = false
117 |
118 | // document.addEventListener('click', (e) => {
119 | // el.style.pointerEvents = ''
120 | // const clickedEl = document.elementFromPoint(e.clientX, e.clientY)
121 | // el.style.pointerEvents = 'none'
122 | // // if (clickedEl instanceof HTMLAnchorElement) {
123 | // // e.preventDefault()
124 | // // goto(clickedEl.href)
125 | // // }
126 | // if (el.contains(clickedEl)) {
127 | // e.preventDefault()
128 | // const url = new URL(el.href)
129 | // if (url.origin === window.location.origin) {
130 | // goto(el.href)
131 | // } else {
132 | // window.location.href = el.href
133 | // }
134 | // }
135 | // })
136 | }
137 |
138 | document.querySelectorAll(GRAVITY_QUERY_SELECTOR).forEach((el) => {
139 | enableGravityOnElement(el as HTMLElement)
140 | })
141 | document.querySelectorAll('a').forEach((el) => {
142 | makeAnchorUndraggable(el as HTMLAnchorElement)
143 | })
144 |
145 | // update positions every frame
146 | Matter.Events.on(engine, 'beforeUpdate', function (event) {
147 | trackedElements.forEach((body, el) => {
148 | if (body.position.y < 0) {
149 | // move up
150 | body.position.y = window.innerHeight
151 | }
152 |
153 | el.style.left = body.position.x - el.offsetWidth / 2 + 'px'
154 | el.style.top = body.position.y - el.offsetHeight / 2 + 'px'
155 | el.style.transform = `rotate(${body.angle}rad)`
156 |
157 | // rotate
158 | // el.style.transform = ''
159 |
160 | // const [originalWidthStyle, originalHeightStyle] = [el.style.width, el.style.height]
161 | // el.style.maxWidth = originalWidthStyle
162 | // el.style.maxHeight = originalHeightStyle
163 | // el.style.width = ''
164 | // el.style.height = ''
165 | // const bb = el.getBoundingClientRect()
166 | // el.style.transform = `rotate(${body.angle}rad)`
167 | // el.style.width = originalWidthStyle
168 | // el.style.height = originalHeightStyle
169 | // el.style.maxWidth = ''
170 | // el.style.maxHeight = ''
171 |
172 | // const fakeBody = Bodies.rectangle(
173 | // bb.left + bb.width / 2,
174 | // bb.top + bb.height / 2,
175 | // bb.width,
176 | // bb.height,
177 | // {
178 | // angle: body.angle,
179 | // }
180 | // )
181 | // body.vertices = fakeBody.vertices
182 | })
183 | })
184 |
185 | // create runner
186 | const runner = Runner.create()
187 |
188 | // run the engine
189 | Runner.run(runner, engine)
190 |
191 | // add mouse control
192 | var mouse = Mouse.create(document.body),
193 | mouseConstraint = MouseConstraint.create(engine, {
194 | mouse: mouse,
195 | constraint: {
196 | stiffness: 0.2,
197 | render: {
198 | visible: false,
199 | },
200 | },
201 | })
202 | Composite.add(engine.world, mouseConstraint)
203 |
204 | console.log('running engine')
205 |
206 | return () => {
207 | Runner.stop(runner)
208 | }
209 | }
210 |
--------------------------------------------------------------------------------
/src/lib/gravity/nuclear-bomb-sound-effect.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/gravity/nuclear-bomb-sound-effect.mp3
--------------------------------------------------------------------------------
/src/lib/gravity/oneshot-my-burden-is-light.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/lib/gravity/oneshot-my-burden-is-light.mp3
--------------------------------------------------------------------------------
/src/lib/stake-ad.ts:
--------------------------------------------------------------------------------
1 | let loaded = false
2 |
3 | export function load() {
4 | if (loaded) return
5 | loaded = true
6 |
7 | // add an to the page
8 | const img = document.createElement('img')
9 | img.src = '/stake-ad.png'
10 | img.style.position = 'fixed'
11 | img.style.bottom = '0'
12 | img.style.right = '0'
13 | img.style.maxWidth = '100%'
14 | img.style.zIndex = '9999'
15 | document.body.appendChild(img)
16 | }
17 |
--------------------------------------------------------------------------------
/src/lib/types.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Can be made globally available by placing this
3 | * inside `global.d.ts` and removing `export` keyword
4 | */
5 | export interface Locals {
6 | userid: string
7 | }
8 |
--------------------------------------------------------------------------------
/src/routes/(blog)/matdoes-dev-markdown/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: matdoes.dev markdown
3 | published: 2021-03-24T05:53:14.373+00:00
4 | ---
5 |
6 |
7 | This post is outdated, I rewrote my website to use
mdsvex .
8 |
9 |
10 | A couple years ago when I was creating the matdoes.dev blog I wrote a somewhat powerful markdown system with Regex to allow me to more easily write blog posts. Although I've barely written any posts, I'm still proud of it. Also this post is mostly just reference for myself, lol.
11 | I present: matdown™
12 |
13 | ---
14 |
15 | Relative anchor: `[matdoesdev](/blog)` [matdoesdev](/blog)
16 |
17 | External anchor: `[matdoesdev](https://matdoes.dev)` [matdoesdev](https://matdoes.dev)
18 | (External anchors have target=\_blank so they open in new pages)
19 |
20 | Normal links: `https://matdoes.dev` https://matdoes.dev
21 |
22 | Code block: \`\`\`py
23 | print('code')
24 | \`\`\`
25 |
26 | ```py
27 | print('code')
28 | ```
29 |
30 | Inline code: `` `code` `` `code`
31 |
32 | Block quote: `> text`
33 |
34 | > text
35 |
36 | Italic: \*text\* _text_
37 | Bold: \*\*text\*\* **text**
38 | Italic & bold: \*\*\*text\*\*\* **_text_**
39 |
40 | Horizontal center: `||text||`
41 | ||text||
42 |
43 | Titles:
44 | \# h2
45 | \#\# h3
46 | \#\#\# h4
47 | \#\#\#\# h5
48 | \#\#\#\#\# h6
49 | \#\#\#\#\#\# h6
50 |
51 | # h2
52 |
53 | ## h3
54 |
55 | ### h4
56 |
57 | #### h5
58 |
59 | ##### h6
60 |
61 | ###### h6
62 |
63 | ## Horizontal rule: \-\-\-
64 |
65 | Image:
66 | !\[description](https://image)
67 |
--------------------------------------------------------------------------------
/src/routes/(blog)/matscan/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Why did "matscan" join my Minecraft server? (FAQ)
3 | published: 2023-05-29T02:48:09.000Z
4 | ---
5 |
6 | matscan is a Minecraft bot that joins potentially vulnerable Minecraft servers and sends a message in chat to inform the admins.
7 |
8 | # How should I secure my server?
9 |
10 | It should've told you in its long chat message but some servers might cut it off:
11 |
12 | - If the server was meant to be private then enable a whitelist.
13 | - If the server is offline-mode then enable online-mode in the server.properties or install a plugin such as [AuthMe](https://dev.bukkit.org/projects/authme-reloaded).
14 | - If the server has an exposed BungeeCord backend, firewall it, install [BungeeGuard](https://www.spigotmc.org/resources/bungeeguard.79601/), or switch to [Velocity](https://papermc.io/software/velocity).
15 | - Enable backups or install a plugin like [CoreProtect](https://www.spigotmc.org/resources/coreprotect.8631/).
16 |
17 | If you've done all of the above, then you're probably fine.
18 |
19 | # How did you find my server?
20 |
21 | I scan the internet for Minecraft servers, basically sending a packet to every IP address and seeing which ones respond (it's a little more complex than this).
22 |
23 | # Is your data public?
24 |
25 | No. You should still secure your server though since there are several griefing/harassment groups that use their own server scanners.
26 |
27 | # Why did Herobrine try to join right before matscan?
28 |
29 | matscan will try to join with the username Herobrine first, so if the server is offline-mode then it can demonstrate that people can join with any username. It may also use the username of a historical player if the server is offline-mode but has a whitelist.
30 |
31 | # What IP does matscan join from?
32 |
33 | The bot will exclusively join from the IP address `151.115.73.107`. This page will be updated if it ever changes in the future.
34 |
35 | # How can I contact you?
36 |
37 | My Matrix is [@mat:matdoes.dev](https://matrix.to/#/@mat:matdoes.dev) (preferred), but you might be able to find me on other social medias.
38 |
39 | # How can I help?
40 |
41 | If you appreciate the security work I do, please consider funding my projects at [ko-fi.com/matdoesdev](https://ko-fi.com/matdoesdev).
42 |
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/google-result-html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/google-result-html.png
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/kagi-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/kagi-results.png
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/metasearch2-calc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/metasearch2-calc.png
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/metasearch2-progress-display.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/metasearch2-progress-display.png
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/metasearch2-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/metasearch2-results.png
--------------------------------------------------------------------------------
/src/routes/(blog)/metasearch/searxng-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/metasearch/searxng-results.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/RandomServers.svelte:
--------------------------------------------------------------------------------
1 |
32 |
33 |
34 | {#if servers}Next{:else}Show{/if}
35 |
36 |
37 | {#if servers}
38 | {#key index}
39 |
40 |
41 |
42 | {/key}
43 | {:else if loading}
44 |
45 |
46 |
47 | {/if}
48 |
49 |
50 |
67 |
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/Server.svelte:
--------------------------------------------------------------------------------
1 |
29 |
30 |
31 |
32 |
33 | {data.players.online}/ {data.players.max}
34 |
35 |
36 |
37 | {#if data.onlineMode === false}
38 | [offline mode]
39 | {/if}
40 | {displayIp} ({data.version.name})
41 |
42 |
{data.description}
43 |
44 |
45 |
92 |
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/home.jpg
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/honeypot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/honeypot.jpg
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/linode-ticket.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/linode-ticket.jpg
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/minecraft-server-background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/minecraft-server-background.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/potato.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/potato.jpg
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-scanning/signs.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-scanning/signs.jpg
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/BarChart.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 | {#each data as [label, value, valueHtml], i}
28 |
35 |
36 | {label}
37 |
38 |
45 | {#if valueHtml}
46 | {@html valueHtml}
47 | {:else}
48 | {abbreviateNumber(value)}
49 | {/if}
50 |
51 | {/each}
52 |
53 |
54 |
55 |
65 |
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/UserSearch.svelte:
--------------------------------------------------------------------------------
1 |
132 |
133 |
134 | This doesn't work without JavaScript, sorry...
135 |
140 |
141 |
142 |
143 |
144 |
145 | {#if $query === ''}
146 |
147 | {:else if currentSearch !== null}
148 |
149 | {:else}
150 | {#if $query.length >= 3}
151 |
152 | {#if $searchResults.length === 1}
153 | 1 result
154 | {:else}
155 | {$searchResults.length.toLocaleString()} results
156 | {/if}
157 |
158 | {/if}
159 | {#if $searchResults.length > 0}
160 |
161 | {#each $searchResults.slice(0, 100) as result}
162 | {@const startIndex = result.toLowerCase().indexOf($query.toLowerCase())}
163 | {@const endIndex = startIndex + $query.length}
164 | {@const before = result.slice(0, startIndex)}
165 | {@const match = result.slice(startIndex, endIndex)}
166 | {@const after = result.slice(endIndex)}
167 |
168 | {before}{match} {after}
169 |
170 | {/each}
171 |
172 | {/if}
173 | {#if $query.length >= 3}
174 | {#if $searchResults.length > 100}
175 |
176 | ... and {($searchResults.length - 100).toLocaleString()} more
177 |
178 | {/if}
179 | {:else if $searchResults.length > 0}
180 |
...
181 | {:else}
182 |
0 results
183 | {/if}
184 | {/if}
185 |
186 |
187 |
188 |
229 |
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/hurricane-electric-example-configurations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/hurricane-electric-example-configurations.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/hypixel-forums-deleted-post.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/hypixel-forums-deleted-post.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/namemc-captcha-clicking.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/namemc-captcha-clicking.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/namemc-wildcard-scraping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/namemc-wildcard-scraping.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/northernside-32m.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/northernside-32m.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/wiki-vg-uuid-endpoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/wiki-vg-uuid-endpoint.png
--------------------------------------------------------------------------------
/src/routes/(blog)/minecraft-uuids/yuno-55m.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/minecraft-uuids/yuno-55m.png
--------------------------------------------------------------------------------
/src/routes/(blog)/the-story-of-reportscammers/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: The Story of ReportScammers
3 | published: 2021-03-24T05:33:23.836+00:00
4 | ---
5 |
6 | I wrote this story on the Hypixel Forums a while ago, but I realized it would be a good idea if I posted it on my blog too.
7 |
8 | # Intro
9 |
10 | ReportScammers was a robot on the Hypixel SkyBlock Forums that automatically replied to posts where people were complaining that they got scammed.
11 | It all started on April 27th, 2020. I was bored and wanted to make a Hypixel Forums bot. At first, I wasn’t sure what I wanted it to do. Then I thought, “what’s a task that humans do often that could be easily automated?”: complaining about people getting scammed, of course.
12 |
13 | # madcausebad11
14 |
15 | I didn’t do anything with this idea until a couple weeks later on May 14th, when I remembered it, and was actually motivated to create it. I asked around on the SkyBlock Community Discord for what it should be called and what it should do, and I decided on calling it madcausebad11 (name chosen by @TatorCheese), and making it say “thats crazy but I dont remember asking” (@Bliziq chose that one) to all posts that mentioned being scammed.
16 | 
17 | When that had been decided, I started working on the code. It was written in Python, using BeautifulSoup to scrape the web pages and aiohttp to make the requests. After an hour of writing code, madcausebad11 was working.
18 |
19 | Less than an hour after the bot started working, it got banned for the reason “spam”.
20 |
21 | # reportScammers
22 |
23 | A day after madcausebad11 got banned, I decided to make it again, but better. This time, I was going to make it look like a human. I added more delays, random messages, a profile picture made in MSPaint, and fixed more false positives. This became what you all (probably) know, and (maybe) love, reportScammers.
24 | This version of the bot also wasn’t toxic, as it just said “Please report scammers at hypixel.net/report” (or some variation of that) to all messages complaining about being scammed, and people didn’t hate it that much this time.
25 | I checked the forums often on this account, so if anyone talked about the bot I would be able to respond, and there were some people that called reportScammers a minimod and a bot, but it was fairly unknown so most people didn’t care.
26 | There were, of course, people that suspected reportScammers was a bot. Every time I saw one of these messages, I responded manually, sometimes pretending to get angry about people thinking it was a bot, even though it was. There were also many posts baiting the bot to reply, by making the title of their post a variation of “I got scammed”, even though they didn’t. To combat this, I made the bot only reply to messages from new members, as well-known members were likely only trying to post farm.
27 | I had a few problems making the bot work well though, such as the Cloudflare captcha screen, meant to prevent bots from scraping the forums. However, reportScammers wasn’t a bot, so I found a Python library meant to bypass it and tweaked the source code to make the library asynchronous.
28 | Near this time I also updated the logo for reportScammers in Photoshop, but still with the MSPaint vibe.
29 |
30 | # Dafty = reportScammers???
31 |
32 | On June 9th, a member of the SkyBlock Community Discord followed reportScammers, and they told me “follow me back”, “thats rude”, so I did. This user was @Dafty. I pointed out how the only person reportScammers was following was Dafty, so people will think they run the account.
33 | We got @pigeo to write a forum thread “exposing” reportScammers, and then some people starting making their own forum threads, and then I wrote my own forum thread titled “Addressing the reportScammers situation” on my main account.
34 | However, we had to go further. Dafty asked @SecureConnection to change the name of their alt to reportScammers, so we could link the forum account and look even more human. At this time I also gave the login details of the account to Dafty, so he could help reply to messages faster, and farm more messages. Dafty also created a Minecraft skin for the account, which was simply a Steve holding a Hypixel logo.
35 |
36 | # The death of reportScammers
37 |
38 | At this time, many parody accounts started popping up, such as reportScammersbrother, scam-bot, NoPublicShaming, and NoTrollingBotXD.
39 | One day, I noticed reportScammers had suddenly stopped replying to posts. I first thought this must just be a glitch with the code, but when I looked further, I could not find any recent posts complaining about being scammed. Maybe people just stopped getting scammed? I thought this was the reason, but no staff members wanted to confirm. I made another alt account to test this, and I found out that the admins have disabled new members from being able to create posts with the word “scammed” in them.
40 | I sadly went to disable the code running the bot, but wanted to make one last message as reportScammers. This thread is the first and last thread by reportScammers, created by @matdoesdev.
41 |
--------------------------------------------------------------------------------
/src/routes/(blog)/the-story-of-reportscammers/thats-crazy-but-i-dont-remember-asking.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/the-story-of-reportscammers/thats-crazy-but-i-dont-remember-asking.png
--------------------------------------------------------------------------------
/src/routes/(blog)/uncovering-the-discord-twitch-bots/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Uncovering the Discord Twitch Bots
3 | published: 2020-03-31T19:54:07.456+00:00
4 | ---
5 |
6 | So a few days ago my friend Slip got a DM on Discord from this "Twitch" bot asking him to invite it to my servers as well as to join theirs. The message the bot said claimed that Discord and Twitch had partnered up to give its users free Nitro Games and free Twitch Prime.
7 |
8 | 
9 | It obviously looked fake, so Slip created a testing server and added me and some friends to help. Upon joining, the fake Twitch bot DMed everyone in the server with the same message as it sent to Slip. It looked like some sort of social engineering worm, but it hadn't done anything bad yet, so we revoked the bot's perms and left it in the server.
10 |
11 | 
12 | When I joined the server it linked, it looked like some sort of bad giveaway server with giveaway channels, and even a rules and TOS channel. Unfortunately for us, there were no channels that we could talk in to inform other people. Soon after joining, we got another DM from a different bot but with the same name. Again, it contained a link to join a Discord server. However, this time, instead of saying it was from Twitch, it took a more straightforward attempt, saying to join for "Nitro / Nudes".
13 |
14 | It was getting late, so we went to sleep. When we woke up, we were greeted by at least 4 other bots with the same message and name, so we just invited all of them to our server! The old bots were now offline and for some people, the bots' names were displayed as things such as "thisisaspambot", "Fake Twitch Bot", and "Fake bot". We later found out that this was in fact a doing of the Discord Trust and Safety team, but they didn't do it very well because some of the bots could still DM people, and it didn't always show up with their new names.
15 |
16 | 
17 |
18 | Another interesting thing was in a MediaFire link one of the bots DMed to Slip. He shared it with us, and the file claimed to be an executable containing a Nitro generator, but it looked obviously fake, evident by the instructions text file provided.
19 |
20 | 
21 |
22 | ```
23 | How to use the Discord Generator :
24 |
25 | 1. Disable anti-virus, and open it.
26 | 2. When you opened it, press on ''Generate'' and good luck!
27 | 3. It says its a virus because this generator generates accounts, so obviously it will say its a virus, but its not.
28 |
29 | If its not working, it means u dont have the good version.
30 | Good Luck!
31 | ```
32 |
33 | > What even is that grammar...
34 |
35 | Another notable thing was that when we searched up the owner of the "Free Nitro" Discord server on YouTube, it returned their channel. One of the videos was a free Nitro generator, leading to the same exact MediaFire link, so we knew there was a definite link with that user.
36 |
37 | Anyway, we booted up Windows Sandbox and ran the virus with a process monitor in the background. There were a bunch of references to Python, so it was likely a Python script compiled into an exe.
38 |
39 | 
40 |
41 | I wasn't sure what it was compiled with, so I tried running unpy2exe on it, but it returned an error telling me to use pyinstxtractor instead, as it was compiled with pyinstaller. After we ran pyinstxtractor on the exe, it returned a folder with a bunch of pyc and pyd (Python bytecode) files.
42 |
43 | 
44 |
45 | 
46 |
47 | > It looks like it was created on March 2nd.
48 |
49 | No matter what we tried, we couldn't decompile it into normal readable Python, so we just analyzed the bytecode using the [dis](https://docs.python.org/3/library/dis.html) Python module. There was a bunch of references to tokens and browser LocalStorage, where the token is stored. The malware also sent an http request to [api.ipify.org](https://api.ipify.org) (to grab the victim's IP address), the user's email and phone number, as well as the user's nitro status.
50 |
51 | There was also a funky looking base64 string, which revealed to be a Discord webhook that the script sent the user's details to.
52 |
53 | Once we got hold of the webhook, things got spicy.
54 |
55 | We tidied up the testing server a bit and hid our discussion channels, then made the invite look as appealing as possible.
56 |
57 | 
58 |
59 | Using a little webhook spamming script I wrote, we spammed @everyone, as well as an invite to our server, and left it running overnight.
60 |
61 | In the morning, We woke up to this:
62 | 
63 |
64 | They were the admins to that free Nitro server.
65 |
66 | We also found out that they had deleted their webhook, which meant we couldn't spam them anymore, but they wouldn't get the tokens of any new users.
67 |
68 | The first two quickly left, but one sent us a message before leaving.
69 |
70 | 
71 |
72 | We asked kzh to join back again.
73 |
74 | 
75 |
76 | This led to this hilarious conversation.
77 |
78 | 
79 | 
80 | 
81 | 
82 |
83 | In summary, these guys are just terrible clowns trying to get tokens from unsuspecting Discord members.
84 |
85 | And that ends the tale. We still have the server ID and the channel ID that the webhook was created in as well as the discord tags of all the members and we'll continue to spam any future webhooks that the Twitch bots send us.
86 |
87 | :)
88 |
--------------------------------------------------------------------------------
/src/routes/(blog)/what-are-domain-hacks/domain-hack-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/what-are-domain-hacks/domain-hack-example.png
--------------------------------------------------------------------------------
/src/routes/(blog)/what-are-domain-hacks/domain-hack-generator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/what-are-domain-hacks/domain-hack-generator.png
--------------------------------------------------------------------------------
/src/routes/(blog)/what-are-domain-hacks/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: What Are Domain Hacks?
3 | published: 2019-06-21T17:24:30.105+00:00
4 | ---
5 |
6 | 
7 | **A domain hack is a domain in which both the top level domain (TLD) and the second level domain (SLD) are combined to make up a word or phrase.**
8 | For example, matdoes.dev is a domain hack for mat does dev.
9 | Domain hacks are _not_ security-related and they are completely legal.
10 |
11 | Most domain hacks use country code top level domains (ccTLDs), for example, .it is for italy, .am is for Armenia, etc.
12 | Some companies even purchase their own custom TLDs from the [Internet Assigned Numbers Authority](https://www.iana.org/) in order to create a hack for their domains. Most notably is goo.gle, which was created by Google as a domain hack for their website.
13 |
14 | ---
15 |
16 | # Why Use a Domain Hack?
17 |
18 | An advantage to using a domain hack is that your domain is much shorter and therefore easier to remember. Many URL shortening sites such as bit.ly, goo.gl (Google), youtu.be, etc, use domain hacks to make their URLs shorter.
19 |
20 | ## Domain hacks are more fun than normal domains, too, which increases the chance of people clicking on them in search results.
21 |
22 | # How to Choose a Domain Hack?
23 |
24 | Finding a good domain isn't always easy, so I've created a tool hosted on [Repl.it](https://repl.it) that helps you find domain hacks
25 | [](https://repl.it/talk/share/Domain-Hack-Finder/15778)
26 |
27 |
28 |
29 | At the moment, it uses every TLD currently in existence, which may not be what you want since some top level domains cannot be used by most people as they require you to live in a certain area or work for a certain organization. You can customize it by adding or removing from the tlds.txt file.
30 |
31 | My tool also checks whether a domain is already taken by someone by seeing if the website has any DNS records. Also, be aware that some TLDs are stupidly expensive. For example, .ng domains can go for up to $50,000
32 |
--------------------------------------------------------------------------------
/src/routes/(blog)/who-is-mat/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/(blog)/who-is-mat/favicon.png
--------------------------------------------------------------------------------
/src/routes/(blog)/who-is-mat/index.svx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Who is mat?
3 | published: 2019-04-25T01:08:27.057+00:00
4 | ---
5 |
6 |
7 | Content expunged.
8 |
9 |
--------------------------------------------------------------------------------
/src/routes/(main)/+error.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
{$page.status}
12 | {#if $page.error?.message}
13 | {$page.error.message}
14 | {/if}
15 |
16 |
17 |
18 |
41 |
--------------------------------------------------------------------------------
/src/routes/(main)/+layout.svelte:
--------------------------------------------------------------------------------
1 |
109 |
110 | {#key data.pathname}
111 |
116 |
117 | {@render children?.()}
118 |
119 |
120 |
131 |
132 | {/key}
133 |
134 |
166 |
--------------------------------------------------------------------------------
/src/routes/(main)/+layout.ts:
--------------------------------------------------------------------------------
1 | import type { Load } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const load: Load = async function ({ url }) {
6 | return {
7 | pathname: url.pathname,
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/routes/(main)/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = true
2 |
--------------------------------------------------------------------------------
/src/routes/(main)/404/+page.svelte:
--------------------------------------------------------------------------------
1 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | {
87 | if (idleModeEnabled) {
88 | if (Math.random() < 0.5) {
89 | xVel *= -1.2
90 | } else {
91 | yVel *= -1.2
92 | }
93 | }
94 | }}
95 | >
96 |
404
97 | Not found
98 |
99 |
100 |
101 |
130 |
--------------------------------------------------------------------------------
/src/routes/(main)/451/+page.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
14 |
15 |
42 |
--------------------------------------------------------------------------------
/src/routes/(main)/[slug]/+page.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/routes/(main)/[slug]/+page.ts:
--------------------------------------------------------------------------------
1 | import { error, type Load } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const load: Load = async ({ params }) => {
6 | const { slug } = params
7 | if (!slug) throw new Error('No slug')
8 |
9 | let page
10 | try {
11 | page = await import(`../../(blog)/${slug}/index.svx`)
12 | } catch (e) {
13 | error(404, 'Not found');
14 | }
15 |
16 | return {
17 | page: page.default,
18 | slug,
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/routes/(main)/[slug]/[asset]/+server.ts:
--------------------------------------------------------------------------------
1 | import { doesAssetExist, postsDir } from '$lib/blog'
2 | import type { RequestHandler } from '@sveltejs/kit'
3 | import { error } from '@sveltejs/kit'
4 | import path from 'path'
5 | import fs from 'fs'
6 |
7 | export const prerender = true
8 |
9 | export interface APIBlogPost {
10 | title: string
11 | html: string
12 | }
13 |
14 | const extContentTypes: Record = {
15 | png: 'image/png',
16 | }
17 |
18 | export const GET: RequestHandler = async ({ params }) => {
19 | const { slug: postSlug, asset: assetName } = params
20 |
21 | if (!postSlug) throw new Error('No slug')
22 | if (!assetName) throw new Error('No asset')
23 |
24 | if (!(await doesAssetExist(postSlug, assetName))) error(404, 'Not found');
25 |
26 | const file = await fs.promises.readFile(path.join(postsDir, postSlug, assetName))
27 |
28 | // extract the file extension from the end of the file name
29 | const [ext = ''] = assetName.split('.').slice(-1)
30 | const contentType = ext in extContentTypes ? extContentTypes[ext] : 'text/plain'
31 |
32 | return new Response(file, {
33 | headers: {
34 | 'Content-Type': contentType,
35 | },
36 | })
37 | }
38 |
--------------------------------------------------------------------------------
/src/routes/(main)/admin/+page.svelte:
--------------------------------------------------------------------------------
1 |
96 |
97 | Admin
98 |
99 |
100 | JavaScript is required to view this page.
101 |
106 |
107 |
108 | {#if uptimeSeconds === undefined}
109 | Loading...
110 |
115 | {/if}
116 |
117 |
121 |
122 | {#if uptimeSeconds !== undefined}
123 |
124 | Uptime :
125 | {renderUptime(uptimeSeconds)}
126 |
127 | {/if}
128 |
129 |
130 |
131 | {#if memoryTotal !== undefined}
132 |
133 |
134 | Memory usage :
135 | {memoryUsed} GiB /{memoryTotal} GiB
136 |
137 |
138 |
139 | {/if}
140 |
141 |
142 | Logs:
143 |
144 | {#each logs as log}
145 |
{log}
146 | {/each}
147 |
148 |
149 |
150 |
151 |
152 | {#if cpuUsage !== undefined}
153 |
154 | CPU : {Math.round(cpuUsage * 100)}%
155 |
156 |
157 | {/if}
158 |
159 | {#if storageUsed !== undefined && storageTotal !== undefined}
160 |
161 | Storage :
162 | {storageUsed} GiB /{storageTotal}
163 | GiB
164 |
167 |
168 | {/if}
169 |
170 |
171 |
172 |
173 |
238 |
--------------------------------------------------------------------------------
/src/routes/(main)/admin/AdminGraph.svelte:
--------------------------------------------------------------------------------
1 |
42 |
43 |
48 |
49 |
62 |
--------------------------------------------------------------------------------
/src/routes/(main)/blog/+page.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 | matdoesdev blog
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
Blog
25 |
26 | {#each posts as post}
27 |
28 | {/each}
29 |
30 |
--------------------------------------------------------------------------------
/src/routes/(main)/blog/+page.ts:
--------------------------------------------------------------------------------
1 | import type { Load } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const load: Load = async ({ fetch }) => {
6 | const posts = await fetch('/blog-preview.json').then((r: Response) => r.json())
7 |
8 | return {
9 | posts,
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/routes/(main)/blog/[...path]/+server.ts:
--------------------------------------------------------------------------------
1 | import type { RequestHandler } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const GET: RequestHandler = async ({ params }) => {
6 | let location = `/${params.path}`
7 | if (params.path == 'minecraft-server-warner') {
8 | location = '/matscan'
9 | }
10 | return new Response(null, {
11 | status: 301,
12 | headers: {
13 | Location: location,
14 | },
15 | })
16 | }
17 |
--------------------------------------------------------------------------------
/src/routes/(main)/projects/+page.svelte:
--------------------------------------------------------------------------------
1 |
27 |
28 |
29 |
30 |
37 |
38 | {#each projects as project, i}
39 |
46 | {project.description}
47 |
48 | {/each}
49 |
50 |
51 |
107 |
--------------------------------------------------------------------------------
/src/routes/(main)/projects/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = true
2 |
--------------------------------------------------------------------------------
/src/routes/+layout.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | {@render children?.()}
14 |
--------------------------------------------------------------------------------
/src/routes/.json/+server.ts:
--------------------------------------------------------------------------------
1 | import { json, type RequestHandler } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | // this page exists so requesting the website with Accept: application/json works
6 |
7 | export const GET: RequestHandler = async ({}) => {
8 | const res = {
9 | title: 'matdoesdev',
10 | description: [
11 | "I'm mat, I do full-stack software development.",
12 | "This portfolio contains my blog posts and links to some of the projects I've made.",
13 | ],
14 | socials: ['//github.com/mat-1', '//matrix.to/#/@mat:matdoes.dev', '//ko-fi.com/matdoesdev'],
15 | links: ['/blog', '/projects'],
16 | }
17 | return new Response(JSON.stringify(res, null, 2), {
18 | headers: {
19 | 'content-type': 'application/json',
20 | },
21 | })
22 | }
23 |
--------------------------------------------------------------------------------
/src/routes/[slug].json/+server.ts:
--------------------------------------------------------------------------------
1 | import { getPost } from '$lib/blog'
2 | import { error, json, type RequestHandler } from '@sveltejs/kit'
3 |
4 | export const prerender = true
5 |
6 | export interface APIBlogPost {
7 | title: string
8 | subtitle: string | undefined
9 | published: string
10 | html: string
11 | }
12 |
13 | export const GET: RequestHandler = async ({ params }) => {
14 | const { slug } = params
15 | if (!slug) throw new Error('No slug')
16 |
17 | const post = await getPost(slug)
18 |
19 | if (post === null) error(404, 'Not found')
20 |
21 | return json({
22 | title: post.title,
23 | subtitle: post.subtitle,
24 | published: post.published,
25 | html: post.html,
26 | })
27 | }
28 |
--------------------------------------------------------------------------------
/src/routes/[slug].md/+server.ts:
--------------------------------------------------------------------------------
1 | import { getPost } from '$lib/blog'
2 | import { error, json, type RequestHandler } from '@sveltejs/kit'
3 | import TurndownService from 'turndown'
4 |
5 | export const prerender = true
6 |
7 | export interface APIBlogPost {
8 | title: string
9 | subtitle: string | undefined
10 | published: string
11 | html: string
12 | }
13 |
14 | export const GET: RequestHandler = async ({ params }) => {
15 | const { slug } = params
16 | if (!slug) throw new Error('No slug')
17 |
18 | const post = await getPost(slug)
19 |
20 | if (post === null) error(404, 'Not found')
21 |
22 | const turndownService = new TurndownService({ headingStyle: 'atx' })
23 | const postMarkdown = turndownService.turndown(post.html).replace(/^# /g, '## ')
24 |
25 | let markdown = `# ${post.title}\n\n`
26 | if (post.subtitle) markdown += `## ${post.subtitle}\n\n`
27 | markdown += `_${new Date(post.published).toLocaleDateString()}_\n\n`
28 | markdown += postMarkdown
29 |
30 | return new Response(markdown, {
31 | headers: {
32 | 'content-type': 'text/plain; charset=utf-8',
33 | },
34 | })
35 | }
36 |
--------------------------------------------------------------------------------
/src/routes/[slug].txt/+server.ts:
--------------------------------------------------------------------------------
1 | import { getPost } from '$lib/blog'
2 | import { error, json, type RequestHandler } from '@sveltejs/kit'
3 | import TurndownService from 'turndown'
4 |
5 | export const prerender = true
6 |
7 | export interface APIBlogPost {
8 | title: string
9 | subtitle: string | undefined
10 | published: string
11 | html: string
12 | }
13 |
14 | export const GET: RequestHandler = async ({ params }) => {
15 | const { slug } = params
16 | if (!slug) throw new Error('No slug')
17 |
18 | const post = await getPost(slug)
19 |
20 | if (post === null) error(404, 'Not found')
21 |
22 | let postHtml = `${post.title} \n\n`
23 | if (post.subtitle) postHtml += `${post.subtitle} \n\n`
24 | postHtml += `${post.published}
\n\n`
25 | postHtml += post.html
26 |
27 | const turndownService = new TurndownService()
28 | const markdown = turndownService.turndown(postHtml)
29 |
30 | return new Response(markdown, {
31 | headers: {
32 | 'content-type': 'text/plain; charset=utf-8',
33 | },
34 | })
35 | }
36 |
--------------------------------------------------------------------------------
/src/routes/blog-preview.json/+server.ts:
--------------------------------------------------------------------------------
1 | import { json, type RequestHandler } from '@sveltejs/kit'
2 | import { getPosts } from '../blog.json/preview'
3 |
4 | export const prerender = true
5 |
6 | export const GET: RequestHandler = async () => {
7 | const posts = await getPosts()
8 |
9 | return json(posts)
10 | }
11 |
--------------------------------------------------------------------------------
/src/routes/blog.atom/+server.ts:
--------------------------------------------------------------------------------
1 | import type { RequestHandler } from '@sveltejs/kit'
2 | import type { BlogPost } from '$lib/blog'
3 | import { getPostsUntrimmed } from '../blog.json/preview'
4 |
5 | export const prerender = true
6 |
7 | export const GET: RequestHandler = async ({ fetch }) => {
8 | const posts = await getPostsUntrimmed()
9 | function item(post: BlogPost) {
10 | return `
11 |
12 | ${post.title}
13 |
14 | https://matdoes.dev/${post.slug}
15 | ${post.published}
16 | ${post.published}
17 | ${post.html}
18 |
19 | `
20 | }
21 |
22 | const out = `
23 |
24 | mat does dev
25 | dev and gaming
26 |
27 |
28 | urn:uuid:ff072254-29df-4c11-ab52-bb3938450451
29 | 2003-12-13T18:30:02Z
30 | ${posts.map(item).join('')}
31 |
32 | `
33 |
34 | return new Response(out, {
35 | headers: {
36 | 'Content-Type': 'application/rss+xml',
37 | },
38 | })
39 | }
40 |
--------------------------------------------------------------------------------
/src/routes/blog.json/+server.ts:
--------------------------------------------------------------------------------
1 | import { json, type RequestHandler } from '@sveltejs/kit'
2 | import { getPostsUntrimmed } from './preview'
3 |
4 | export const prerender = true
5 |
6 | export const GET: RequestHandler = async () => {
7 | const posts = await getPostsUntrimmed()
8 |
9 | return json(posts)
10 | }
11 |
--------------------------------------------------------------------------------
/src/routes/blog.json/preview.ts:
--------------------------------------------------------------------------------
1 | import { listBlogPostSlugs, type BlogPost, getPost } from '$lib/blog'
2 |
3 | export interface BlogPostPreview {
4 | title: string
5 | subtitle: string | undefined
6 | published: string
7 | html: string
8 | css: string
9 | slug: string
10 | }
11 |
12 | function cutOffAtLine(text: string, line: number) {
13 | let row = 0
14 | let column = 0
15 |
16 | let inHtmlTag = false
17 |
18 | let currentTag = ''
19 | const activeTags = []
20 |
21 | for (let i = 0; i < text.length; i++) {
22 | if (text[i] === '<') {
23 | inHtmlTag = true
24 | continue
25 | } else if (text[i] === '>') {
26 | inHtmlTag = false
27 |
28 | if (currentTag[0] === '!') {
29 | } else if (currentTag[0] === '/') {
30 | activeTags.pop()
31 | } else {
32 | const tagName = currentTag.split(' ')[0]
33 | activeTags.push(tagName)
34 | }
35 | currentTag = ''
36 | continue
37 | }
38 | if (inHtmlTag) {
39 | currentTag += text[i]
40 | }
41 | if (text[i] === '\n') {
42 | row++
43 | column = 0
44 | } else {
45 | column++
46 | }
47 | if (column > 128 && !inHtmlTag) {
48 | row++
49 | column = 0
50 | }
51 | if (row >= line && !inHtmlTag) {
52 | let closingTags = ''
53 |
54 | activeTags.reverse()
55 | for (const tag of activeTags) {
56 | closingTags += `${tag}>`
57 | }
58 |
59 | return text.slice(0, i) + closingTags + '...'
60 | }
61 | }
62 | return text
63 | }
64 |
65 | export async function getPostsUntrimmed(): Promise {
66 | const existingPosts: string[] = await listBlogPostSlugs()
67 |
68 | const posts = (
69 | await Promise.all(
70 | existingPosts.map(async (slug): Promise => {
71 | return await getPost(slug)
72 | })
73 | )
74 | )
75 | .filter((p) => p)
76 | .sort((a, b) => (new Date(a!.published) > new Date(b!.published) ? -1 : 1))
77 |
78 | // typescript thinks posts is (BlogPost | null)[] but it's not because of the .filter
79 | return posts as BlogPost[]
80 | }
81 |
82 | export async function getPosts() {
83 | const posts = await getPostsUntrimmed()
84 | return posts.map((p) => ({
85 | title: p.title,
86 | published: p.published,
87 | subtitle: p.subtitle,
88 | // HACK: remove images, i WILL parse html with regex and you won't stop me
89 | html: cutOffAtLine(
90 | p.html
91 | .replace(/<(img|iframe).+?\/?>|<\/?(img|iframe)>/g, '')
92 | // sveltekit doesn't like it when we have a tags in a tags
93 | .replace(/(.*?)<\/a>/g, '$2 '),
94 | 6
95 | ),
96 | css: p.css,
97 | slug: p.slug,
98 | }))
99 | }
100 |
--------------------------------------------------------------------------------
/src/routes/blog.rss/+server.ts:
--------------------------------------------------------------------------------
1 | import type { RequestHandler } from '@sveltejs/kit'
2 | import { getPostsUntrimmed } from '../blog.json/preview'
3 | import type { BlogPost } from '$lib/blog'
4 |
5 | export const prerender = true
6 |
7 | export const GET: RequestHandler = async ({ fetch }) => {
8 | const posts = await getPostsUntrimmed()
9 | function item(post: BlogPost) {
10 | const escapedPostHtml = post.html
11 | .replace(/&/g, '&')
12 | .replace(//g, '>')
14 | return `
15 | -
16 |
${post.title}
17 | https://matdoes.dev/${post.slug}
18 | ${post.published}
19 |
20 | ${escapedPostHtml}
21 | <style>
22 | ${post.css}
23 | </style>
24 |
25 |
26 | `
27 | }
28 |
29 | const out = `
30 |
31 |
32 | mat does dev
33 | https://matdoes.dev/blog
34 | dev and gaming
35 | ${posts.map(item).join('')}
36 |
37 |
38 | `
39 |
40 | return new Response(out, {
41 | headers: {
42 | 'Content-Type': 'application/rss+xml',
43 | },
44 | })
45 | }
46 |
--------------------------------------------------------------------------------
/src/routes/blog.txt/+server.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from '@sveltejs/kit'
2 | import { getPostsUntrimmed } from '../blog.json/preview'
3 |
4 | export const prerender = true
5 |
6 | export const GET: RequestHandler = async () => {
7 | const posts = await getPostsUntrimmed()
8 |
9 | let content = '# Blog\n\n'
10 |
11 | const longestTitleLength = Math.max(...posts.map((post) => post.title.length))
12 |
13 | for (const post of posts) {
14 | // => /minecraft-uuids 2024-02-22 - How to Make a List of Nearly Every Minecraft Player
15 | const published = new Date(post.published)
16 | const publishedDate = published.toISOString().split('T')[0]
17 | const padding = ' '.repeat(longestTitleLength - post.title.length)
18 | content += `=> ${publishedDate} ${post.title} ${padding}https://matdoes.dev/${post.slug}.txt\n`
19 | }
20 |
21 | return new Response(content, {
22 | headers: {
23 | 'content-type': 'text/plain; charset=utf-8',
24 | },
25 | })
26 | }
27 |
--------------------------------------------------------------------------------
/src/routes/buttons/+layout.server.ts:
--------------------------------------------------------------------------------
1 | export const ssr = false
2 | export const prerender = true
3 |
--------------------------------------------------------------------------------
/src/routes/buttons/+layout.svelte:
--------------------------------------------------------------------------------
1 |
28 |
29 |
43 |
44 |
45 | {@render children?.()}
46 |
47 |
48 |
64 |
--------------------------------------------------------------------------------
/src/routes/buttons/88x31.ts:
--------------------------------------------------------------------------------
1 | import { decode } from 'cbor-x/decode'
2 |
3 | interface Data {
4 | pages: string[]
5 | buttons: string[]
6 | texts: string[]
7 |
8 | button_file_exts: string[]
9 | button_names: number[][]
10 | button_links: number[][]
11 | button_backlinks: number[][]
12 |
13 | links: number[][]
14 | link_buttons: number[][]
15 | link_button_alts: (number | null)[][]
16 | link_button_titles: (number | null)[][]
17 |
18 | backlinks: number[][]
19 | backlink_buttons: number[][]
20 | }
21 |
22 | export let data: Data = {
23 | pages: [],
24 | buttons: [],
25 | texts: [],
26 | button_file_exts: [],
27 | button_names: [],
28 | button_links: [],
29 | button_backlinks: [],
30 | links: [],
31 | link_buttons: [],
32 | link_button_alts: [],
33 | link_button_titles: [],
34 | backlinks: [],
35 | backlink_buttons: [],
36 | }
37 |
38 | export async function downloadData() {
39 | const res = await fetch('https://matdoes.dev/buttons/88x31.cbor')
40 | const buffer = await res.arrayBuffer()
41 | data = decode(new Uint8Array(buffer))
42 | }
43 |
44 | export function buttonUrlFromIndex(index: number) {
45 | const hash = buttonHashFromIndex(index)
46 | const ext = data.button_file_exts[index]
47 | return `https://matdoes.dev/buttons/i/${hash}.${ext}`
48 | }
49 |
50 | export function buttonUrlFromHash(hash: string) {
51 | return `https://matdoes.dev/buttons/i/${hash}`
52 | }
53 |
54 | export function buttonHashFromIndex(index: number) {
55 | return data.buttons[index]
56 | }
57 |
58 | function binarySearch(arr: T[], key: T): number | null {
59 | let low = 0
60 | let high = arr.length - 1
61 |
62 | while (low <= high) {
63 | const mid = (low + high) >>> 1
64 | const midVal = arr[mid]
65 |
66 | if (midVal < key) low = mid + 1
67 | else if (midVal > key) high = mid - 1
68 | else return mid
69 | }
70 |
71 | return null
72 | }
73 |
74 | export function pageIndexFromName(name: string): number | null {
75 | console.log('pageIndexFromName', name, binarySearch(data.pages, name))
76 | return binarySearch(data.pages, name)
77 | }
78 |
79 | export function buttonIndexFromHash(hash: string): number | null {
80 | return binarySearch(data.buttons, hash)
81 | }
82 |
--------------------------------------------------------------------------------
/src/routes/buttons/ButtonLink.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
22 |
23 |
30 |
--------------------------------------------------------------------------------
/src/routes/buttons/ExternalLink.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
23 |
24 |
31 |
--------------------------------------------------------------------------------
/src/routes/buttons/ExternalLinkIcon.svelte:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
13 |
--------------------------------------------------------------------------------
/src/routes/buttons/app.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #1e1e2e;
3 | color: #cdd6f4;
4 | /* serif is chosen intentionally as it makes the website look worse */
5 | font-family: serif;
6 | padding: 0.5rem;
7 | }
8 |
9 | input,
10 | button,
11 | select {
12 | background-color: #313244;
13 | color: #cdd6f4;
14 | border: 1px solid #9399b2;
15 | border-radius: 4px;
16 | padding: 0.25em;
17 | }
18 |
19 | button {
20 | cursor: pointer;
21 | }
22 |
23 | a {
24 | color: #89b4fa;
25 | }
26 |
27 | .button {
28 | width: 88px;
29 | height: 31px;
30 | image-rendering: pixelated;
31 | padding: 0;
32 | }
33 |
--------------------------------------------------------------------------------
/src/routes/buttons/degrees/+page.svelte:
--------------------------------------------------------------------------------
1 |
131 |
132 |
133 |
134 |
140 | →
141 |
147 |
148 |
149 | {#if originPageId !== null && targetPageId !== null}
150 | {#if pageAndButtonIndexes === null}
151 |
No path :(
152 | {:else}
153 |
154 | {#if pageAndButtonIndexes.length - 1 === 1}
155 | 1 degree of separation
156 | {:else}
157 | {pageAndButtonIndexes.length - 1} degrees of separation
158 | {/if}
159 |
160 | {#each pageAndButtonIndexes as [pageIndex, buttonIndex], i}
161 | {#if i > 0}
162 |
→
163 | {/if}
164 |
165 | {/each}
166 | {/if}
167 | {/if}
168 |
169 |
170 |
175 |
--------------------------------------------------------------------------------
/src/routes/index.txt/+server.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const GET: RequestHandler = async ({}) => {
6 | const res = ` 888 888 888
7 | 888 888 888
8 | 888 888 888
9 | 88888b.d88b. 8888b. 888888 .d88888 .d88b. .d88b. .d8888b .d88888 .d88b. 888 888
10 | 888 "888 "88b "88b 888 d88" 888 d88""88b d8P Y8b 88K d88" 888 d8P Y8b 888 888
11 | 888 888 888 .d888888 888 888 888 888 888 88888888 "Y8888b. 888 888 88888888 Y88 88P
12 | 888 888 888 888 888 Y88b. Y88b 888 Y88..88P Y8b. X88 Y88b 888 Y8b. Y8bd8P
13 | 888 888 888 "Y888888 "Y888 "Y88888 "Y88P" "Y8888 88888P' "Y88888 "Y8888 Y88P
14 |
15 | I'm mat, I do full-stack software development.
16 | This portfolio contains my blog posts and links to some of the projects I've made.
17 |
18 | => Blog https://matdoes.dev/blog.txt
19 | => Projects https://matdoes.dev/projects.txt
20 |
21 | => GitHub https://github.com/mat-1
22 | => Matrix https://matrix.to/#/@mat:matdoes.dev
23 | => Ko-fi (donate) https://ko-fi.com/matdoesdev
24 | `
25 | return new Response(res, {
26 | headers: {
27 | 'content-type': 'text/plain; charset=utf-8',
28 | },
29 | })
30 | }
31 |
--------------------------------------------------------------------------------
/src/routes/lightswitch/+page.svelte:
--------------------------------------------------------------------------------
1 |
54 |
55 |
56 | {#if mounted}
57 | ($isLightSwitchOn = !$isLightSwitchOn)}>
58 |
63 |
64 | {/if}
65 |
66 |
67 |
108 |
--------------------------------------------------------------------------------
/src/routes/lightswitch/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = true
2 |
--------------------------------------------------------------------------------
/src/routes/lightswitch/lightswitch-off.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/lightswitch/lightswitch-off.mp3
--------------------------------------------------------------------------------
/src/routes/lightswitch/lightswitch-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/lightswitch/lightswitch-off.png
--------------------------------------------------------------------------------
/src/routes/lightswitch/lightswitch-on.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/lightswitch/lightswitch-on.mp3
--------------------------------------------------------------------------------
/src/routes/lightswitch/lightswitch-on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/lightswitch/lightswitch-on.png
--------------------------------------------------------------------------------
/src/routes/neko/+page.server.ts:
--------------------------------------------------------------------------------
1 | export const prerender = true
2 |
--------------------------------------------------------------------------------
/src/routes/neko/oneko.css:
--------------------------------------------------------------------------------
1 | .oneko {
2 | width: 32px;
3 | height: 32px;
4 | image-rendering: pixelated;
5 | z-index: 2147483647;
6 | position: absolute;
7 | cursor: pointer;
8 |
9 | /* default idle sprite */
10 | background-position: -96px -96px;
11 | }
12 |
--------------------------------------------------------------------------------
/src/routes/projects.json/+server.ts:
--------------------------------------------------------------------------------
1 | import projects from '../_projects.json'
2 | import { json, type RequestHandler } from '@sveltejs/kit'
3 |
4 | export const prerender = true
5 |
6 | export const GET: RequestHandler = async () => {
7 | return json(projects)
8 | }
9 |
--------------------------------------------------------------------------------
/src/routes/projects.txt/+server.ts:
--------------------------------------------------------------------------------
1 | import projects from '../_projects.json'
2 | import { json, type RequestHandler } from '@sveltejs/kit'
3 |
4 | export const prerender = true
5 |
6 | export const GET: RequestHandler = async () => {
7 | let content = '# Projects\n\n'
8 |
9 | for (const project of projects) {
10 | // => /minecraft-uuids 2024-02-22 - How to Make a List of Nearly Every Minecraft Player
11 | const nameLength = project.name.length
12 | const line = '='.repeat(nameLength)
13 | content += `${project.name}\n${line}\n${project.description}\n`
14 | if (project.source) {
15 | const languages = project.languages
16 | content += `=> Source ${project.source}`
17 | if (languages) content += ` (${languages.join(', ')})`
18 | content += '\n'
19 | }
20 | if (project.href && project.href != project.source) content += `=> ${project.href}\n`
21 |
22 | content += '\n'
23 | }
24 |
25 | return new Response(content, {
26 | headers: {
27 | 'content-type': 'text/plain; charset=utf-8',
28 | },
29 | })
30 | }
31 |
--------------------------------------------------------------------------------
/src/routes/qotd/+server.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const GET: RequestHandler = async ({}) => {
6 | // similar to /status.json, this is redirected in caddy but we put it in
7 | // sveltekit too so it can be pre-rendered
8 |
9 | return await fetch('https://matdoes.dev/qotd')
10 | }
11 |
--------------------------------------------------------------------------------
/src/routes/retro/+layout.svelte:
--------------------------------------------------------------------------------
1 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {@render children?.()}
30 |
--------------------------------------------------------------------------------
/src/routes/retro/+page.server.ts:
--------------------------------------------------------------------------------
1 | export const prerender = true
2 |
--------------------------------------------------------------------------------
/src/routes/retro/+page.ts:
--------------------------------------------------------------------------------
1 | import type { Load } from '@sveltejs/kit'
2 |
3 | export const load: Load = async ({ fetch }) => {
4 | const posts = await fetch('/blog-preview.json').then((r: Response) => r.json())
5 | const status = await fetch('/status.json').then((r: Response) => r.json())
6 |
7 | let qotd = 'Error: Failed to fetch quote of the day'
8 | try {
9 | qotd = await fetch('/qotd').then((r: Response) => r.text())
10 | // remove first line since it's just "Quote of the day:"
11 | qotd = qotd.split('\n').slice(1).join('\n')
12 | } catch (e) {
13 | console.error(e)
14 | }
15 |
16 | return {
17 | posts,
18 | status,
19 | qotd,
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/routes/retro/Button.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
31 |
--------------------------------------------------------------------------------
/src/routes/retro/MusicPlayer.svelte:
--------------------------------------------------------------------------------
1 |
75 |
76 |
77 |
78 |
111 |
112 |
168 |
--------------------------------------------------------------------------------
/src/routes/retro/app.css:
--------------------------------------------------------------------------------
1 | body,
2 | #page {
3 | background: #000000 url(/retro/background.gif);
4 | color: #ffffff;
5 |
6 | font-family: 'Comic Sans MS', cursive !important;
7 | overflow: auto;
8 |
9 | background-attachment: local;
10 | }
11 |
12 | #page p:after,
13 | #page li:after {
14 | content: ' :3';
15 | }
16 |
17 | @font-face {
18 | font-family: 'Comic Sans MS';
19 | src: url(/retro/comicsans.ttf) format('truetype');
20 | }
21 | @font-face {
22 | font-family: 'Press Start 2P';
23 | src: url(/retro/pressstart2p.ttf) format('truetype');
24 | }
25 |
26 | :root {
27 | --background-color-alt: rgba(255, 255, 255, 0.05) !important;
28 | }
29 |
30 | a,
31 | /* these are necessary for ie5 */
32 | a:link,
33 | a:visited,
34 | a:hover,
35 | a:active {
36 | color: #ffffff !important;
37 | }
38 |
39 | img {
40 | /* very old browsers add borders to images */
41 | border: none;
42 | }
43 |
44 | h2 {
45 | margin: 0;
46 | }
47 |
48 | *,
49 | *:before,
50 | *:after {
51 | box-sizing: border-box;
52 | }
53 |
54 | #main-title:after {
55 | content: 'silly edition';
56 | display: block;
57 | font-size: 1rem;
58 | opacity: 0.5;
59 | margin-top: -0.5em;
60 | }
61 |
--------------------------------------------------------------------------------
/src/routes/retro/contact.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/retro/contact.gif
--------------------------------------------------------------------------------
/src/routes/retro/icons/Backward.svelte:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/routes/retro/icons/Forward.svelte:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/routes/retro/icons/Pause.svelte:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/routes/retro/icons/Play.svelte:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/routes/retro/links.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/retro/links.gif
--------------------------------------------------------------------------------
/src/routes/retro/sparkles.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/src/routes/retro/sparkles.gif
--------------------------------------------------------------------------------
/src/routes/status.json/+server.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from '@sveltejs/kit'
2 |
3 | export const prerender = true
4 |
5 | export const GET: RequestHandler = async ({}) => {
6 | // status.json is hardcoded in the caddy config to redirect somewhere else.
7 | // we have it in svelte too so we can use it for prerendering.
8 |
9 | return await fetch('https://matdoes.dev/status.json')
10 | }
11 |
--------------------------------------------------------------------------------
/static/.cobalt/help/ftpSite.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Using FTP to upload a site home page to the server
4 |
8 |
9 |
10 |
11 | Using FTP to upload a site home page to the server
16 |
17 | As a site administrator, you have the priviledge to publish the site home page.
18 |
19 |
20 | Once you have created a home page and you want to post it on the Cobalt server appliance, you
21 | can upload it by following the steps listed below.
22 |
23 |
24 |
25 | Note: Before uploading your home page, make sure its file name is index.html . The
26 | uploaded page will appear at http://<your.vanity.domain>/index.html.
27 |
28 |
29 |
30 | Launch your FTP application, wait for the FTP prompt.
31 |
32 | Type open <hostname> , press Return or Enter. (<hostname> stands
33 | for the site name or IP address of the site that will host your home page).
34 |
35 | Type your user name when asked for login name, then press Return or Enter.
36 | Type your password when asked for password, then press Return or Enter.
37 |
38 | Type cd /web , press Return or Enter. This takes you to the directory for your site
39 | home page.
40 |
41 |
42 | Type put <path>/index.html , press Return or Enter. This uploads the file.
43 | (<path> stands for the directory location of your home page file on your local
44 | disk, and index.html should be the actual name of the file containing your Home page.)
45 |
46 |
47 |
48 | Type quit , then press Return or Enter. This terminates the file transfer session.
49 |
50 | Done!
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/static/.gitignore:
--------------------------------------------------------------------------------
1 | !.git
--------------------------------------------------------------------------------
/static/.well-known/discord:
--------------------------------------------------------------------------------
1 | dm me on matrix instead, @mat:matdoes.dev
2 |
--------------------------------------------------------------------------------
/static/.well-known/dnt:
--------------------------------------------------------------------------------
1 | {
2 | "tracking": "N"
3 | }
4 |
--------------------------------------------------------------------------------
/static/.well-known/gpc.json:
--------------------------------------------------------------------------------
1 | {
2 | "gpc": true,
3 | "lastUpdate": "2038-01-20"
4 | }
5 |
--------------------------------------------------------------------------------
/static/.well-known/matrix/client:
--------------------------------------------------------------------------------
1 | { "m.homeserver": { "base_url": "https://matrix.matdoes.dev" } }
--------------------------------------------------------------------------------
/static/.well-known/matrix/server:
--------------------------------------------------------------------------------
1 | { "m.server": "matrix.matdoes.dev" }
2 |
--------------------------------------------------------------------------------
/static/:3.html:
--------------------------------------------------------------------------------
1 | :3
2 |
--------------------------------------------------------------------------------
/static/:v.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/static/ads.txt:
--------------------------------------------------------------------------------
1 | ABSOLUTELY not
2 |
--------------------------------------------------------------------------------
/static/apache/ubuntu-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/apache/ubuntu-logo.png
--------------------------------------------------------------------------------
/static/bliss-hd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/bliss-hd.jpg
--------------------------------------------------------------------------------
/static/dot_git/COMMIT_EDITMSG:
--------------------------------------------------------------------------------
1 | Initial commit
2 |
3 | # Please enter the commit message for your changes. Lines starting
4 | # with '#' will be ignored, and an empty message aborts the commit.
5 | #
6 | # Date: Sat Oct 28 20:42:13 2023 -0500
7 | #
8 | # On branch master
9 | #
10 | # Initial commit
11 | #
12 | # Changes to be committed:
13 | # new file: .env
14 | #
15 |
--------------------------------------------------------------------------------
/static/dot_git/HEAD:
--------------------------------------------------------------------------------
1 | ref: refs/heads/master
2 |
--------------------------------------------------------------------------------
/static/dot_git/config:
--------------------------------------------------------------------------------
1 | [core]
2 | repositoryformatversion = 0
3 | filemode = true
4 | bare = false
5 | logallrefupdates = true
6 |
--------------------------------------------------------------------------------
/static/dot_git/description:
--------------------------------------------------------------------------------
1 | Unnamed repository; edit this file 'description' to name the repository.
2 |
--------------------------------------------------------------------------------
/static/dot_git/index:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/dot_git/index
--------------------------------------------------------------------------------
/static/dot_git/info/exclude:
--------------------------------------------------------------------------------
1 | # git ls-files --others --exclude-from=.git/info/exclude
2 | # Lines that start with '#' are comments.
3 | # For a project mostly in C, the following would be a good set of
4 | # exclude patterns (uncomment them if you want to use them):
5 | # *.[oa]
6 | # *~
7 |
--------------------------------------------------------------------------------
/static/dot_git/logs/HEAD:
--------------------------------------------------------------------------------
1 | 0000000000000000000000000000000000000000 d36c0d6aa8f54b501f1785134f7688a3214d6810 mat 1698543733 -0500 commit (initial): meow
2 | d36c0d6aa8f54b501f1785134f7688a3214d6810 080226f1f5f9784307c3e436d45792f448338d5f mat 1698543843 -0500 commit (amend): Initial commit
3 |
--------------------------------------------------------------------------------
/static/dot_git/logs/refs/heads/master:
--------------------------------------------------------------------------------
1 | 0000000000000000000000000000000000000000 d36c0d6aa8f54b501f1785134f7688a3214d6810 mat 1698543733 -0500 commit (initial): meow
2 | d36c0d6aa8f54b501f1785134f7688a3214d6810 080226f1f5f9784307c3e436d45792f448338d5f mat 1698543843 -0500 commit (amend): Initial commit
3 |
--------------------------------------------------------------------------------
/static/dot_git/objects/08/0226f1f5f9784307c3e436d45792f448338d5f:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/dot_git/objects/08/0226f1f5f9784307c3e436d45792f448338d5f
--------------------------------------------------------------------------------
/static/dot_git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904:
--------------------------------------------------------------------------------
1 | x+)JMU0`
2 | ,
--------------------------------------------------------------------------------
/static/dot_git/objects/5b/501737d80cbfcc67cfbdf6343bbafac98b8052:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/dot_git/objects/5b/501737d80cbfcc67cfbdf6343bbafac98b8052
--------------------------------------------------------------------------------
/static/dot_git/objects/af/e232c49b95502bd5175f0e48d325a6a0fd6bbc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/dot_git/objects/af/e232c49b95502bd5175f0e48d325a6a0fd6bbc
--------------------------------------------------------------------------------
/static/dot_git/objects/d3/6c0d6aa8f54b501f1785134f7688a3214d6810:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/dot_git/objects/d3/6c0d6aa8f54b501f1785134f7688a3214d6810
--------------------------------------------------------------------------------
/static/dot_git/refs/heads/master:
--------------------------------------------------------------------------------
1 | 080226f1f5f9784307c3e436d45792f448338d5f
2 |
--------------------------------------------------------------------------------
/static/emoji/1f6ab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/emoji/26a0.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/favicon.png
--------------------------------------------------------------------------------
/static/humans.txt:
--------------------------------------------------------------------------------
1 | hello there :)
2 |
3 | matrix: @mat:matdoes.dev
4 |
--------------------------------------------------------------------------------
/static/ibm-http-server/background.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/ibm-http-server/background.gif
--------------------------------------------------------------------------------
/static/ibm-http-server/foreground.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/ibm-http-server/foreground.gif
--------------------------------------------------------------------------------
/static/ibm-http-server/help.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/ibm-http-server/help.gif
--------------------------------------------------------------------------------
/static/ibm-http-server/http_server_styles.css:
--------------------------------------------------------------------------------
1 | /* Provided for use only by developers of IBM products */
2 | /* 5648-F10 (C) Copyright International Business Machines Corp. 2005 */
3 | /* All Rights Reserved */
4 | /* US Government Users Restricted Rights - Use, duplication or disclosure */
5 | /* restricted by GSA ADP Schedule Contract with IBM Corp. */
6 |
7 |
8 | A {color: #363636;
9 | font-family: Verdana, Helvetica, Arial, sans-serif;
10 | font-size: .75em;
11 | font-weight: 900;
12 | }
13 |
14 | A:link {color: #363636;
15 | font-family: Verdana, Helvetica, Arial, sans-serif;
16 | font-size: .75em
17 | font-weight: 900;
18 | }
19 |
20 | A:active{color: #363636;
21 | font-family: Verdana, Helvetica, Arial, sans-serif;
22 | font-size: .75em
23 | font-weight: 900;
24 | }
25 |
26 |
27 | A:hover { color: #FF6600;
28 | }
29 |
30 | .descriptive_text {
31 | font-family: Verdana, Helvetica, Arial, sans-serif;
32 | font-size: .7em;
33 | font-style: italic;
34 | color: #777777;
35 | font-weight: 900;
36 | line-spacing: 2em;
37 | }
38 |
39 | .foreground{
40 | background-image:url(/ibm-http-server/foreground.gif);
41 | background-repeat:no-repeat;
42 | text-align:center;
43 | background-position:center;
44 | width:639px;
45 | height:252px;
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/static/ibm-http-server/odot.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/ibm-http-server/odot.gif
--------------------------------------------------------------------------------
/static/ibm-http-server/support.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/ibm-http-server/support.gif
--------------------------------------------------------------------------------
/static/id_rsa.pub:
--------------------------------------------------------------------------------
1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCou7N2XEEDrWfr3HTcge3UNbjtX5gMfPiNfLf1/0twK56mqqBGbtEARurq+pi1H42jQ3g3TAtUDtz2yZhelvfVJGX3oZJGDQ3GR8SPziqFMZRF16rNDt73QPZXPScoqwAQNAIHUdSxSo0CkOfpg2mMq9uZ0c5I4UF/LMh8Y7szek7iW9CaALWuJgoP46Jb35sOqK1ODFSMgsT1kPp7oZIbaO6X7nLJ6nDFX3R8mIIxQtJ0bK1huZ3iiLyeR7ZjY/l7rC6k21XNi3JC2La5w9IuNO2kR0kTaHBsAgwlC1BWoD7M0QUEIhvQYymPgTOb0L92xIfE8v0zembn+A06ir55ihhnwHJ0KdlKfcUZr6w8Lb9wI3XOdL2OmA1P9La9O+V4b+PW0FUWFV3lCZY+g/USoQx9nsyphZsXe7ZUPY8By5a8GrVEy+zOMp//nRKtFZ0m3+IxsfC/d3abVGhVi68ZeSsoTBnf7nkK6T99BEXG9OF3W3Oz1VzDqT+BwP4aqpU= mat@archlinux
2 |
--------------------------------------------------------------------------------
/static/iisstart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/iisstart.png
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 | 🐟
2 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 | i don't have any more sorry
2 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | IBM HTTP Server
17 |
18 |
21 |
22 |
23 |
24 |
25 |
32 |
33 |
34 |
35 |
36 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Cherokee Test Page
5 |
6 |
40 |
41 |
42 |
43 |
44 |
45 | This page is used to test the proper operation of the Cherokee Web Server after it has
46 | been installed. If you can read this page, it means that the Cherokee Web Server installed
47 | at this site is working properly.
48 |
49 |
50 |
51 | Note: If you see this page after uploading site content you probably have
52 | not replaced the index.html
file.
53 |
54 |
55 |
56 |
57 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Welcome to AOLserver
6 |
70 |
71 |
72 |
82 |
83 | AOLserver 4.5
84 |
85 | Congratulations, you have successfully installed AOLserver 4.5!
86 |
87 | Configuration
88 |
89 |
90 |
91 | Key
92 | Value
93 |
94 |
95 |
96 |
97 |
98 | Build Date
99 | Sep 14 2024 at 03:56:51
100 |
101 |
102 | Build Label
103 | aolserver4_5
104 |
105 |
106 | Build Platform
107 | linux
108 |
109 |
110 | Build Version
111 | 4.5
112 |
113 |
114 | Build Patch Level
115 | 4.5.1
116 |
117 |
118 |
119 |
120 |
121 |
122 | Binary
123 | /usr/local/aolserver/bin/nsd
124 |
125 |
126 | Process ID
127 | 28771
128 |
129 |
130 | Uptime
131 | 27
132 |
133 |
134 | Host Name
135 | user-Standard-PC-Q35-ICH9-2009
136 |
137 |
138 | Address
139 | 127.0.1.1
140 |
141 |
142 | Server Config
143 | /usr/local/aolserver/nsd.tcl
144 |
145 |
146 | Server Log
147 | /usr/local/aolserver/log/server.log
148 |
149 |
150 | Access Log
151 | /usr/local/aolserver/servers/server1/modules/nslog/access.log
152 |
153 |
154 |
155 |
156 |
157 |
158 | Tcl Version
159 | 8.6
160 |
161 |
162 | Tcl Patch Level
163 | 8.6.14
164 |
165 |
166 |
167 |
168 |
169 |
170 | Home Directory
171 | /usr/local/aolserver
172 |
173 |
174 | Page Root
175 | /usr/local/aolserver/servers/server1/pages
176 |
177 |
178 | Tcl Library
179 | /usr/local/aolserver/servers/server1/modules/tcl
180 |
181 |
182 |
183 | Loaded AOLserver Modules
184 |
185 |
186 |
187 | Type
188 | Name
189 | Location
190 |
191 |
192 |
193 | C
194 | nssock
195 | /usr/local/aolserver/bin/nssock.so
196 |
197 |
198 | C
199 | nslog
200 | /usr/local/aolserver/bin/nslog.so
201 |
202 |
203 | C
204 | nscp
205 | /usr/local/aolserver/bin/nscp.so
206 |
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Welcome to Jetty 9 on Debian
4 |
5 |
6 |
7 |
8 |
9 | Welcome to Jetty 9 on Debian
10 |
11 |
12 | Jetty is a 100% Java HTTP Server and Servlet Container. This means that you do not need
13 | to configure and run a seperate web server (like Apache) in order to use java, servlets and
14 | JSPs to generate dynamic content. Jetty is a fully featured web server for static and dynamic
15 | content. Unlike separate server/container solutions, this means that your web server and web
16 | application run in the same process, without interconnection overheads and complications.
17 | Furthermore, as a pure java component, Jetty can be simply included in your application for
18 | demonstration, distribution or deployment. Jetty is available on all Java supported platforms.
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Apache Tomcat
6 |
7 |
8 |
9 | It works !
10 |
11 |
12 | If you're seeing this page via a web browser, it means you've setup Tomcat successfully.
13 | Congratulations!
14 |
15 |
16 |
17 | This is the default Tomcat home page. It can be found on the local filesystem at:
18 | /var/lib/tomcat10/webapps/ROOT/index.html
19 |
20 |
21 |
22 | Tomcat veterans might be pleased to learn that this system instance of Tomcat is installed
23 | with CATALINA_HOME
in /usr/share/tomcat10
and
24 | CATALINA_BASE
in /var/lib/tomcat10
, following the rules from
25 | /usr/share/doc/tomcat10-common/RUNNING.txt.gz
.
26 |
27 |
28 | You might consider installing the following packages, if you haven't already done so:
29 |
30 |
31 | tomcat10-docs : This package installs a web application that allows to browse the Tomcat
32 | 10 documentation locally. Once installed, you can access it by clicking
33 | here .
34 |
35 |
36 |
37 | tomcat10-examples : This package installs a web application that allows to access the
38 | Tomcat 10 Servlet and JSP examples. Once installed, you can access it by clicking
39 | here .
40 |
41 |
42 |
43 | tomcat10-admin : This package installs two web applications that can help managing this
44 | Tomcat instance. Once installed, you can access the
45 | manager webapp and the
46 | host-manager webapp .
47 |
48 |
49 |
50 | NOTE: For security reasons, using the manager webapp is restricted to users with role
51 | "manager-gui". The host-manager webapp is restricted to users with role "admin-gui". Users are
52 | defined in /etc/tomcat10/tomcat-users.xml
.
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/static/index.htm/index.htm/index.htm/index.htm/index.htm/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IIS Windows Server
6 |
26 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/static/index.htm/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Welcome to nginx!
5 |
15 |
16 |
17 | Welcome to nginx!
18 |
19 | If you see this page, the nginx web server is successfully installed and working. Further
20 | configuration is required.
21 |
22 |
23 |
24 | For online documentation and support please refer to
25 | nginx.org .
26 | Commercial support is available at
27 | nginx.com .
28 |
29 |
30 | Thank you for using nginx.
31 |
32 |
33 |
--------------------------------------------------------------------------------
/static/jetty.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/jetty.gif
--------------------------------------------------------------------------------
/static/litespeed/404-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/404-icon.png
--------------------------------------------------------------------------------
/static/litespeed/blocked_content-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/blocked_content-icon.png
--------------------------------------------------------------------------------
/static/litespeed/cgi-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/cgi-icon.png
--------------------------------------------------------------------------------
/static/litespeed/file_upload-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/file_upload-icon.png
--------------------------------------------------------------------------------
/static/litespeed/olsws_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/olsws_logo.png
--------------------------------------------------------------------------------
/static/litespeed/php-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/php-icon.png
--------------------------------------------------------------------------------
/static/litespeed/powered_by_ols-new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/powered_by_ols-new.png
--------------------------------------------------------------------------------
/static/litespeed/pwd_protect-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/litespeed/pwd_protect-icon.png
--------------------------------------------------------------------------------
/static/raq4/RaQ_stack.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/RaQ_stack.jpg
--------------------------------------------------------------------------------
/static/raq4/bkgnd1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/bkgnd1.gif
--------------------------------------------------------------------------------
/static/raq4/black_tile8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/black_tile8.gif
--------------------------------------------------------------------------------
/static/raq4/hint3_en.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/hint3_en.gif
--------------------------------------------------------------------------------
/static/raq4/p_nav_dots.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/p_nav_dots.gif
--------------------------------------------------------------------------------
/static/raq4/spacer1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/spacer1.gif
--------------------------------------------------------------------------------
/static/raq4/top_logo_black.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/raq4/top_logo_black.gif
--------------------------------------------------------------------------------
/static/retro/background.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/background.gif
--------------------------------------------------------------------------------
/static/retro/buttons/8minty.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/8minty.gif
--------------------------------------------------------------------------------
/static/retro/buttons/README.md:
--------------------------------------------------------------------------------
1 | buttons are in the static directory so vite doesn't inline them because ie5 [doesn't like big base64 data urls](https://support.microsoft.com/en-us/topic/maximum-url-length-is-2-083-characters-in-internet-explorer-174e7c8a-6666-f4e0-6fd6-908b53c12246).
2 |
--------------------------------------------------------------------------------
/static/retro/buttons/actuallyruben.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/actuallyruben.gif
--------------------------------------------------------------------------------
/static/retro/buttons/adryd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/adryd.png
--------------------------------------------------------------------------------
/static/retro/buttons/alula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/alula.png
--------------------------------------------------------------------------------
/static/retro/buttons/anythingbutchrome.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/anythingbutchrome.gif
--------------------------------------------------------------------------------
/static/retro/buttons/archbtw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/archbtw.png
--------------------------------------------------------------------------------
/static/retro/buttons/aubrey.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/aubrey.png
--------------------------------------------------------------------------------
/static/retro/buttons/caddy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/caddy.png
--------------------------------------------------------------------------------
/static/retro/buttons/cbax.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/cbax.gif
--------------------------------------------------------------------------------
/static/retro/buttons/dam.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/dam.gif
--------------------------------------------------------------------------------
/static/retro/buttons/edna.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/edna.png
--------------------------------------------------------------------------------
/static/retro/buttons/ezri.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/ezri.png
--------------------------------------------------------------------------------
/static/retro/buttons/fightforprivacy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/fightforprivacy.gif
--------------------------------------------------------------------------------
/static/retro/buttons/firefox.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/firefox.gif
--------------------------------------------------------------------------------
/static/retro/buttons/github.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/github.gif
--------------------------------------------------------------------------------
/static/retro/buttons/goldenstack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/goldenstack.png
--------------------------------------------------------------------------------
/static/retro/buttons/haylin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/haylin.png
--------------------------------------------------------------------------------
/static/retro/buttons/hetzner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/hetzner.gif
--------------------------------------------------------------------------------
/static/retro/buttons/honbra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/honbra.png
--------------------------------------------------------------------------------
/static/retro/buttons/internet-archive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/internet-archive.png
--------------------------------------------------------------------------------
/static/retro/buttons/izzy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/izzy.gif
--------------------------------------------------------------------------------
/static/retro/buttons/jamie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/jamie.png
--------------------------------------------------------------------------------
/static/retro/buttons/jamsharp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/jamsharp.png
--------------------------------------------------------------------------------
/static/retro/buttons/jordan.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/jordan.gif
--------------------------------------------------------------------------------
/static/retro/buttons/kibtytown.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/kibtytown.gif
--------------------------------------------------------------------------------
/static/retro/buttons/kofi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/kofi.gif
--------------------------------------------------------------------------------
/static/retro/buttons/lily.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/lily.png
--------------------------------------------------------------------------------
/static/retro/buttons/makeafish.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/makeafish.png
--------------------------------------------------------------------------------
/static/retro/buttons/mat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/mat.png
--------------------------------------------------------------------------------
/static/retro/buttons/matrix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/matrix.png
--------------------------------------------------------------------------------
/static/retro/buttons/mudkip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/mudkip.png
--------------------------------------------------------------------------------
/static/retro/buttons/nap.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/nap.gif
--------------------------------------------------------------------------------
/static/retro/buttons/netscape.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/netscape.gif
--------------------------------------------------------------------------------
/static/retro/buttons/notnite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/notnite.png
--------------------------------------------------------------------------------
/static/retro/buttons/patsore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/patsore.png
--------------------------------------------------------------------------------
/static/retro/buttons/pineapplecat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/pineapplecat.png
--------------------------------------------------------------------------------
/static/retro/buttons/rudrecciah.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/rudrecciah.png
--------------------------------------------------------------------------------
/static/retro/buttons/sandcat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/sandcat.png
--------------------------------------------------------------------------------
/static/retro/buttons/seized.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/seized.gif
--------------------------------------------------------------------------------
/static/retro/buttons/shwecky.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/shwecky.png
--------------------------------------------------------------------------------
/static/retro/buttons/sipacid.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/sipacid.gif
--------------------------------------------------------------------------------
/static/retro/buttons/slonk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/slonk.png
--------------------------------------------------------------------------------
/static/retro/buttons/ssi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/ssi.gif
--------------------------------------------------------------------------------
/static/retro/buttons/thunderbird.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/thunderbird.gif
--------------------------------------------------------------------------------
/static/retro/buttons/tor.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/tor.gif
--------------------------------------------------------------------------------
/static/retro/buttons/ublockorigin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/ublockorigin.png
--------------------------------------------------------------------------------
/static/retro/buttons/vscode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/vscode.gif
--------------------------------------------------------------------------------
/static/retro/buttons/yui.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/yui.gif
--------------------------------------------------------------------------------
/static/retro/buttons/zeroptr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/buttons/zeroptr.png
--------------------------------------------------------------------------------
/static/retro/comicsans.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/comicsans.ttf
--------------------------------------------------------------------------------
/static/retro/oneko.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/oneko.gif
--------------------------------------------------------------------------------
/static/retro/pressstart2p.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/pressstart2p.ttf
--------------------------------------------------------------------------------
/static/retro/purple4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/retro/purple4.gif
--------------------------------------------------------------------------------
/static/robots.txt:
--------------------------------------------------------------------------------
1 | # hi robots hope you're having a nice day :)
2 |
3 | User-agent: *
4 | Disallow:
5 |
--------------------------------------------------------------------------------
/static/security.txt:
--------------------------------------------------------------------------------
1 | email me at security@matdoes.dev or matrix @mat:matdoes.dev
2 |
--------------------------------------------------------------------------------
/static/stake-ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/stake-ad.png
--------------------------------------------------------------------------------
/static/wp-admin/images/w-logo-blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mat-1/matdoesdev/5295e1b627d87e1f7559fa6e138a72135e5a32f1/static/wp-admin/images/w-logo-blue.png
--------------------------------------------------------------------------------
/static/wp-admin/images/wordpress-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/wp-login.php.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Log In ‹ matdoes.dev — WordPress
6 |
7 |
14 |
21 |
28 |
29 |
30 |
31 |
32 |
117 |
118 |
119 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import staticAdapter from '@sveltejs/adapter-static'
2 | import preprocess from 'svelte-preprocess'
3 | import { mdsvex } from 'mdsvex'
4 |
5 | /** @type {import('@sveltejs/kit').Config} */
6 | const config = {
7 | // Consult https://github.com/sveltejs/svelte-preprocess
8 | // for more information about preprocessors
9 | preprocess: [
10 | preprocess(),
11 | mdsvex({
12 | extensions: ['.svx'],
13 | layout: './src/lib/PostLayout.svelte',
14 | }),
15 | ],
16 |
17 | extensions: ['.svelte', '.svx'],
18 |
19 | kit: {
20 | adapter: staticAdapter({
21 | precompress: true,
22 | fallback: 'fallback.html',
23 | }),
24 | prerender: {
25 | entries: [
26 | '*',
27 | '/404',
28 | '/451',
29 | '/minecraft-scanning/minecraft-server-background.png',
30 | // redirect /blog/* to /*
31 | '/blog/matdoes-dev-markdown',
32 | '/blog/minecraft-server-warner',
33 | '/blog/minecraft-scanning',
34 | '/blog/the-story-of-reportscammers',
35 | '/blog/uncovering-the-discord-twitch-bots',
36 | '/blog/what-are-domain-hacks',
37 | '/blog/who-is-mat',
38 | // sometimes /retro doesn't get prerendered if this isn't included
39 | '/retro',
40 | '/wp-admin.php',
41 | '/admin',
42 | ],
43 | handleHttpError: 'warn',
44 | },
45 | paths: {
46 | relative: false,
47 | },
48 | },
49 | }
50 |
51 | export default config
52 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "moduleResolution": "bundler",
4 | "module": "es2022",
5 | "lib": ["es2022", "DOM", "WebWorker"],
6 | "target": "es2020",
7 | /**
8 | svelte-preprocess cannot figure out whether you have a value or a type, so tell TypeScript
9 | to enforce using \`import type\` instead of \`import\` for Types.
10 | */
11 | "isolatedModules": true,
12 | "resolveJsonModule": true,
13 | /**
14 | To have warnings/errors of the Svelte compiler at the correct position,
15 | enable source maps by default.
16 | */
17 | "sourceMap": true,
18 | "esModuleInterop": true,
19 | "skipLibCheck": true,
20 | "forceConsistentCasingInFileNames": true,
21 | "baseUrl": ".",
22 | "allowJs": true,
23 | "checkJs": true,
24 | "strict": true,
25 | "paths": {
26 | "$lib": ["src/lib"],
27 | "$lib/*": ["src/lib/*"]
28 | }
29 | },
30 | "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts", "src/**/*.svelte"],
31 | "extends": "./.svelte-kit/tsconfig.json"
32 | }
33 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "github": {
3 | "silent": true
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite'
2 | import sharp from 'sharp'
3 | import fs from 'fs'
4 |
5 | /** @type {import('vite').UserConfig} */
6 | export default {
7 | plugins: [sveltekit(), pngToGifForRetro()],
8 |
9 | build: {
10 | target: 'es2022',
11 | },
12 | }
13 |
14 | /**
15 | * Convert the PNGs in the retro directory into GIFs, since some very old browsers don't support PNGs.
16 | * @returns {import('vite').Plugin}
17 | */
18 | function pngToGifForRetro() {
19 | return {
20 | name: 'png-to-gif',
21 | enforce: 'post',
22 | apply: 'build',
23 | closeBundle: async () => {
24 | // const baseDirectory = '.svelte-kit/output/client/retro'
25 | const baseDirectory = 'build/retro'
26 |
27 | let allFiles
28 | try {
29 | allFiles = await fs.promises.readdir(baseDirectory, {
30 | recursive: true,
31 | })
32 | } catch {
33 | console.warn(`Warning: Couldn't read ${baseDirectory} so gifs weren't generated`)
34 | return
35 | }
36 |
37 | const files = allFiles
38 | .filter((file) => file.endsWith('.png'))
39 | .map((file) => `${baseDirectory}/${file}`)
40 |
41 | const handles = files.map(async (publicFilePath) => {
42 | const newFilePath = publicFilePath.replace(/\.png$/, '.gif')
43 | console.log(publicFilePath, '->', newFilePath)
44 |
45 | // if it already exists, skip
46 | if (
47 | await fs.promises
48 | .access(newFilePath, fs.constants.F_OK)
49 | .then(() => true)
50 | .catch(() => false)
51 | ) {
52 | console.log(newFilePath, 'already exists, skipping')
53 | return
54 | }
55 |
56 | const pngBuffer = await fs.promises.readFile(publicFilePath)
57 | const gifBuffer = await sharp(pngBuffer).toFormat('gif').toBuffer()
58 |
59 | await fs.promises.writeFile(newFilePath, gifBuffer)
60 | console.log('wrote', newFilePath)
61 |
62 | // // convert the path to the output folder
63 | // const filePath: string = publicFilePath.replace(publicDir + sep, '');
64 | // const fullFilePath: string = join(outputPath, filePath);
65 |
66 | // if (fs.existsSync(fullFilePath) === false) return;
67 |
68 | // const { mtimeMs } = await fsp.stat(fullFilePath);
69 | // if (mtimeMs <= (mtimeCache.get(filePath) || 0)) return;
70 |
71 | // const buffer: Buffer = await fsp.readFile(fullFilePath);
72 | // const { content, skipWrite } = await processFile(filePath, buffer);
73 | // // write the file only if its optimized size < original size
74 | // if (content?.length > 0 && !skipWrite) {
75 | // await fsp.writeFile(fullFilePath, content);
76 | // mtimeCache.set(filePath, Date.now());
77 | // }
78 | })
79 | await Promise.all(handles)
80 | },
81 | }
82 | }
83 |
--------------------------------------------------------------------------------