From d27792b813bfac0311a14eca0fa950d388287732 Mon Sep 17 00:00:00 2001 From: mileswa1q22 Date: Fri, 28 Aug 2026 23:02:38 -0500 Subject: [PATCH] working --- .gitignore | 1 + share-server/data/data.json | 39 ++ share-server/package-lock.json | 831 +++++++++++++++++++++++++++++++++ share-server/package.json | 16 + share-server/public/back.jpg | Bin 0 -> 27252 bytes share-server/server.js | 127 +++++ share-server/views/admin.html | 224 +++++++++ share-server/views/share.html | 320 +++++++++++++ share.html | 13 +- 9 files changed, 1570 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 share-server/data/data.json create mode 100644 share-server/package-lock.json create mode 100644 share-server/package.json create mode 100644 share-server/public/back.jpg create mode 100644 share-server/server.js create mode 100644 share-server/views/admin.html create mode 100644 share-server/views/share.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ae008c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +share-server/node_modules \ No newline at end of file diff --git a/share-server/data/data.json b/share-server/data/data.json new file mode 100644 index 0000000..f5c61f2 --- /dev/null +++ b/share-server/data/data.json @@ -0,0 +1,39 @@ +{ + "profile": { + "name": "miles wolf allen", + "handle": "@mileswa · software engineer", + "meta": "he/him · MN, USA", + "bio": "Developer and 3D artist interested in coding, games, and web technology. Currently learning Rust.", + "avatar": "https://avatars.githubusercontent.com/u/115095719?v=4", + "website": "https://milesallen.site" + }, + "timezone": { + "id": "America/Chicago", + "label": "Central Time (MN, USA)" + }, + "now": [ + ["Learning", "Rust"], + ["Building", "Vanilla music app"], + ["Playing", "Geometry Dash"] + ], + "posts": [ + { + "title": "Shipped Vanilla v2.0", + "body": "Rewrote the audio engine and added a custom queue. Huge QoL update.", + "date": "2026-08-24", + "link": "https://github.com/mileswolfallen2" + }, + { + "title": "Porting a classic to desktop", + "body": "Working on a native PC port of a retro game. Almost playable.", + "date": "2026-08-15", + "link": "" + }, + { + "title": "Learning Rust", + "body": "Picked up Rust for a systems project. Rotating on lifetimes right now.", + "date": "2026-07-30", + "link": "" + } + ] +} diff --git a/share-server/package-lock.json b/share-server/package-lock.json new file mode 100644 index 0000000..186ad20 --- /dev/null +++ b/share-server/package-lock.json @@ -0,0 +1,831 @@ +{ + "name": "miles-share-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "miles-share-server", + "version": "1.0.0", + "dependencies": { + "express": "^4.22.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/share-server/package.json b/share-server/package.json new file mode 100644 index 0000000..1bbc1a9 --- /dev/null +++ b/share-server/package.json @@ -0,0 +1,16 @@ +{ + "name": "miles-share-server", + "version": "1.0.0", + "description": "Node server for miles' share page — editable now status, latest posts, timezone, dark mode.", + "main": "server.js", + "type": "commonjs", + "scripts": { + "start": "node server.js" + }, + "engines": { + "node": ">=18" + }, + "dependencies": { + "express": "^4.22.2" + } +} diff --git a/share-server/public/back.jpg b/share-server/public/back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..acdc3057b1165a7eec6c9489979fc84759d1c9f7 GIT binary patch literal 27252 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 { + res.json(DB); +}); + +app.post('/api/data', (req, res) => { + if (!mustAuth(req)) return res.status(401).json({ error: 'unauthorized' }); + const body = req.body || {}; + const next = {}; + + if (body.profile) next.profile = sanitizeProfile(body.profile); + if (body.timezone) next.timezone = sanitizeTimezone(body.timezone); + if (body.now !== undefined) next.now = sanitizeNow(body.now); + if (body.posts !== undefined) next.posts = sanitizePosts(body.posts); + + if (Object.keys(next).length === 0) return res.status(400).json({ error: 'nothing to update' }); + + DB = { ...DB, ...next }; + saveData(DB); + res.json({ ok: true, data: DB }); +}); + +function sanitizeProfile(p) { + return { + name: str(p.name, ''), + handle: str(p.handle, ''), + meta: str(p.meta, ''), + bio: str(p.bio, ''), + avatar: str(p.avatar, ''), + website: str(p.website, '') + }; +} +function sanitizeTimezone(t) { + return { id: str(t.id, 'America/Chicago'), label: str(t.label, '') }; +} +function sanitizeNow(n) { + if (!Array.isArray(n)) return []; + return n + .filter((x) => Array.isArray(x) && x.length >= 2) + .map((x) => [str(x[0], ''), + str(x[1], '')]) + .filter((x) => x[0] || x[1]); +} +function sanitizePosts(ps) { + if (!Array.isArray(ps)) return []; + return ps + .filter((x) => x && typeof x === 'object') + .map((x) => ({ + title: str(x.title, ''), + body: str(x.body, ''), + date: str(x.date, ''), + link: str(x.link, '') + })) + .filter((x) => x.title); +} +function str(v, dflt) { + return typeof v === 'string' ? v.slice(0, 2000) : dflt; +} + +app.get('/admin', (req, res) => { + const html = fs.readFileSync(path.join(__dirname, 'views', 'admin.html'), 'utf8'); + res.set('Content-Type', 'text/html'); + res.send(html.replace('{{DATA}}', JSON.stringify(DB))); +}); + +app.get('/', (req, res) => { + const html = fs.readFileSync(path.join(__dirname, 'views', 'share.html'), 'utf8'); + res.set('Content-Type', 'text/html'); + res.send(html.replace('{{DATA}}', JSON.stringify(DB))); +}); + +app.listen(PORT, () => { + console.log(`share server running on http://localhost:${PORT}`); + console.log(`admin page: http://localhost:${PORT}/admin`); + console.log(`api: http://localhost:${PORT}/api/data`); +}); diff --git a/share-server/views/admin.html b/share-server/views/admin.html new file mode 100644 index 0000000..918f3a5 --- /dev/null +++ b/share-server/views/admin.html @@ -0,0 +1,224 @@ + + + + + +Edit — share page + + + + + + +
+ ← View page +

Edit share page

+

Changes save to the server's data file. Keep this link private.

+ +
+

Profile

+ + + + + + +
+ +
+

Now (current status)

+
+ +
+ +
+

Timezone

+ +

e.g. America/Chicago, America/Los_Angeles, Europe/London

+ +
+ +
+

Latest posts

+
+ +
+ +
+
+ + +
+ +
+
+ + + + diff --git a/share-server/views/share.html b/share-server/views/share.html new file mode 100644 index 0000000..d5e21cc --- /dev/null +++ b/share-server/views/share.html @@ -0,0 +1,320 @@ + + + + + +miles wolf allen + + + + + + + + + + + + +
+ + +
+ miles wolf allen +
+
+
·
+

+ + +
+ +
+
Now
+
+
+ +
+
Latest posts
+
+
+ +
+
Contact
+ + +
+
MN, USA
+
+
--:--
+
+
+
+ + +
+
+ +
made by miles
+ + + + diff --git a/share.html b/share.html index 3e82956..0e7d23e 100644 --- a/share.html +++ b/share.html @@ -167,7 +167,7 @@ miles wolf allen
miles wolf allen
@wolf_reaper90 · software engineer
-
he/him · MN, USA
+
he/him · MN, USA · local time --:--:--

Developer and 3D artist interested in coding, games, and web technology. Currently learning Rust. ↗ milesallen.site

@@ -274,6 +274,17 @@ flash(vcBtn, 'Saved!'); }); + function tzClock(){ + var d = new Date(), tf; + try { + tf = new Intl.DateTimeFormat('en-US', { timeZone:'America/Chicago', hour:'2-digit', minute:'2-digit', hour12:true }); + } catch(e){ return; } + var w = document.getElementById('tzWatch'); + if(w) w.textContent = 'local time ' + tf.format(d); + } + tzClock(); + setInterval(tzClock, 30000); + function copyText(txt, btn, done){ var ok = function(){ if(done) done(); }; var fail = function(){