├── .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 | 30 |
31 |

{title}

32 | {#if subtitle} 33 |

{subtitle}

34 | {/if} 35 | 36 |
37 |
38 | {@render children?.()} 39 |
40 |
41 | 42 | 100 | -------------------------------------------------------------------------------- /src/lib/PostPreview.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 |
15 |
16 |

{post.title}

17 | 18 |
19 | 20 |
21 |
22 | {@html postHtml} 23 |
24 |
25 |
26 | 27 | 76 | -------------------------------------------------------------------------------- /src/lib/Project.svelte: -------------------------------------------------------------------------------- 1 | 41 | 42 |
43 |
44 |
45 |
46 |
47 | {#if href} 48 | 49 |

{name}

50 |
51 | {:else} 52 | 53 | {/if} 54 | 55 | {#if source} 56 | 57 | {#if source.startsWith('https://github.com/')} 58 | 59 | {:else} 60 | 61 | {/if} 62 | 63 | {/if} 64 | {#if languages.includes('python')} 65 | 66 | {/if} 67 | {#if languages.includes('svelte')} 68 | 69 | {/if} 70 | {#if languages.includes('rust')} 71 | 72 | {/if} 73 | {#if languages.includes('typescript')} 74 | 75 | {/if} 76 | {#if languages.includes('javascript')} 77 | 78 | {/if} 79 | 80 |

{@render children?.()}

81 |
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 | 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 | 141 | 142 | 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 | ![Screenshot of a post on the Hypixel Forums where a user named madcausebad11 says 'thats crazy but i dont remember asking'](thats-crazy-but-i-dont-remember-asking.png) 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 | ![Twitch partnership scam dm](https://i.matdoes.dev/NWRDK) 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 | ![Free nitro scam dm](https://i.matdoes.dev/YZBAZ) 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 | ![Scam bot list, new names](https://i.matdoes.dev/IJBSL) 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 | ![Free nitro download DM](https://i.matdoes.dev/PVZUR) 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 | ![Process monitor](https://i.matdoes.dev/60O9N) 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 | ![PyInstxtractor](https://i.matdoes.dev/QTWOT) 44 | 45 | ![Created on March 2nd](https://i.matdoes.dev/YOYVJ) 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 | ![Who wouldn't click that?](https://i.matdoes.dev/D81ZG) 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 | ![They joined!](https://i.matdoes.dev/TAA6M) 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 | !['wtf are you'](https://i.matdoes.dev/VJMW9) 71 | 72 | We asked kzh to join back again. 73 | 74 | ![Asking them to rejoin](https://i.matdoes.dev/GHAII) 75 | 76 | This led to this hilarious conversation. 77 | 78 | ![1](https://i.matdoes.dev/30HD2) 79 | ![2](https://i.matdoes.dev/9VJX1) 80 | ![3](https://i.matdoes.dev/TYQBO) 81 | ![4](https://i.matdoes.dev/MRIU1) 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 | ![Domain Hack Example](domain-hack-example.png) 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 | [![Domain Hack Generator](domain-hack-generator.png)](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 | 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 |
121 | 130 |
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 | 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 | 8 |
9 |
10 |

451

11 |

Unavailable For Legal Reasons

12 |
13 |
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 | 107 | 108 | {#if uptimeSeconds === undefined} 109 |

Loading...

110 | 115 | {/if} 116 |
117 |
118 | 119 | 120 |
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 |
165 |
166 |
167 |
168 | {/if} 169 |
170 |
171 |
172 | 173 | 238 | -------------------------------------------------------------------------------- /src/routes/(main)/admin/AdminGraph.svelte: -------------------------------------------------------------------------------- 1 | 42 | 43 |
44 | 45 | 46 | 47 |
48 | 49 | 62 | -------------------------------------------------------------------------------- /src/routes/(main)/blog/+page.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | matdoesdev blog 16 | 17 | 18 | 19 | 20 |
21 | 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 |
31 | 34 |

Projects

35 |
36 |
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 += `` 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 |
30 | 39 | 42 |
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 | 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 | 79 | 80 | 81 | 86 | 95 | 100 | 105 | 108 | 109 | 110 |
82 | 85 | 87 | 94 | 96 | 99 | 101 | 102 | Now playing: {playing ? currentSong : 'Nothing'} 103 | 104 | 106 | 107 |
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 |
  1. Launch your FTP application, wait for the FTP prompt.
  2. 31 |
  3. 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 |
  4. 35 |
  5. Type your user name when asked for login name, then press Return or Enter.
  6. 36 |
  7. Type your password when asked for password, then press Return or Enter.
  8. 37 |
  9. 38 | Type cd /web, press Return or Enter. This takes you to the directory for your site 39 | home page. 40 |
  10. 41 |
  11. 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 |
  12. 46 | 47 |
  13. 48 | Type quit, then press Return or Enter. This terminates the file transfer session. 49 |
  14. 50 |
  15. Done!
  16. 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 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 56 | 57 | 69 | 70 | 71 | 72 | 73 | 74 | 81 | 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 | Powered by Cherokee 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 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 |
KeyValue
Build DateSep 14 2024 at 03:56:51
Build Labelaolserver4_5
Build Platformlinux
Build Version4.5
Build Patch Level4.5.1
  
Binary/usr/local/aolserver/bin/nsd
Process ID28771
Uptime27
Host Nameuser-Standard-PC-Q35-ICH9-2009
Address127.0.1.1
Server Config/usr/local/aolserver/nsd.tcl
Server Log/usr/local/aolserver/log/server.log
Access Log/usr/local/aolserver/servers/server1/modules/nslog/access.log
  
Tcl Version8.6
Tcl Patch Level8.6.14
  
Home Directory/usr/local/aolserver
Page Root/usr/local/aolserver/servers/server1/pages
Tcl Library/usr/local/aolserver/servers/server1/modules/tcl
182 | 183 |

Loaded AOLserver Modules

184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 |
TypeNameLocation
Cnssock/usr/local/aolserver/bin/nssock.so
Cnslog/usr/local/aolserver/bin/nslog.so
Cnscp/usr/local/aolserver/bin/nscp.so
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 | IIS 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 |
33 |

Powered by WordPress

34 | 35 |
36 |

37 | 38 | 48 |

49 | 50 |
51 | 52 |
53 | 63 | 71 |
72 |
73 |

74 | 75 | 76 |

77 |

78 | 84 |

85 |
86 | 87 | 92 | 109 |

110 | ← Go to matdoes.dev 111 |

112 | 116 |
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 | --------------------------------------------------------------------------------