this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit: Web Commons Initiative proposal with three workstreams, equal-thirds budget, single-source HTML generating full and one-pager PDFs

dietrich ayala fca9fedc

+1629
+7
.claude/settings.local.json
··· 1 + { 2 + "permissions": { 3 + "allow": [ 4 + "Bash(open:*)" 5 + ] 6 + } 7 + }
+1
.gitignore
··· 1 + node_modules/
+23
CLAUDE.md
··· 1 + # CLAUDE.md 2 + 3 + This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 + 5 + ## Project Overview 6 + 7 + This repo contains the "Web Commons Initiative" proposal — a multi-stakeholder web platform funding initiative. Two PDF versions are generated from a single source HTML. 8 + 9 + ## Commands 10 + 11 + - **Install dependencies:** `npm install` 12 + - **Generate PDFs:** `node generate-pdf.mjs` (produces both full and one-pager versions) 13 + 14 + ## Architecture 15 + 16 + - `web-commons.html` — Single source HTML with inline CSS. Contains all content for both versions. Sections use CSS classes to toggle visibility: 17 + - `.full-only` — shown only in the full version 18 + - `.brief-only` — shown only in the one-pager (condensed summaries of full-only sections) 19 + - `generate-pdf.mjs` — Generates two PDFs from the single HTML. The one-pager version adds `one-pager` class to `<body>` to hide full-only content and show brief-only content. 20 + - `web-commons-full.pdf` / `web-commons-one-pager.pdf` — Generated outputs. Re-run `node generate-pdf.mjs` after any HTML changes. 21 + - `README.md` — Working notes and original text for the initiative (not public-facing). 22 + 23 + The only dependency is Puppeteer. There is no build step, linting, or test suite.
+83
README.md
··· 1 + # Web Platform Funding MSI 2 + 3 + tl;dr: Multi-stakeholder initiative for funding work on web platform changes from standards/feature development and bug fixing in existing engines and also supporting a long term goal of a web platform engine which is independent of any one company, and collectively funded, governed, developed and maintained. 4 + 5 + ## Original text 6 + 7 + - Status quo is largely intractable while the three web engines are captive to single-business goals. 8 + - The long term goal is engine commodification. We can't place one bet on a leapfrog moment where AI makes that happen soon. 9 + - A theory-of-change approach of walking back from that state would be engine diversity. 10 + - While we need to develop a shareable framework for articulating *why*, Servo is best choice today as 4th major engine. 11 + - My preference is to name and brand the org in a way that keeps the scope door open, while clearly putting Servo up front as first major urgent initiative as a way to build allies and momentum. 12 + 13 + ## Problem statement 14 + 15 + - There are three web engines, each controlled by a single company 16 + - Each of those companies have their own business model 17 + - Each business model supports, benefits from the web 18 + - Each business model is conflict with a web that puts user needs first 19 + - This means that the shape of the web is difficult to change 20 + - It is slow to meet basic business needs outside of the three engine-makers 21 + - And only serves the largest common denominator 22 + - It's slow to react in crisis conditions 23 + - And does not serve those at the edges who need it most 24 + - The three web engine companies have no incentive to share power 25 + - Commodification of web engines is a long way off 26 + 27 + ## Scope & Activities 28 + 29 + two core streams: 30 + - features and fixes on existing web engines 31 + - rapidly driving towards an independent web engine 32 + 33 + what it does 34 + - identifies and organizes stakeholders 35 + - gathers and communicates stakeholder needs 36 + - drives collective decision-making on annual priorities 37 + - collects, pools and manages funds 38 + - deploys funding against those priorities 39 + - manages an ecosystem of implementers/maintainers (funding receivers) 40 + 41 + what it does not do 42 + - build software itself 43 + - create new standards separate from w3c/ietf/etc 44 + 45 + outcomes 46 + - coalition committed to an multi-stakeholder web engine (first in history) 47 + - circular sustaining ecosytem for collectively-governed web engine in 5yrs 48 + 49 + ## Stakeholders 50 + 51 + non-business 52 + - end users 53 + - policy makers / regulators 54 + - NGOs 55 + 56 + business 57 + - developer tools (eg Tauri) 58 + - phone makers (eg Huawei) 59 + - web engine makers 60 + - browser makers 61 + - publishers 62 + - dev consultancis (eg Igalia) 63 + 64 + two classes 65 + - non revenue generating 66 + - revenue generating 67 + 68 + ## Operations 69 + 70 + structure 71 + - non-profit foundation in a suitable european country 72 + - rotating board 73 + 74 + operations 75 + - staff: ED, admin 76 + - annual IRL meeting 77 + - quarterly remote stakeholder/community review meetings 78 + - monthly vendor meetings 79 + 80 + ## TODO 81 + 82 + - add timeline 83 + - no use of "consortium"
+35
generate-pdf.mjs
··· 1 + import puppeteer from 'puppeteer'; 2 + import { fileURLToPath } from 'url'; 3 + import { dirname, join } from 'path'; 4 + 5 + const __dirname = dirname(fileURLToPath(import.meta.url)); 6 + const htmlPath = join(__dirname, 'web-commons.html'); 7 + 8 + const browser = await puppeteer.launch(); 9 + 10 + // Full version 11 + const fullPage = await browser.newPage(); 12 + await fullPage.goto('file://' + htmlPath, { waitUntil: 'networkidle0' }); 13 + const fullPdf = join(__dirname, 'web-commons-full.pdf'); 14 + await fullPage.pdf({ 15 + path: fullPdf, 16 + format: 'A4', 17 + printBackground: true, 18 + margin: { top: 0, right: 0, bottom: 0, left: 0 }, 19 + }); 20 + console.log('PDF written to', fullPdf); 21 + 22 + // One-pager version (adds class to toggle visibility) 23 + const onePage = await browser.newPage(); 24 + await onePage.goto('file://' + htmlPath, { waitUntil: 'networkidle0' }); 25 + await onePage.evaluate(() => document.body.classList.add('one-pager')); 26 + const onePagerPdf = join(__dirname, 'web-commons-one-pager.pdf'); 27 + await onePage.pdf({ 28 + path: onePagerPdf, 29 + format: 'A4', 30 + printBackground: true, 31 + margin: { top: 0, right: 0, bottom: 0, left: 0 }, 32 + }); 33 + console.log('PDF written to', onePagerPdf); 34 + 35 + await browser.close();
+1129
package-lock.json
··· 1 + { 2 + "name": "web-funding", 3 + "lockfileVersion": 3, 4 + "requires": true, 5 + "packages": { 6 + "": { 7 + "dependencies": { 8 + "puppeteer": "^24.38.0" 9 + } 10 + }, 11 + "node_modules/@babel/code-frame": { 12 + "version": "7.29.0", 13 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", 14 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", 15 + "license": "MIT", 16 + "dependencies": { 17 + "@babel/helper-validator-identifier": "^7.28.5", 18 + "js-tokens": "^4.0.0", 19 + "picocolors": "^1.1.1" 20 + }, 21 + "engines": { 22 + "node": ">=6.9.0" 23 + } 24 + }, 25 + "node_modules/@babel/helper-validator-identifier": { 26 + "version": "7.28.5", 27 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 28 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 29 + "license": "MIT", 30 + "engines": { 31 + "node": ">=6.9.0" 32 + } 33 + }, 34 + "node_modules/@puppeteer/browsers": { 35 + "version": "2.13.0", 36 + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", 37 + "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", 38 + "license": "Apache-2.0", 39 + "dependencies": { 40 + "debug": "^4.4.3", 41 + "extract-zip": "^2.0.1", 42 + "progress": "^2.0.3", 43 + "proxy-agent": "^6.5.0", 44 + "semver": "^7.7.4", 45 + "tar-fs": "^3.1.1", 46 + "yargs": "^17.7.2" 47 + }, 48 + "bin": { 49 + "browsers": "lib/cjs/main-cli.js" 50 + }, 51 + "engines": { 52 + "node": ">=18" 53 + } 54 + }, 55 + "node_modules/@tootallnate/quickjs-emscripten": { 56 + "version": "0.23.0", 57 + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 58 + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", 59 + "license": "MIT" 60 + }, 61 + "node_modules/@types/node": { 62 + "version": "25.3.5", 63 + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz", 64 + "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", 65 + "license": "MIT", 66 + "optional": true, 67 + "dependencies": { 68 + "undici-types": "~7.18.0" 69 + } 70 + }, 71 + "node_modules/@types/yauzl": { 72 + "version": "2.10.3", 73 + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 74 + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 75 + "license": "MIT", 76 + "optional": true, 77 + "dependencies": { 78 + "@types/node": "*" 79 + } 80 + }, 81 + "node_modules/agent-base": { 82 + "version": "7.1.4", 83 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 84 + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 85 + "license": "MIT", 86 + "engines": { 87 + "node": ">= 14" 88 + } 89 + }, 90 + "node_modules/ansi-regex": { 91 + "version": "5.0.1", 92 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 93 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 94 + "license": "MIT", 95 + "engines": { 96 + "node": ">=8" 97 + } 98 + }, 99 + "node_modules/ansi-styles": { 100 + "version": "4.3.0", 101 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 102 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 103 + "license": "MIT", 104 + "dependencies": { 105 + "color-convert": "^2.0.1" 106 + }, 107 + "engines": { 108 + "node": ">=8" 109 + }, 110 + "funding": { 111 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 112 + } 113 + }, 114 + "node_modules/argparse": { 115 + "version": "2.0.1", 116 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 117 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 118 + "license": "Python-2.0" 119 + }, 120 + "node_modules/ast-types": { 121 + "version": "0.13.4", 122 + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 123 + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 124 + "license": "MIT", 125 + "dependencies": { 126 + "tslib": "^2.0.1" 127 + }, 128 + "engines": { 129 + "node": ">=4" 130 + } 131 + }, 132 + "node_modules/b4a": { 133 + "version": "1.8.0", 134 + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", 135 + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", 136 + "license": "Apache-2.0", 137 + "peerDependencies": { 138 + "react-native-b4a": "*" 139 + }, 140 + "peerDependenciesMeta": { 141 + "react-native-b4a": { 142 + "optional": true 143 + } 144 + } 145 + }, 146 + "node_modules/bare-events": { 147 + "version": "2.8.2", 148 + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", 149 + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", 150 + "license": "Apache-2.0", 151 + "peerDependencies": { 152 + "bare-abort-controller": "*" 153 + }, 154 + "peerDependenciesMeta": { 155 + "bare-abort-controller": { 156 + "optional": true 157 + } 158 + } 159 + }, 160 + "node_modules/bare-fs": { 161 + "version": "4.5.5", 162 + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", 163 + "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", 164 + "license": "Apache-2.0", 165 + "dependencies": { 166 + "bare-events": "^2.5.4", 167 + "bare-path": "^3.0.0", 168 + "bare-stream": "^2.6.4", 169 + "bare-url": "^2.2.2", 170 + "fast-fifo": "^1.3.2" 171 + }, 172 + "engines": { 173 + "bare": ">=1.16.0" 174 + }, 175 + "peerDependencies": { 176 + "bare-buffer": "*" 177 + }, 178 + "peerDependenciesMeta": { 179 + "bare-buffer": { 180 + "optional": true 181 + } 182 + } 183 + }, 184 + "node_modules/bare-os": { 185 + "version": "3.7.1", 186 + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.1.tgz", 187 + "integrity": "sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==", 188 + "license": "Apache-2.0", 189 + "engines": { 190 + "bare": ">=1.14.0" 191 + } 192 + }, 193 + "node_modules/bare-path": { 194 + "version": "3.0.0", 195 + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", 196 + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", 197 + "license": "Apache-2.0", 198 + "dependencies": { 199 + "bare-os": "^3.0.1" 200 + } 201 + }, 202 + "node_modules/bare-stream": { 203 + "version": "2.8.0", 204 + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", 205 + "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", 206 + "license": "Apache-2.0", 207 + "dependencies": { 208 + "streamx": "^2.21.0", 209 + "teex": "^1.0.1" 210 + }, 211 + "peerDependencies": { 212 + "bare-buffer": "*", 213 + "bare-events": "*" 214 + }, 215 + "peerDependenciesMeta": { 216 + "bare-buffer": { 217 + "optional": true 218 + }, 219 + "bare-events": { 220 + "optional": true 221 + } 222 + } 223 + }, 224 + "node_modules/bare-url": { 225 + "version": "2.3.2", 226 + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", 227 + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", 228 + "license": "Apache-2.0", 229 + "dependencies": { 230 + "bare-path": "^3.0.0" 231 + } 232 + }, 233 + "node_modules/basic-ftp": { 234 + "version": "5.2.0", 235 + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", 236 + "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", 237 + "license": "MIT", 238 + "engines": { 239 + "node": ">=10.0.0" 240 + } 241 + }, 242 + "node_modules/buffer-crc32": { 243 + "version": "0.2.13", 244 + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 245 + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 246 + "license": "MIT", 247 + "engines": { 248 + "node": "*" 249 + } 250 + }, 251 + "node_modules/callsites": { 252 + "version": "3.1.0", 253 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 254 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 255 + "license": "MIT", 256 + "engines": { 257 + "node": ">=6" 258 + } 259 + }, 260 + "node_modules/chromium-bidi": { 261 + "version": "14.0.0", 262 + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", 263 + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", 264 + "license": "Apache-2.0", 265 + "dependencies": { 266 + "mitt": "^3.0.1", 267 + "zod": "^3.24.1" 268 + }, 269 + "peerDependencies": { 270 + "devtools-protocol": "*" 271 + } 272 + }, 273 + "node_modules/cliui": { 274 + "version": "8.0.1", 275 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 276 + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 277 + "license": "ISC", 278 + "dependencies": { 279 + "string-width": "^4.2.0", 280 + "strip-ansi": "^6.0.1", 281 + "wrap-ansi": "^7.0.0" 282 + }, 283 + "engines": { 284 + "node": ">=12" 285 + } 286 + }, 287 + "node_modules/color-convert": { 288 + "version": "2.0.1", 289 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 290 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 291 + "license": "MIT", 292 + "dependencies": { 293 + "color-name": "~1.1.4" 294 + }, 295 + "engines": { 296 + "node": ">=7.0.0" 297 + } 298 + }, 299 + "node_modules/color-name": { 300 + "version": "1.1.4", 301 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 302 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 303 + "license": "MIT" 304 + }, 305 + "node_modules/cosmiconfig": { 306 + "version": "9.0.1", 307 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", 308 + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", 309 + "license": "MIT", 310 + "dependencies": { 311 + "env-paths": "^2.2.1", 312 + "import-fresh": "^3.3.0", 313 + "js-yaml": "^4.1.0", 314 + "parse-json": "^5.2.0" 315 + }, 316 + "engines": { 317 + "node": ">=14" 318 + }, 319 + "funding": { 320 + "url": "https://github.com/sponsors/d-fischer" 321 + }, 322 + "peerDependencies": { 323 + "typescript": ">=4.9.5" 324 + }, 325 + "peerDependenciesMeta": { 326 + "typescript": { 327 + "optional": true 328 + } 329 + } 330 + }, 331 + "node_modules/data-uri-to-buffer": { 332 + "version": "6.0.2", 333 + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", 334 + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", 335 + "license": "MIT", 336 + "engines": { 337 + "node": ">= 14" 338 + } 339 + }, 340 + "node_modules/debug": { 341 + "version": "4.4.3", 342 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 343 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 344 + "license": "MIT", 345 + "dependencies": { 346 + "ms": "^2.1.3" 347 + }, 348 + "engines": { 349 + "node": ">=6.0" 350 + }, 351 + "peerDependenciesMeta": { 352 + "supports-color": { 353 + "optional": true 354 + } 355 + } 356 + }, 357 + "node_modules/degenerator": { 358 + "version": "5.0.1", 359 + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 360 + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 361 + "license": "MIT", 362 + "dependencies": { 363 + "ast-types": "^0.13.4", 364 + "escodegen": "^2.1.0", 365 + "esprima": "^4.0.1" 366 + }, 367 + "engines": { 368 + "node": ">= 14" 369 + } 370 + }, 371 + "node_modules/devtools-protocol": { 372 + "version": "0.0.1581282", 373 + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", 374 + "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", 375 + "license": "BSD-3-Clause" 376 + }, 377 + "node_modules/emoji-regex": { 378 + "version": "8.0.0", 379 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 380 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 381 + "license": "MIT" 382 + }, 383 + "node_modules/end-of-stream": { 384 + "version": "1.4.5", 385 + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", 386 + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", 387 + "license": "MIT", 388 + "dependencies": { 389 + "once": "^1.4.0" 390 + } 391 + }, 392 + "node_modules/env-paths": { 393 + "version": "2.2.1", 394 + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 395 + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 396 + "license": "MIT", 397 + "engines": { 398 + "node": ">=6" 399 + } 400 + }, 401 + "node_modules/error-ex": { 402 + "version": "1.3.4", 403 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", 404 + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", 405 + "license": "MIT", 406 + "dependencies": { 407 + "is-arrayish": "^0.2.1" 408 + } 409 + }, 410 + "node_modules/escalade": { 411 + "version": "3.2.0", 412 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 413 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 414 + "license": "MIT", 415 + "engines": { 416 + "node": ">=6" 417 + } 418 + }, 419 + "node_modules/escodegen": { 420 + "version": "2.1.0", 421 + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 422 + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 423 + "license": "BSD-2-Clause", 424 + "dependencies": { 425 + "esprima": "^4.0.1", 426 + "estraverse": "^5.2.0", 427 + "esutils": "^2.0.2" 428 + }, 429 + "bin": { 430 + "escodegen": "bin/escodegen.js", 431 + "esgenerate": "bin/esgenerate.js" 432 + }, 433 + "engines": { 434 + "node": ">=6.0" 435 + }, 436 + "optionalDependencies": { 437 + "source-map": "~0.6.1" 438 + } 439 + }, 440 + "node_modules/esprima": { 441 + "version": "4.0.1", 442 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 443 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 444 + "license": "BSD-2-Clause", 445 + "bin": { 446 + "esparse": "bin/esparse.js", 447 + "esvalidate": "bin/esvalidate.js" 448 + }, 449 + "engines": { 450 + "node": ">=4" 451 + } 452 + }, 453 + "node_modules/estraverse": { 454 + "version": "5.3.0", 455 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 456 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 457 + "license": "BSD-2-Clause", 458 + "engines": { 459 + "node": ">=4.0" 460 + } 461 + }, 462 + "node_modules/esutils": { 463 + "version": "2.0.3", 464 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 465 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 466 + "license": "BSD-2-Clause", 467 + "engines": { 468 + "node": ">=0.10.0" 469 + } 470 + }, 471 + "node_modules/events-universal": { 472 + "version": "1.0.1", 473 + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", 474 + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", 475 + "license": "Apache-2.0", 476 + "dependencies": { 477 + "bare-events": "^2.7.0" 478 + } 479 + }, 480 + "node_modules/extract-zip": { 481 + "version": "2.0.1", 482 + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 483 + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 484 + "license": "BSD-2-Clause", 485 + "dependencies": { 486 + "debug": "^4.1.1", 487 + "get-stream": "^5.1.0", 488 + "yauzl": "^2.10.0" 489 + }, 490 + "bin": { 491 + "extract-zip": "cli.js" 492 + }, 493 + "engines": { 494 + "node": ">= 10.17.0" 495 + }, 496 + "optionalDependencies": { 497 + "@types/yauzl": "^2.9.1" 498 + } 499 + }, 500 + "node_modules/fast-fifo": { 501 + "version": "1.3.2", 502 + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 503 + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", 504 + "license": "MIT" 505 + }, 506 + "node_modules/fd-slicer": { 507 + "version": "1.1.0", 508 + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 509 + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 510 + "license": "MIT", 511 + "dependencies": { 512 + "pend": "~1.2.0" 513 + } 514 + }, 515 + "node_modules/get-caller-file": { 516 + "version": "2.0.5", 517 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 518 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 519 + "license": "ISC", 520 + "engines": { 521 + "node": "6.* || 8.* || >= 10.*" 522 + } 523 + }, 524 + "node_modules/get-stream": { 525 + "version": "5.2.0", 526 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 527 + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 528 + "license": "MIT", 529 + "dependencies": { 530 + "pump": "^3.0.0" 531 + }, 532 + "engines": { 533 + "node": ">=8" 534 + }, 535 + "funding": { 536 + "url": "https://github.com/sponsors/sindresorhus" 537 + } 538 + }, 539 + "node_modules/get-uri": { 540 + "version": "6.0.5", 541 + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", 542 + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", 543 + "license": "MIT", 544 + "dependencies": { 545 + "basic-ftp": "^5.0.2", 546 + "data-uri-to-buffer": "^6.0.2", 547 + "debug": "^4.3.4" 548 + }, 549 + "engines": { 550 + "node": ">= 14" 551 + } 552 + }, 553 + "node_modules/http-proxy-agent": { 554 + "version": "7.0.2", 555 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 556 + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 557 + "license": "MIT", 558 + "dependencies": { 559 + "agent-base": "^7.1.0", 560 + "debug": "^4.3.4" 561 + }, 562 + "engines": { 563 + "node": ">= 14" 564 + } 565 + }, 566 + "node_modules/https-proxy-agent": { 567 + "version": "7.0.6", 568 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 569 + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 570 + "license": "MIT", 571 + "dependencies": { 572 + "agent-base": "^7.1.2", 573 + "debug": "4" 574 + }, 575 + "engines": { 576 + "node": ">= 14" 577 + } 578 + }, 579 + "node_modules/import-fresh": { 580 + "version": "3.3.1", 581 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 582 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 583 + "license": "MIT", 584 + "dependencies": { 585 + "parent-module": "^1.0.0", 586 + "resolve-from": "^4.0.0" 587 + }, 588 + "engines": { 589 + "node": ">=6" 590 + }, 591 + "funding": { 592 + "url": "https://github.com/sponsors/sindresorhus" 593 + } 594 + }, 595 + "node_modules/ip-address": { 596 + "version": "10.1.0", 597 + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", 598 + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", 599 + "license": "MIT", 600 + "engines": { 601 + "node": ">= 12" 602 + } 603 + }, 604 + "node_modules/is-arrayish": { 605 + "version": "0.2.1", 606 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 607 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 608 + "license": "MIT" 609 + }, 610 + "node_modules/is-fullwidth-code-point": { 611 + "version": "3.0.0", 612 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 613 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 614 + "license": "MIT", 615 + "engines": { 616 + "node": ">=8" 617 + } 618 + }, 619 + "node_modules/js-tokens": { 620 + "version": "4.0.0", 621 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 622 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 623 + "license": "MIT" 624 + }, 625 + "node_modules/js-yaml": { 626 + "version": "4.1.1", 627 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 628 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 629 + "license": "MIT", 630 + "dependencies": { 631 + "argparse": "^2.0.1" 632 + }, 633 + "bin": { 634 + "js-yaml": "bin/js-yaml.js" 635 + } 636 + }, 637 + "node_modules/json-parse-even-better-errors": { 638 + "version": "2.3.1", 639 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 640 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 641 + "license": "MIT" 642 + }, 643 + "node_modules/lines-and-columns": { 644 + "version": "1.2.4", 645 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 646 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 647 + "license": "MIT" 648 + }, 649 + "node_modules/lru-cache": { 650 + "version": "7.18.3", 651 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 652 + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 653 + "license": "ISC", 654 + "engines": { 655 + "node": ">=12" 656 + } 657 + }, 658 + "node_modules/mitt": { 659 + "version": "3.0.1", 660 + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 661 + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", 662 + "license": "MIT" 663 + }, 664 + "node_modules/ms": { 665 + "version": "2.1.3", 666 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 667 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 668 + "license": "MIT" 669 + }, 670 + "node_modules/netmask": { 671 + "version": "2.0.2", 672 + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 673 + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 674 + "license": "MIT", 675 + "engines": { 676 + "node": ">= 0.4.0" 677 + } 678 + }, 679 + "node_modules/once": { 680 + "version": "1.4.0", 681 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 682 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 683 + "license": "ISC", 684 + "dependencies": { 685 + "wrappy": "1" 686 + } 687 + }, 688 + "node_modules/pac-proxy-agent": { 689 + "version": "7.2.0", 690 + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", 691 + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", 692 + "license": "MIT", 693 + "dependencies": { 694 + "@tootallnate/quickjs-emscripten": "^0.23.0", 695 + "agent-base": "^7.1.2", 696 + "debug": "^4.3.4", 697 + "get-uri": "^6.0.1", 698 + "http-proxy-agent": "^7.0.0", 699 + "https-proxy-agent": "^7.0.6", 700 + "pac-resolver": "^7.0.1", 701 + "socks-proxy-agent": "^8.0.5" 702 + }, 703 + "engines": { 704 + "node": ">= 14" 705 + } 706 + }, 707 + "node_modules/pac-resolver": { 708 + "version": "7.0.1", 709 + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", 710 + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 711 + "license": "MIT", 712 + "dependencies": { 713 + "degenerator": "^5.0.0", 714 + "netmask": "^2.0.2" 715 + }, 716 + "engines": { 717 + "node": ">= 14" 718 + } 719 + }, 720 + "node_modules/parent-module": { 721 + "version": "1.0.1", 722 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 723 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 724 + "license": "MIT", 725 + "dependencies": { 726 + "callsites": "^3.0.0" 727 + }, 728 + "engines": { 729 + "node": ">=6" 730 + } 731 + }, 732 + "node_modules/parse-json": { 733 + "version": "5.2.0", 734 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 735 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 736 + "license": "MIT", 737 + "dependencies": { 738 + "@babel/code-frame": "^7.0.0", 739 + "error-ex": "^1.3.1", 740 + "json-parse-even-better-errors": "^2.3.0", 741 + "lines-and-columns": "^1.1.6" 742 + }, 743 + "engines": { 744 + "node": ">=8" 745 + }, 746 + "funding": { 747 + "url": "https://github.com/sponsors/sindresorhus" 748 + } 749 + }, 750 + "node_modules/pend": { 751 + "version": "1.2.0", 752 + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 753 + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 754 + "license": "MIT" 755 + }, 756 + "node_modules/picocolors": { 757 + "version": "1.1.1", 758 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 759 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 760 + "license": "ISC" 761 + }, 762 + "node_modules/progress": { 763 + "version": "2.0.3", 764 + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 765 + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 766 + "license": "MIT", 767 + "engines": { 768 + "node": ">=0.4.0" 769 + } 770 + }, 771 + "node_modules/proxy-agent": { 772 + "version": "6.5.0", 773 + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", 774 + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", 775 + "license": "MIT", 776 + "dependencies": { 777 + "agent-base": "^7.1.2", 778 + "debug": "^4.3.4", 779 + "http-proxy-agent": "^7.0.1", 780 + "https-proxy-agent": "^7.0.6", 781 + "lru-cache": "^7.14.1", 782 + "pac-proxy-agent": "^7.1.0", 783 + "proxy-from-env": "^1.1.0", 784 + "socks-proxy-agent": "^8.0.5" 785 + }, 786 + "engines": { 787 + "node": ">= 14" 788 + } 789 + }, 790 + "node_modules/proxy-from-env": { 791 + "version": "1.1.0", 792 + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 793 + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 794 + "license": "MIT" 795 + }, 796 + "node_modules/pump": { 797 + "version": "3.0.4", 798 + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", 799 + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", 800 + "license": "MIT", 801 + "dependencies": { 802 + "end-of-stream": "^1.1.0", 803 + "once": "^1.3.1" 804 + } 805 + }, 806 + "node_modules/puppeteer": { 807 + "version": "24.38.0", 808 + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.38.0.tgz", 809 + "integrity": "sha512-abnJOBVoL9PQTLKSbYGm9mjNFyIPaTVj77J/6cS370dIQtcZMpx8wyZoAuBzR71Aoon6yvI71NEVFUsl3JU82g==", 810 + "hasInstallScript": true, 811 + "license": "Apache-2.0", 812 + "dependencies": { 813 + "@puppeteer/browsers": "2.13.0", 814 + "chromium-bidi": "14.0.0", 815 + "cosmiconfig": "^9.0.0", 816 + "devtools-protocol": "0.0.1581282", 817 + "puppeteer-core": "24.38.0", 818 + "typed-query-selector": "^2.12.1" 819 + }, 820 + "bin": { 821 + "puppeteer": "lib/cjs/puppeteer/node/cli.js" 822 + }, 823 + "engines": { 824 + "node": ">=18" 825 + } 826 + }, 827 + "node_modules/puppeteer-core": { 828 + "version": "24.38.0", 829 + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.38.0.tgz", 830 + "integrity": "sha512-zB3S/tksIhgi2gZRndUe07AudBz5SXOB7hqG0kEa9/YXWrGwlVlYm3tZtwKgfRftBzbmLQl5iwHkQQl04n/mWw==", 831 + "license": "Apache-2.0", 832 + "dependencies": { 833 + "@puppeteer/browsers": "2.13.0", 834 + "chromium-bidi": "14.0.0", 835 + "debug": "^4.4.3", 836 + "devtools-protocol": "0.0.1581282", 837 + "typed-query-selector": "^2.12.1", 838 + "webdriver-bidi-protocol": "0.4.1", 839 + "ws": "^8.19.0" 840 + }, 841 + "engines": { 842 + "node": ">=18" 843 + } 844 + }, 845 + "node_modules/require-directory": { 846 + "version": "2.1.1", 847 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 848 + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 849 + "license": "MIT", 850 + "engines": { 851 + "node": ">=0.10.0" 852 + } 853 + }, 854 + "node_modules/resolve-from": { 855 + "version": "4.0.0", 856 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 857 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 858 + "license": "MIT", 859 + "engines": { 860 + "node": ">=4" 861 + } 862 + }, 863 + "node_modules/semver": { 864 + "version": "7.7.4", 865 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", 866 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 867 + "license": "ISC", 868 + "bin": { 869 + "semver": "bin/semver.js" 870 + }, 871 + "engines": { 872 + "node": ">=10" 873 + } 874 + }, 875 + "node_modules/smart-buffer": { 876 + "version": "4.2.0", 877 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 878 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 879 + "license": "MIT", 880 + "engines": { 881 + "node": ">= 6.0.0", 882 + "npm": ">= 3.0.0" 883 + } 884 + }, 885 + "node_modules/socks": { 886 + "version": "2.8.7", 887 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", 888 + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", 889 + "license": "MIT", 890 + "dependencies": { 891 + "ip-address": "^10.0.1", 892 + "smart-buffer": "^4.2.0" 893 + }, 894 + "engines": { 895 + "node": ">= 10.0.0", 896 + "npm": ">= 3.0.0" 897 + } 898 + }, 899 + "node_modules/socks-proxy-agent": { 900 + "version": "8.0.5", 901 + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", 902 + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", 903 + "license": "MIT", 904 + "dependencies": { 905 + "agent-base": "^7.1.2", 906 + "debug": "^4.3.4", 907 + "socks": "^2.8.3" 908 + }, 909 + "engines": { 910 + "node": ">= 14" 911 + } 912 + }, 913 + "node_modules/source-map": { 914 + "version": "0.6.1", 915 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 916 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 917 + "license": "BSD-3-Clause", 918 + "optional": true, 919 + "engines": { 920 + "node": ">=0.10.0" 921 + } 922 + }, 923 + "node_modules/streamx": { 924 + "version": "2.23.0", 925 + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", 926 + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", 927 + "license": "MIT", 928 + "dependencies": { 929 + "events-universal": "^1.0.0", 930 + "fast-fifo": "^1.3.2", 931 + "text-decoder": "^1.1.0" 932 + } 933 + }, 934 + "node_modules/string-width": { 935 + "version": "4.2.3", 936 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 937 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 938 + "license": "MIT", 939 + "dependencies": { 940 + "emoji-regex": "^8.0.0", 941 + "is-fullwidth-code-point": "^3.0.0", 942 + "strip-ansi": "^6.0.1" 943 + }, 944 + "engines": { 945 + "node": ">=8" 946 + } 947 + }, 948 + "node_modules/strip-ansi": { 949 + "version": "6.0.1", 950 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 951 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 952 + "license": "MIT", 953 + "dependencies": { 954 + "ansi-regex": "^5.0.1" 955 + }, 956 + "engines": { 957 + "node": ">=8" 958 + } 959 + }, 960 + "node_modules/tar-fs": { 961 + "version": "3.1.2", 962 + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", 963 + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", 964 + "license": "MIT", 965 + "dependencies": { 966 + "pump": "^3.0.0", 967 + "tar-stream": "^3.1.5" 968 + }, 969 + "optionalDependencies": { 970 + "bare-fs": "^4.0.1", 971 + "bare-path": "^3.0.0" 972 + } 973 + }, 974 + "node_modules/tar-stream": { 975 + "version": "3.1.8", 976 + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", 977 + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", 978 + "license": "MIT", 979 + "dependencies": { 980 + "b4a": "^1.6.4", 981 + "bare-fs": "^4.5.5", 982 + "fast-fifo": "^1.2.0", 983 + "streamx": "^2.15.0" 984 + } 985 + }, 986 + "node_modules/teex": { 987 + "version": "1.0.1", 988 + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", 989 + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", 990 + "license": "MIT", 991 + "dependencies": { 992 + "streamx": "^2.12.5" 993 + } 994 + }, 995 + "node_modules/text-decoder": { 996 + "version": "1.2.7", 997 + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", 998 + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", 999 + "license": "Apache-2.0", 1000 + "dependencies": { 1001 + "b4a": "^1.6.4" 1002 + } 1003 + }, 1004 + "node_modules/tslib": { 1005 + "version": "2.8.1", 1006 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1007 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1008 + "license": "0BSD" 1009 + }, 1010 + "node_modules/typed-query-selector": { 1011 + "version": "2.12.1", 1012 + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", 1013 + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", 1014 + "license": "MIT" 1015 + }, 1016 + "node_modules/undici-types": { 1017 + "version": "7.18.2", 1018 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", 1019 + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", 1020 + "license": "MIT", 1021 + "optional": true 1022 + }, 1023 + "node_modules/webdriver-bidi-protocol": { 1024 + "version": "0.4.1", 1025 + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", 1026 + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", 1027 + "license": "Apache-2.0" 1028 + }, 1029 + "node_modules/wrap-ansi": { 1030 + "version": "7.0.0", 1031 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1032 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1033 + "license": "MIT", 1034 + "dependencies": { 1035 + "ansi-styles": "^4.0.0", 1036 + "string-width": "^4.1.0", 1037 + "strip-ansi": "^6.0.0" 1038 + }, 1039 + "engines": { 1040 + "node": ">=10" 1041 + }, 1042 + "funding": { 1043 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1044 + } 1045 + }, 1046 + "node_modules/wrappy": { 1047 + "version": "1.0.2", 1048 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1049 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1050 + "license": "ISC" 1051 + }, 1052 + "node_modules/ws": { 1053 + "version": "8.19.0", 1054 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", 1055 + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", 1056 + "license": "MIT", 1057 + "engines": { 1058 + "node": ">=10.0.0" 1059 + }, 1060 + "peerDependencies": { 1061 + "bufferutil": "^4.0.1", 1062 + "utf-8-validate": ">=5.0.2" 1063 + }, 1064 + "peerDependenciesMeta": { 1065 + "bufferutil": { 1066 + "optional": true 1067 + }, 1068 + "utf-8-validate": { 1069 + "optional": true 1070 + } 1071 + } 1072 + }, 1073 + "node_modules/y18n": { 1074 + "version": "5.0.8", 1075 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1076 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1077 + "license": "ISC", 1078 + "engines": { 1079 + "node": ">=10" 1080 + } 1081 + }, 1082 + "node_modules/yargs": { 1083 + "version": "17.7.2", 1084 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 1085 + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1086 + "license": "MIT", 1087 + "dependencies": { 1088 + "cliui": "^8.0.1", 1089 + "escalade": "^3.1.1", 1090 + "get-caller-file": "^2.0.5", 1091 + "require-directory": "^2.1.1", 1092 + "string-width": "^4.2.3", 1093 + "y18n": "^5.0.5", 1094 + "yargs-parser": "^21.1.1" 1095 + }, 1096 + "engines": { 1097 + "node": ">=12" 1098 + } 1099 + }, 1100 + "node_modules/yargs-parser": { 1101 + "version": "21.1.1", 1102 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1103 + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1104 + "license": "ISC", 1105 + "engines": { 1106 + "node": ">=12" 1107 + } 1108 + }, 1109 + "node_modules/yauzl": { 1110 + "version": "2.10.0", 1111 + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1112 + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1113 + "license": "MIT", 1114 + "dependencies": { 1115 + "buffer-crc32": "~0.2.3", 1116 + "fd-slicer": "~1.1.0" 1117 + } 1118 + }, 1119 + "node_modules/zod": { 1120 + "version": "3.25.76", 1121 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 1122 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 1123 + "license": "MIT", 1124 + "funding": { 1125 + "url": "https://github.com/sponsors/colinhacks" 1126 + } 1127 + } 1128 + } 1129 + }
+5
package.json
··· 1 + { 2 + "dependencies": { 3 + "puppeteer": "^24.38.0" 4 + } 5 + }
web-commons-full.pdf

This is a binary file and will not be displayed.

web-commons-one-pager.pdf

This is a binary file and will not be displayed.

+346
web-commons.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>The Web Commons Initiative</title> 7 + <style> 8 + :root { 9 + --ink: #1a1a2e; 10 + --accent: #2d6a4f; 11 + --accent-light: #d8f3dc; 12 + --muted: #555; 13 + --rule: #ccc; 14 + } 15 + * { margin: 0; padding: 0; box-sizing: border-box; } 16 + html { font-size: 14.5px; } 17 + body { 18 + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 19 + color: var(--ink); 20 + max-width: 800px; 21 + margin: 0 auto; 22 + padding: 2rem 2rem; 23 + line-height: 1.45; 24 + } 25 + 26 + header { margin-bottom: 1.5rem; border-bottom: 1px solid var(--accent); padding-bottom: 1.2rem; position: relative; } 27 + header h1 { font-size: 1.6rem; font-weight: 700; letter-spacing: -0.02em; } 28 + header .draft-date { 29 + position: absolute; 30 + top: 0; 31 + right: 0; 32 + font-size: 0.75rem; 33 + color: var(--muted); 34 + } 35 + header p.tagline { 36 + margin-top: 0.3rem; 37 + font-size: 1rem; 38 + color: var(--muted); 39 + max-width: 620px; 40 + } 41 + 42 + section { margin-bottom: 1.5rem; } 43 + h2 { 44 + font-size: 0.8rem; 45 + text-transform: uppercase; 46 + letter-spacing: 0.08em; 47 + color: var(--accent); 48 + margin-bottom: 0.4rem; 49 + } 50 + p, li { font-size: 0.9rem; color: var(--ink); } 51 + p + p { margin-top: 0.35rem; } 52 + ul { padding-left: 1.2rem; } 53 + li { margin-bottom: 0.2rem; } 54 + li::marker { color: var(--accent); } 55 + 56 + .two-col { 57 + display: grid; 58 + grid-template-columns: 1fr 1fr; 59 + gap: 1rem; 60 + } 61 + @media (max-width: 600px) { .two-col { grid-template-columns: 1fr; } } 62 + 63 + .callout { 64 + background: var(--accent-light); 65 + border-left: 4px solid var(--accent); 66 + padding: 0.5rem 0.8rem; 67 + border-radius: 0 4px 4px 0; 68 + margin-top: 0.4rem; 69 + } 70 + .callout p { font-size: 0.85rem; } 71 + 72 + .streams { 73 + display: grid; 74 + grid-template-columns: 1fr 1fr; 75 + gap: 0.8rem; 76 + margin-top: 0.5rem; 77 + } 78 + .streams.three-col { 79 + grid-template-columns: 1fr 1fr 1fr; 80 + } 81 + .streams > div { 82 + border: 1px solid var(--rule); 83 + border-radius: 6px; 84 + padding: 0.5rem 0.8rem; 85 + } 86 + .streams h3 { 87 + font-size: 0.85rem; 88 + font-weight: 600; 89 + margin-bottom: 0.25rem; 90 + } 91 + 92 + table.budget { 93 + width: 100%; 94 + border-collapse: collapse; 95 + margin-top: 0.4rem; 96 + font-size: 0.85rem; 97 + } 98 + table.budget th, table.budget td { 99 + text-align: left; 100 + padding: 0.3rem 0.6rem; 101 + border-bottom: 1px solid var(--rule); 102 + } 103 + table.budget th { 104 + font-size: 0.75rem; 105 + text-transform: uppercase; 106 + letter-spacing: 0.05em; 107 + color: var(--muted); 108 + } 109 + table.budget td:nth-child(2), 110 + table.budget th:nth-child(2) { text-align: right; } 111 + table.budget td:nth-child(3), 112 + table.budget th:nth-child(3) { text-align: right; } 113 + table.budget tr:last-child { font-weight: 600; } 114 + table.budget tr:last-child td { border-bottom: none; } 115 + 116 + table.funding-ramp { 117 + width: 100%; 118 + border-collapse: collapse; 119 + margin-top: 0.4rem; 120 + font-size: 0.85rem; 121 + } 122 + table.funding-ramp th, table.funding-ramp td { 123 + text-align: left; 124 + padding: 0.3rem 0.6rem; 125 + border-bottom: 1px solid var(--rule); 126 + } 127 + table.funding-ramp th { 128 + font-size: 0.75rem; 129 + text-transform: uppercase; 130 + letter-spacing: 0.05em; 131 + color: var(--muted); 132 + } 133 + table.funding-ramp td:nth-child(2), 134 + table.funding-ramp td:nth-child(3), 135 + table.funding-ramp td:nth-child(4), 136 + table.funding-ramp th:nth-child(2), 137 + table.funding-ramp th:nth-child(3), 138 + table.funding-ramp th:nth-child(4) { text-align: right; } 139 + 140 + 141 + /* Version toggling: .full-only hidden in one-pager, .brief-only hidden in full */ 142 + .brief-only { display: none; } 143 + body.one-pager .full-only { display: none; } 144 + body.one-pager .brief-only { display: block; } 145 + body.one-pager li.brief-only { display: list-item; } 146 + body.one-pager section.full-only { display: none; } 147 + 148 + /* Tighter spacing for one-pager */ 149 + body.one-pager { padding: 1.2rem 2rem; } 150 + body.one-pager header { margin-bottom: 1rem; padding-bottom: 0.8rem; } 151 + body.one-pager section { margin-bottom: 1rem; } 152 + 153 + footer { 154 + margin-top: 0.8rem; 155 + padding-top: 0.4rem; 156 + border-top: 1px solid var(--rule); 157 + font-size: 0.75rem; 158 + color: var(--muted); 159 + display: flex; 160 + justify-content: space-between; 161 + } 162 + footer a { color: var(--accent); text-decoration: none; } 163 + </style> 164 + </head> 165 + <body> 166 + 167 + <header> 168 + <span class="draft-date">Draft — March 2026</span> 169 + <h1>The Web Commons Initiative</h1> 170 + <p class="tagline">A multi-stakeholder initiative to collectively fund, govern, and advance the web platform — including the first independent, community-driven web engine.</p> 171 + </header> 172 + 173 + <section> 174 + <h2>The Web Is Not Ours</h2> 175 + <p>The web runs on three engines, each controlled by a single US company. The web's evolution is shaped by its gatekeepers — not users, governments, publishers, or the broader industry. The result: slow to change, serving only the largest common denominator, and failing those at the edges who need it most.</p> 176 + <p class="full-only">The engine-makers have no structural incentive to share power, and true engine diversity remains out of reach.</p> 177 + </section> 178 + 179 + <section> 180 + <h2>Proposal for a Web Commons</h2> 181 + <p>A non-profit foundation that pools resources from across the web's stakeholder community to fund three streams of work:</p> 182 + <div class="streams three-col"> 183 + <div> 184 + <h3>1. Fix &amp; Build in Existing Engines</h3> 185 + <p>Fund features, fixes, and standards work in today's engines — giving stakeholders collective voice and leverage.</p> 186 + </div> 187 + <div> 188 + <h3>2. An Independent Web Engine</h3> 189 + <p>Accelerate a fourth major engine — collectively funded and governed — starting with Servo, while exploring alternative approaches.</p> 190 + </div> 191 + <div> 192 + <h3>3. R&amp;D for the Future Web</h3> 193 + <p>Fund research into the longer-term future of browsers — new architectures, capabilities, and paradigms beyond what today's engines support.</p> 194 + </div> 195 + </div> 196 + </section> 197 + 198 + <section> 199 + <h2>What the Web Commons Foundation Does</h2> 200 + <ul> 201 + <li>Identify and organize stakeholders across sectors</li> 202 + <li>Gather and prioritize collective needs annually</li> 203 + <li>Pool and manage funds from members</li> 204 + <li>Deploy funding to an ecosystem of implementers and maintainers</li> 205 + <li>Coordinate — not compete with — existing standards bodies (W3C, IETF, etc.)</li> 206 + </ul> 207 + <div class="callout full-only"> 208 + <p><strong>What it does not do:</strong> build software directly or create new standards. It funds and coordinates the people who do.</p> 209 + </div> 210 + </section> 211 + 212 + <section class="full-only"> 213 + <h2>Who It's For</h2> 214 + <div class="two-col"> 215 + <div> 216 + <strong>Industry</strong> 217 + <ul> 218 + <li>Browser &amp; engine makers</li> 219 + <li>Device manufacturers</li> 220 + <li>Developer tools &amp; frameworks</li> 221 + <li>Publishers &amp; media</li> 222 + <li>Web consultancies &amp; implementers</li> 223 + </ul> 224 + </div> 225 + <div> 226 + <strong>Public Interest</strong> 227 + <ul> 228 + <li>End users &amp; digital rights advocates</li> 229 + <li>Policymakers &amp; regulators</li> 230 + <li>NGOs &amp; civil society</li> 231 + </ul> 232 + </div> 233 + </div> 234 + </section> 235 + 236 + <section> 237 + <h2>Structure &amp; Governance</h2> 238 + <ul> 239 + <li>European non-profit foundation with a rotating board</li> 240 + <li>Tiered membership: revenue-generating and non-revenue-generating</li> 241 + <li>Annual in-person summit, quarterly remote reviews, monthly working sessions</li> 242 + <li>Lean operations: Executive Director + administration</li> 243 + </ul> 244 + </section> 245 + 246 + <section> 247 + <h2>Budget &amp; Cost Breakdown</h2> 248 + 249 + <!-- One-pager: compact summary --> 250 + <p class="brief-only">€600K over three years (€200K/year), fully grant-funded. Split in thirds: staff, operations/events, and grants. Member dues begin year two; by year three the foundation is self-sustaining.</p> 251 + 252 + <!-- Full version: detailed table and explanation --> 253 + <div class="full-only"> 254 + <p>Target funding: €600K over three years (€200K/year), allocated in equal thirds:</p> 255 + <table class="budget"> 256 + <thead> 257 + <tr><th>Category</th><th>Annual</th><th>Share</th></tr> 258 + </thead> 259 + <tbody> 260 + <tr><td>Staff (Executive Director, Program Coordinator)</td><td>€67K</td><td>33%</td></tr> 261 + <tr><td>Operations &amp; events (legal, accounting, infrastructure, annual summit, quarterly reviews)</td><td>€67K</td><td>33%</td></tr> 262 + <tr><td>Grants &amp; commissions (engine work, standards contributions, R&amp;D)</td><td>€67K</td><td>33%</td></tr> 263 + <tr><td>Total</td><td>€200K</td><td>100%</td></tr> 264 + </tbody> 265 + </table> 266 + <p style="margin-top: 0.5rem;">Staff costs cover the two core roles that make the foundation operational: an Executive Director to lead strategy, stakeholder relationships, and fundraising, and a Program Coordinator to manage funded work, organize events, and handle day-to-day operations. The remaining two-thirds flow directly into the foundation's mission — operations and convenings that bring stakeholders together, and grants to implementers and researchers advancing the web platform.</p> 267 + </div> 268 + </section> 269 + 270 + <section class="full-only"> 271 + <h2>Funding Model &amp; Sustainability</h2> 272 + 273 + <!-- Full version: detailed ramp and membership tiers --> 274 + <div class="full-only"> 275 + <p>The €200K/year bootstrap budget is fully covered by grant funding (EU programs, philanthropic foundations) for the entire three-year establishment period. This is not a declining subsidy — the full baseline is secured upfront so the foundation can focus on building, not fundraising.</p> 276 + <p>Member dues collected during this period are additive. They expand the foundation's capacity beyond the baseline — funding additional grants, events, or staff as the coalition grows. The goal is not to backfill the bootstrap budget with member income, but to build a parallel revenue stream that is ready to sustain the foundation independently when the three-year grant period ends.</p> 277 + 278 + <table class="funding-ramp"> 279 + <thead> 280 + <tr><th></th><th>Year 1</th><th>Year 2</th><th>Year 3</th><th>Year 4+</th></tr> 281 + </thead> 282 + <tbody> 283 + <tr><td>Bootstrap grants</td><td>€200K</td><td>€200K</td><td>€200K</td><td>—</td></tr> 284 + <tr><td>Member dues (additive)</td><td>—</td><td>€80K</td><td>€150K</td><td>€200K+</td></tr> 285 + <tr><td style="font-weight: 600;">Total capacity</td><td style="font-weight: 600;">€200K</td><td style="font-weight: 600;">€280K</td><td style="font-weight: 600;">€350K</td><td style="font-weight: 600;">€200K+</td></tr> 286 + </tbody> 287 + </table> 288 + 289 + <p style="margin-top: 0.5rem;">Membership is tiered to ensure broad participation:</p> 290 + <ul> 291 + <li><strong>Large enterprises / major stakeholders:</strong> €15–25K/year</li> 292 + <li><strong>Mid-size companies:</strong> €5–10K/year</li> 293 + <li><strong>Small organizations &amp; startups:</strong> €1–3K/year</li> 294 + <li><strong>Non-revenue / NGO / academic:</strong> nominal or waived</li> 295 + </ul> 296 + <p style="margin-top: 0.35rem;">As the foundation demonstrates value through funded work, dues become self-reinforcing: members see direct returns through prioritized features and fixes, which attracts new members. By the end of year three, the member base is large enough to sustain baseline operations independently — and the foundation transitions from grant-funded to member-sustained without a gap.</p> 297 + </div> 298 + </section> 299 + 300 + <section> 301 + <h2>Three-Year Plan</h2> 302 + <div class="streams"> 303 + <div> 304 + <h3>Year 1 — Establish</h3> 305 + <ul> 306 + <li>Incorporate foundation, recruit founding members</li> 307 + <li>Hire Executive Director and minimal staff</li> 308 + <li>First stakeholder needs assessment</li> 309 + </ul> 310 + </div> 311 + <div> 312 + <h3>Year 2 — Coordinate</h3> 313 + <ul> 314 + <li>Formalize priority-setting and funding allocation</li> 315 + <li>Expand membership and stakeholder representation</li> 316 + <li>Direct initial funded work in existing engines</li> 317 + </ul> 318 + </div> 319 + </div> 320 + <div class="streams" style="margin-top: 0.8rem;"> 321 + <div> 322 + <h3>Year 3 — Ready to Drive</h3> 323 + <ul> 324 + <li>Governance and decision-making processes proven</li> 325 + <li>Member dues sufficient to sustain operations after bootstrap period</li> 326 + <li>Organization fully operational and ready to lead the larger engine initiative</li> 327 + </ul> 328 + </div> 329 + <div> 330 + <h3>Key Outcomes</h3> 331 + <ul> 332 + <li>The first-ever multi-stakeholder coalition for web platform governance</li> 333 + <li>A credible, funded organization ready to drive an independent web engine</li> 334 + <li>Collective priority-setting reshaping how the web evolves</li> 335 + </ul> 336 + </div> 337 + </div> 338 + </section> 339 + 340 + <footer> 341 + <span><a href="https://webtransitions.org">webtransitions.org</a></span> 342 + <span>March 2026</span> 343 + </footer> 344 + 345 + </body> 346 + </html>