From 574bf30504b75906ef86bd66df676c28db7553d0 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 3 May 2026 17:47:05 -0400 Subject: [PATCH] feat(web/m7-363): OG share-image placeholder + one-off generator --- tools/.gitignore | 1 + tools/gen-og-placeholder.mjs | 44 +++ tools/package-lock.json | 573 ++++++++++++++++++++++++++++++++++ tools/package.json | 11 + web/static/brand/og-image.png | Bin 0 -> 20517 bytes 5 files changed, 629 insertions(+) create mode 100644 tools/.gitignore create mode 100644 tools/gen-og-placeholder.mjs create mode 100644 tools/package-lock.json create mode 100644 tools/package.json create mode 100644 web/static/brand/og-image.png diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/tools/gen-og-placeholder.mjs b/tools/gen-og-placeholder.mjs new file mode 100644 index 00000000..d9c6893d --- /dev/null +++ b/tools/gen-og-placeholder.mjs @@ -0,0 +1,44 @@ +// One-off generator for the Minstrel OG / share-preview placeholder. +// Run with: cd tools && npm install && npm run gen-og-placeholder +// +// Produces ../web/static/brand/og-image.png at 1200x630, the standard +// OpenGraph aspect. The artwork is intentionally minimal — operators +// are encouraged to drop a hand-designed PNG over the same path; no +// code change is required to swap. +import sharp from 'sharp'; +import { mkdir } from 'node:fs/promises'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const outPath = resolve(__dirname, '../web/static/brand/og-image.png'); + +const W = 1200; +const H = 630; +const OBSIDIAN = '#14171A'; +const PARCHMENT = '#E8E4D8'; +const ACCENT = '#4A6B5C'; + +const svg = ` + + + Minstrel + + + Self-hosted music server + + +`; + +await mkdir(dirname(outPath), { recursive: true }); +await sharp(Buffer.from(svg)) + .png({ compressionLevel: 9 }) + .toFile(outPath); + +console.log(`wrote ${outPath}`); diff --git a/tools/package-lock.json b/tools/package-lock.json new file mode 100644 index 00000000..83fca6dd --- /dev/null +++ b/tools/package-lock.json @@ -0,0 +1,573 @@ +{ + "name": "minstrel-tools", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "minstrel-tools", + "devDependencies": { + "sharp": "^0.33.5" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + } + } +} diff --git a/tools/package.json b/tools/package.json new file mode 100644 index 00000000..f315f8a6 --- /dev/null +++ b/tools/package.json @@ -0,0 +1,11 @@ +{ + "name": "minstrel-tools", + "private": true, + "type": "module", + "scripts": { + "gen-og-placeholder": "node gen-og-placeholder.mjs" + }, + "devDependencies": { + "sharp": "^0.33.5" + } +} diff --git a/web/static/brand/og-image.png b/web/static/brand/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..5942c5a7e31852a361ea0e5b00749995f8259eba GIT binary patch literal 20517 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 KZr*K^Xa5f+yBqlc literal 0 HcmV?d00001