This repository has no description
0

Configure Feed

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

web,bobbin,ci: add deploy for bobbin & web client

Signed-off-by: dawn <dawn@tangled.org>

author
dawn
date (Jul 30, 2026, 8:26 PM +0300) commit 7bbb8bbf parent 26c97874 change-id lwxsvozq
+807 -8
+35
.tangled/workflows/deploy-bobbin-dev.yml
··· 1 + when: 2 + - event: push 3 + branch: sv-fe 4 + paths: 5 + - bobbin/** 6 + - lexicons/** 7 + - Cargo.toml 8 + - Cargo.lock 9 + - rust-toolchain.toml 10 + 11 + engine: microvm 12 + image: nixos 13 + 14 + virtualisation: 15 + docker: true 16 + 17 + dependencies: 18 + - nodejs 19 + - pnpm 20 + 21 + steps: 22 + - name: install bobbin worker dependencies 23 + command: | 24 + cd bobbin/worker 25 + pnpm install --frozen-lockfile 26 + 27 + - name: typecheck bobbin worker 28 + command: | 29 + cd bobbin/worker 30 + pnpm run typecheck 31 + 32 + - name: deploy bobbin dev worker 33 + command: | 34 + cd bobbin/worker 35 + pnpm exec wrangler deploy --config wrangler.dev.jsonc
+47
.tangled/workflows/deploy-web-dev.yml
··· 1 + when: 2 + - event: push 3 + branch: sv-fe 4 + paths: 5 + - web/** 6 + - flake.nix 7 + - flake.lock 8 + - nix/pkgs/web-static-files.nix 9 + 10 + engine: microvm 11 + image: alpine 12 + 13 + environment: 14 + SVELTE_ADAPTER: cloudflare 15 + VITE_OAUTH_CLIENT_ID: https://next.tangled.org/oauth-client-metadata.json 16 + VITE_OAUTH_REDIRECT_URI: https://next.tangled.org/oauth/callback 17 + 18 + steps: 19 + - name: install nodejs, pnpm 20 + command: apk add nodejs pnpm 21 + 22 + - name: install web dependencies 23 + command: | 24 + cd web 25 + pnpm install --frozen-lockfile 26 + 27 + - name: sync web static assets 28 + command: | 29 + out=$(nix build .#web-static-files --no-link --print-out-paths) 30 + mkdir -p web/static 31 + rm -rf web/static/fonts web/static/logos 32 + cp -fr --no-preserve=ownership,mode "$out"/* web/static 33 + 34 + - name: run web unit tests 35 + command: | 36 + cd web 37 + pnpm run test:unit -- --run 38 + 39 + - name: build web 40 + command: | 41 + cd web 42 + pnpm run build 43 + 44 + - name: deploy web dev worker 45 + command: | 46 + cd web 47 + pnpm exec wrangler deploy --config wrangler.dev.jsonc
+16 -1
bobbin/containerfiles/bobbin.Containerfile
··· 3 3 ca-certificates pkg-config perl make cmake clang mold \ 4 4 && rm -rf /var/lib/apt/lists/* 5 5 ENV RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=mold" 6 + RUN rustup toolchain install 1.96.0 \ 7 + --profile minimal \ 8 + --component rustfmt \ 9 + --component clippy \ 10 + --target wasm32-unknown-unknown \ 11 + --no-self-update 12 + ENV CC=clang 13 + ENV CXX=clang++ 6 14 ARG BOBBIN_PROFILE=release 7 15 WORKDIR /src 8 16 COPY Cargo.toml Cargo.lock rust-toolchain.toml ./ 9 17 COPY lexicons ./lexicons 10 18 COPY bobbin ./bobbin 11 - COPY shuttle ./shuttle 19 + # keep image lighter by not copying in shittle, knot2 20 + # does however need some cargo toml patchings 21 + RUN sed -i \ 22 + -e 's/, "shuttle"//' \ 23 + -e 's/, "knot2\/crates\/\*"//' \ 24 + -e '/^knot-[a-z0-9-]* = { path = "knot2\/crates\//d' \ 25 + -e '/^gix-pack = { path = "knot2\/third_party\/gix-pack" }/d' \ 26 + Cargo.toml 12 27 RUN cargo build --profile ${BOBBIN_PROFILE} --bin bobbin --package bobbin 13 28 RUN if [ "${BOBBIN_PROFILE}" = "release" ]; then strip target/${BOBBIN_PROFILE}/bobbin; fi 14 29
+2 -2
bobbin/worker/src/index.ts
··· 31 31 32 32 const CORS_HEADERS = { 33 33 "Access-Control-Allow-Origin": "*", 34 - "Access-Control-Allow-Methods": "GET, HEAD, OPTIONS", 35 - "Access-Control-Allow-Headers": "Content-Type, Authorization", 34 + "Access-Control-Allow-Methods": "GET, HEAD, POST, OPTIONS", 35 + "Access-Control-Allow-Headers": "Content-Type, Authorization, atproto-proxy", 36 36 "Access-Control-Max-Age": "86400", 37 37 }; 38 38
+48
bobbin/worker/wrangler.dev.jsonc
··· 1 + { 2 + "$schema": "node_modules/wrangler/config-schema.json", 3 + "name": "bobbin-svfe-dev", 4 + "main": "src/index.ts", 5 + "workers_dev": false, 6 + "compatibility_date": "2026-03-07", 7 + "observability": { 8 + "enabled": true, 9 + }, 10 + "containers": [ 11 + { 12 + "class_name": "BobbinContainer", 13 + "image": "../containerfiles/bobbin.Containerfile", 14 + "image_build_context": "../../", 15 + "instance_type": "standard-2", 16 + "max_instances": 1, 17 + }, 18 + ], 19 + "durable_objects": { 20 + "bindings": [ 21 + { 22 + "name": "BOBBIN", 23 + "class_name": "BobbinContainer", 24 + }, 25 + ], 26 + }, 27 + "migrations": [ 28 + { 29 + "tag": "v1", 30 + "new_sqlite_classes": ["BobbinContainer"], 31 + }, 32 + ], 33 + "ratelimits": [ 34 + { 35 + "name": "RATE_LIMITER", 36 + "namespace_id": "1002", 37 + "simple": { 38 + "limit": 300, 39 + "period": 60, 40 + }, 41 + }, 42 + ], 43 + "vars": { 44 + "BOBBIN_HYDRANT_URL": "https://hyd.bob.oyster.cafe", 45 + "BOBBIN_SLINGSHOT_URL": "https://slng.bob.oyster.cafe", 46 + "BOBBIN_LOG": "info", 47 + }, 48 + }
+3 -1
web/package.json
··· 34 34 "@storybook/addon-svelte-csf": "^5.1.2", 35 35 "@storybook/addon-vitest": "^10.5.0", 36 36 "@storybook/sveltekit": "^10.5.0", 37 + "@sveltejs/adapter-cloudflare": "^7.2.9", 37 38 "@sveltejs/adapter-node": "^5.5.7", 38 39 "@sveltejs/kit": "^2.69.3", 39 40 "@sveltejs/vite-plugin-svelte": "^7.2.0", ··· 61 62 "typescript-eslint": "^8.64.0", 62 63 "unplugin-icons": "^23.0.1", 63 64 "vite": "^8.1.4", 64 - "vitest": "^4.1.10" 65 + "vitest": "^4.1.10", 66 + "wrangler": "^4.75.0" 65 67 }, 66 68 "dependencies": { 67 69 "@atcute/atproto": "^4.0.3",
+586
web/pnpm-lock.yaml
··· 84 84 '@storybook/sveltekit': 85 85 specifier: ^10.5.0 86 86 version: 10.5.0(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.0(@types/react@19.2.17)(prettier@3.9.5)(react@19.2.7))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) 87 + '@sveltejs/adapter-cloudflare': 88 + specifier: ^7.2.9 89 + version: 7.2.9(@sveltejs/kit@2.69.3(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(typescript@6.0.3)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(wrangler@4.115.0) 87 90 '@sveltejs/adapter-node': 88 91 specifier: ^5.5.7 89 92 version: 5.5.7(@sveltejs/kit@2.69.3(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(typescript@6.0.3)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))) ··· 168 171 vitest: 169 172 specifier: ^4.1.10 170 173 version: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) 174 + wrangler: 175 + specifier: ^4.75.0 176 + version: 4.115.0 171 177 172 178 packages: 173 179 ··· 327 333 peerDependencies: 328 334 storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 329 335 336 + '@cloudflare/kv-asset-handler@0.5.0': 337 + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} 338 + engines: {node: '>=22.0.0'} 339 + 340 + '@cloudflare/unenv-preset@2.16.1': 341 + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} 342 + peerDependencies: 343 + unenv: 2.0.0-rc.24 344 + workerd: '>1.20260305.0 <2.0.0-0' 345 + peerDependenciesMeta: 346 + workerd: 347 + optional: true 348 + 349 + '@cloudflare/workerd-darwin-64@1.20260722.1': 350 + resolution: {integrity: sha512-vZOP8vIS3NwnuaO+gz0FZ7kIGeiO3bZmxV35Ph9zOXKSREhDFlH7wQ7mkCdhW3O4jnXsew+XT7b+DNEI2CcJGQ==} 351 + engines: {node: '>=16'} 352 + cpu: [x64] 353 + os: [darwin] 354 + 355 + '@cloudflare/workerd-darwin-arm64@1.20260722.1': 356 + resolution: {integrity: sha512-EmIQymihDq6WNdER4+LF8Qn80yqayBUpJ+tkOO7wmY8pmgfyXjIUFNXotl21AHovTeu2seR7HdVUgeN/BilCWw==} 357 + engines: {node: '>=16'} 358 + cpu: [arm64] 359 + os: [darwin] 360 + 361 + '@cloudflare/workerd-linux-64@1.20260722.1': 362 + resolution: {integrity: sha512-jvZ3k9fxcnEn04s80CgIYxQfpOyAiz/8qC42DP8EBa9tR27qWyg9wmm31zIobVlrgBZn/+8NfdP73avRGcQOjQ==} 363 + engines: {node: '>=16'} 364 + cpu: [x64] 365 + os: [linux] 366 + 367 + '@cloudflare/workerd-linux-arm64@1.20260722.1': 368 + resolution: {integrity: sha512-BOSB55SMNdy+DA5uj2WirgiNanpHGis5PVvXH1wSfvjRKr4JGgWK+EZzxz0RFUo6QjjQQC/NimEzNZ7va7jmKg==} 369 + engines: {node: '>=16'} 370 + cpu: [arm64] 371 + os: [linux] 372 + 373 + '@cloudflare/workerd-windows-64@1.20260722.1': 374 + resolution: {integrity: sha512-sYM8YgUpKnRz2xjvdJLX1Ojzoi4MlA4gk8WTTExhGydjYB2UTs5NIbv0ZmpKgMoK9io3ixgmiW56ZnTbcWOdiA==} 375 + engines: {node: '>=16'} 376 + cpu: [x64] 377 + os: [win32] 378 + 379 + '@cloudflare/workers-types@4.20260702.1': 380 + resolution: {integrity: sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==} 381 + 382 + '@cspotcode/source-map-support@0.8.1': 383 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 384 + engines: {node: '>=12'} 385 + 330 386 '@emnapi/core@1.11.1': 331 387 resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} 332 388 ··· 575 631 '@iconify/utils@3.1.4': 576 632 resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} 577 633 634 + '@img/colour@1.1.0': 635 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 636 + engines: {node: '>=18'} 637 + 638 + '@img/sharp-darwin-arm64@0.35.2': 639 + resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} 640 + engines: {node: '>=20.9.0'} 641 + cpu: [arm64] 642 + os: [darwin] 643 + 644 + '@img/sharp-darwin-x64@0.35.2': 645 + resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} 646 + engines: {node: '>=20.9.0'} 647 + cpu: [x64] 648 + os: [darwin] 649 + 650 + '@img/sharp-freebsd-wasm32@0.35.2': 651 + resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} 652 + engines: {node: '>=20.9.0'} 653 + os: [freebsd] 654 + 655 + '@img/sharp-libvips-darwin-arm64@1.3.1': 656 + resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} 657 + cpu: [arm64] 658 + os: [darwin] 659 + 660 + '@img/sharp-libvips-darwin-x64@1.3.1': 661 + resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} 662 + cpu: [x64] 663 + os: [darwin] 664 + 665 + '@img/sharp-libvips-linux-arm64@1.3.1': 666 + resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} 667 + cpu: [arm64] 668 + os: [linux] 669 + libc: [glibc] 670 + 671 + '@img/sharp-libvips-linux-arm@1.3.1': 672 + resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} 673 + cpu: [arm] 674 + os: [linux] 675 + libc: [glibc] 676 + 677 + '@img/sharp-libvips-linux-ppc64@1.3.1': 678 + resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} 679 + cpu: [ppc64] 680 + os: [linux] 681 + libc: [glibc] 682 + 683 + '@img/sharp-libvips-linux-riscv64@1.3.1': 684 + resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} 685 + cpu: [riscv64] 686 + os: [linux] 687 + libc: [glibc] 688 + 689 + '@img/sharp-libvips-linux-s390x@1.3.1': 690 + resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} 691 + cpu: [s390x] 692 + os: [linux] 693 + libc: [glibc] 694 + 695 + '@img/sharp-libvips-linux-x64@1.3.1': 696 + resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} 697 + cpu: [x64] 698 + os: [linux] 699 + libc: [glibc] 700 + 701 + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': 702 + resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} 703 + cpu: [arm64] 704 + os: [linux] 705 + libc: [musl] 706 + 707 + '@img/sharp-libvips-linuxmusl-x64@1.3.1': 708 + resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} 709 + cpu: [x64] 710 + os: [linux] 711 + libc: [musl] 712 + 713 + '@img/sharp-linux-arm64@0.35.2': 714 + resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} 715 + engines: {node: '>=20.9.0'} 716 + cpu: [arm64] 717 + os: [linux] 718 + libc: [glibc] 719 + 720 + '@img/sharp-linux-arm@0.35.2': 721 + resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} 722 + engines: {node: '>=20.9.0'} 723 + cpu: [arm] 724 + os: [linux] 725 + libc: [glibc] 726 + 727 + '@img/sharp-linux-ppc64@0.35.2': 728 + resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} 729 + engines: {node: '>=20.9.0'} 730 + cpu: [ppc64] 731 + os: [linux] 732 + libc: [glibc] 733 + 734 + '@img/sharp-linux-riscv64@0.35.2': 735 + resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} 736 + engines: {node: '>=20.9.0'} 737 + cpu: [riscv64] 738 + os: [linux] 739 + libc: [glibc] 740 + 741 + '@img/sharp-linux-s390x@0.35.2': 742 + resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} 743 + engines: {node: '>=20.9.0'} 744 + cpu: [s390x] 745 + os: [linux] 746 + libc: [glibc] 747 + 748 + '@img/sharp-linux-x64@0.35.2': 749 + resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} 750 + engines: {node: '>=20.9.0'} 751 + cpu: [x64] 752 + os: [linux] 753 + libc: [glibc] 754 + 755 + '@img/sharp-linuxmusl-arm64@0.35.2': 756 + resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} 757 + engines: {node: '>=20.9.0'} 758 + cpu: [arm64] 759 + os: [linux] 760 + libc: [musl] 761 + 762 + '@img/sharp-linuxmusl-x64@0.35.2': 763 + resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} 764 + engines: {node: '>=20.9.0'} 765 + cpu: [x64] 766 + os: [linux] 767 + libc: [musl] 768 + 769 + '@img/sharp-wasm32@0.35.2': 770 + resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} 771 + engines: {node: '>=20.9.0'} 772 + 773 + '@img/sharp-webcontainers-wasm32@0.35.2': 774 + resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} 775 + engines: {node: '>=20.9.0'} 776 + cpu: [wasm32] 777 + 778 + '@img/sharp-win32-arm64@0.35.2': 779 + resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} 780 + engines: {node: '>=20.9.0'} 781 + cpu: [arm64] 782 + os: [win32] 783 + 784 + '@img/sharp-win32-ia32@0.35.2': 785 + resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} 786 + engines: {node: ^20.9.0} 787 + cpu: [ia32] 788 + os: [win32] 789 + 790 + '@img/sharp-win32-x64@0.35.2': 791 + resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} 792 + engines: {node: '>=20.9.0'} 793 + cpu: [x64] 794 + os: [win32] 795 + 578 796 '@jridgewell/gen-mapping@0.3.13': 579 797 resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 580 798 ··· 591 809 '@jridgewell/trace-mapping@0.3.31': 592 810 resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 593 811 812 + '@jridgewell/trace-mapping@0.3.9': 813 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 814 + 594 815 '@mdit/plugin-alert@1.0.1': 595 816 resolution: {integrity: sha512-gEZgbwlK2JSNIW3izqQyPoYJ8NXAEU0aON7XYpUHBzyD9km+ny5zFkAmoogMAzR8ird8iCQiK5pSv3nOtPBlLw==} 596 817 engines: {node: '>=22'} ··· 887 1108 888 1109 '@polka/url@1.0.0-next.29': 889 1110 resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 1111 + 1112 + '@poppinss/colors@4.1.6': 1113 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 1114 + 1115 + '@poppinss/dumper@0.6.5': 1116 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 1117 + 1118 + '@poppinss/exception@1.2.3': 1119 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 890 1120 891 1121 '@rolldown/binding-android-arm64@1.1.5': 892 1122 resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} ··· 1169 1399 cpu: [x64] 1170 1400 os: [win32] 1171 1401 1402 + '@sindresorhus/is@7.2.0': 1403 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 1404 + engines: {node: '>=18'} 1405 + 1406 + '@speed-highlight/core@1.2.17': 1407 + resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} 1408 + 1172 1409 '@standard-schema/spec@1.1.0': 1173 1410 resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 1174 1411 ··· 1288 1525 peerDependencies: 1289 1526 acorn: ^8.9.0 1290 1527 1528 + '@sveltejs/adapter-cloudflare@7.2.9': 1529 + resolution: {integrity: sha512-LEfLRYKZIiNYBPYk9Cu4dFCCIX37NO96jESNRDv7yr3vvblKU4Yh05FPUMRSrOWFKtG6bJcGIvdG/M2DSf4D1w==} 1530 + peerDependencies: 1531 + '@sveltejs/kit': ^2.0.0 1532 + wrangler: ^4.0.0 1533 + 1291 1534 '@sveltejs/adapter-node@5.5.7': 1292 1535 resolution: {integrity: sha512-uOfc9eVlI3A37RRSaKcgrheBYPrfJwC9VMqDp8x/O6tlKdcLLvHThSWD0KNIbjQ/d+7bwLGx3vx6aowAcRfd2g==} 1293 1536 peerDependencies: ··· 1667 1910 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 1668 1911 engines: {node: 18 || 20 || >=22} 1669 1912 1913 + blake3-wasm@2.1.5: 1914 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 1915 + 1670 1916 brace-expansion@5.0.7: 1671 1917 resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} 1672 1918 engines: {node: 18 || 20 || >=22} ··· 1726 1972 resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 1727 1973 engines: {node: '>= 0.6'} 1728 1974 1975 + cookie@1.1.1: 1976 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 1977 + engines: {node: '>=18'} 1978 + 1729 1979 cross-spawn@7.0.6: 1730 1980 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1731 1981 engines: {node: '>= 8'} ··· 1848 2098 entities@8.0.0: 1849 2099 resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} 1850 2100 engines: {node: '>=20.19.0'} 2101 + 2102 + error-stack-parser-es@1.0.5: 2103 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 1851 2104 1852 2105 es-errors@1.3.0: 1853 2106 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} ··· 2302 2555 resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 2303 2556 engines: {node: '>=4'} 2304 2557 2558 + miniflare@4.20260722.1: 2559 + resolution: {integrity: sha512-FJIg4omaCb2wwSyOeRosEdmVRi3JzGAOOH3pa3twmmtvWECl6BVZMIDwJbjByLKRyU+mrfk0M/n3oSiojFZvSA==} 2560 + engines: {node: '>=22.0.0'} 2561 + hasBin: true 2562 + 2305 2563 minimatch@10.2.5: 2306 2564 resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} 2307 2565 engines: {node: 18 || 20 || >=22} ··· 2376 2634 2377 2635 path-parse@1.0.7: 2378 2636 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2637 + 2638 + path-to-regexp@6.3.0: 2639 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 2379 2640 2380 2641 pathe@2.0.3: 2381 2642 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} ··· 2553 2814 resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2554 2815 engines: {node: '>=8'} 2555 2816 2817 + regexparam@3.0.0: 2818 + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} 2819 + engines: {node: '>=8'} 2820 + 2556 2821 resolve@1.22.12: 2557 2822 resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} 2558 2823 engines: {node: '>= 0.4'} ··· 2594 2859 set-cookie-parser@3.1.2: 2595 2860 resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} 2596 2861 2862 + sharp@0.35.2: 2863 + resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} 2864 + engines: {node: '>=20.9.0'} 2865 + 2597 2866 shebang-command@2.0.0: 2598 2867 resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2599 2868 engines: {node: '>=8'} ··· 2645 2914 strip-indent@3.0.0: 2646 2915 resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2647 2916 engines: {node: '>=8'} 2917 + 2918 + supports-color@10.2.2: 2919 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 2920 + engines: {node: '>=18'} 2648 2921 2649 2922 supports-color@7.2.0: 2650 2923 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} ··· 2792 3065 undici-types@7.18.2: 2793 3066 resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} 2794 3067 3068 + undici@7.28.0: 3069 + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} 3070 + engines: {node: '>=20.18.1'} 3071 + 3072 + unenv@2.0.0-rc.24: 3073 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 3074 + 2795 3075 unicode-segmenter@0.14.5: 2796 3076 resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 2797 3077 ··· 2948 3228 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2949 3229 engines: {node: '>=0.10.0'} 2950 3230 3231 + workerd@1.20260722.1: 3232 + resolution: {integrity: sha512-NycKuc1x2onvsRfGGpM093vRlLFU2zHDAM0+APpccfg4+gZxDGCH27RmdDvkeBuoZyYqgLo3oAfF6re4mvC3vQ==} 3233 + engines: {node: '>=16'} 3234 + hasBin: true 3235 + 3236 + worktop@0.8.0-next.18: 3237 + resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} 3238 + engines: {node: '>=12'} 3239 + 3240 + wrangler@4.115.0: 3241 + resolution: {integrity: sha512-+upG2VW66M1sjb43yzgUZ6Ss8iYpJ6+7F3U4GF8TY5EYd+08sYdS54d24AEwCnhuef3J9KlSPusqiqR9WYy1UA==} 3242 + engines: {node: '>=22.0.0'} 3243 + hasBin: true 3244 + peerDependencies: 3245 + '@cloudflare/workers-types': ^5.20260722.1 3246 + peerDependenciesMeta: 3247 + '@cloudflare/workers-types': 3248 + optional: true 3249 + 3250 + ws@8.21.0: 3251 + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} 3252 + engines: {node: '>=10.0.0'} 3253 + peerDependencies: 3254 + bufferutil: ^4.0.1 3255 + utf-8-validate: '>=5.0.2' 3256 + peerDependenciesMeta: 3257 + bufferutil: 3258 + optional: true 3259 + utf-8-validate: 3260 + optional: true 3261 + 2951 3262 ws@8.21.1: 2952 3263 resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} 2953 3264 engines: {node: '>=10.0.0'} ··· 2976 3287 yocto-queue@0.1.0: 2977 3288 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2978 3289 engines: {node: '>=10'} 3290 + 3291 + youch-core@0.3.3: 3292 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 3293 + 3294 + youch@4.1.0-beta.10: 3295 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 2979 3296 2980 3297 zimmerframe@1.1.2: 2981 3298 resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} ··· 3207 3524 - '@chromatic-com/playwright' 3208 3525 - '@chromatic-com/vitest' 3209 3526 3527 + '@cloudflare/kv-asset-handler@0.5.0': {} 3528 + 3529 + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260722.1)': 3530 + dependencies: 3531 + unenv: 2.0.0-rc.24 3532 + optionalDependencies: 3533 + workerd: 1.20260722.1 3534 + 3535 + '@cloudflare/workerd-darwin-64@1.20260722.1': 3536 + optional: true 3537 + 3538 + '@cloudflare/workerd-darwin-arm64@1.20260722.1': 3539 + optional: true 3540 + 3541 + '@cloudflare/workerd-linux-64@1.20260722.1': 3542 + optional: true 3543 + 3544 + '@cloudflare/workerd-linux-arm64@1.20260722.1': 3545 + optional: true 3546 + 3547 + '@cloudflare/workerd-windows-64@1.20260722.1': 3548 + optional: true 3549 + 3550 + '@cloudflare/workers-types@4.20260702.1': {} 3551 + 3552 + '@cspotcode/source-map-support@0.8.1': 3553 + dependencies: 3554 + '@jridgewell/trace-mapping': 0.3.9 3555 + 3210 3556 '@emnapi/core@1.11.1': 3211 3557 dependencies: 3212 3558 '@emnapi/wasi-threads': 1.2.2 ··· 3390 3736 '@iconify/types': 2.0.0 3391 3737 import-meta-resolve: 4.2.0 3392 3738 3739 + '@img/colour@1.1.0': {} 3740 + 3741 + '@img/sharp-darwin-arm64@0.35.2': 3742 + optionalDependencies: 3743 + '@img/sharp-libvips-darwin-arm64': 1.3.1 3744 + optional: true 3745 + 3746 + '@img/sharp-darwin-x64@0.35.2': 3747 + optionalDependencies: 3748 + '@img/sharp-libvips-darwin-x64': 1.3.1 3749 + optional: true 3750 + 3751 + '@img/sharp-freebsd-wasm32@0.35.2': 3752 + dependencies: 3753 + '@img/sharp-wasm32': 0.35.2 3754 + optional: true 3755 + 3756 + '@img/sharp-libvips-darwin-arm64@1.3.1': 3757 + optional: true 3758 + 3759 + '@img/sharp-libvips-darwin-x64@1.3.1': 3760 + optional: true 3761 + 3762 + '@img/sharp-libvips-linux-arm64@1.3.1': 3763 + optional: true 3764 + 3765 + '@img/sharp-libvips-linux-arm@1.3.1': 3766 + optional: true 3767 + 3768 + '@img/sharp-libvips-linux-ppc64@1.3.1': 3769 + optional: true 3770 + 3771 + '@img/sharp-libvips-linux-riscv64@1.3.1': 3772 + optional: true 3773 + 3774 + '@img/sharp-libvips-linux-s390x@1.3.1': 3775 + optional: true 3776 + 3777 + '@img/sharp-libvips-linux-x64@1.3.1': 3778 + optional: true 3779 + 3780 + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': 3781 + optional: true 3782 + 3783 + '@img/sharp-libvips-linuxmusl-x64@1.3.1': 3784 + optional: true 3785 + 3786 + '@img/sharp-linux-arm64@0.35.2': 3787 + optionalDependencies: 3788 + '@img/sharp-libvips-linux-arm64': 1.3.1 3789 + optional: true 3790 + 3791 + '@img/sharp-linux-arm@0.35.2': 3792 + optionalDependencies: 3793 + '@img/sharp-libvips-linux-arm': 1.3.1 3794 + optional: true 3795 + 3796 + '@img/sharp-linux-ppc64@0.35.2': 3797 + optionalDependencies: 3798 + '@img/sharp-libvips-linux-ppc64': 1.3.1 3799 + optional: true 3800 + 3801 + '@img/sharp-linux-riscv64@0.35.2': 3802 + optionalDependencies: 3803 + '@img/sharp-libvips-linux-riscv64': 1.3.1 3804 + optional: true 3805 + 3806 + '@img/sharp-linux-s390x@0.35.2': 3807 + optionalDependencies: 3808 + '@img/sharp-libvips-linux-s390x': 1.3.1 3809 + optional: true 3810 + 3811 + '@img/sharp-linux-x64@0.35.2': 3812 + optionalDependencies: 3813 + '@img/sharp-libvips-linux-x64': 1.3.1 3814 + optional: true 3815 + 3816 + '@img/sharp-linuxmusl-arm64@0.35.2': 3817 + optionalDependencies: 3818 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 3819 + optional: true 3820 + 3821 + '@img/sharp-linuxmusl-x64@0.35.2': 3822 + optionalDependencies: 3823 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 3824 + optional: true 3825 + 3826 + '@img/sharp-wasm32@0.35.2': 3827 + dependencies: 3828 + '@emnapi/runtime': 1.11.2 3829 + optional: true 3830 + 3831 + '@img/sharp-webcontainers-wasm32@0.35.2': 3832 + dependencies: 3833 + '@img/sharp-wasm32': 0.35.2 3834 + optional: true 3835 + 3836 + '@img/sharp-win32-arm64@0.35.2': 3837 + optional: true 3838 + 3839 + '@img/sharp-win32-ia32@0.35.2': 3840 + optional: true 3841 + 3842 + '@img/sharp-win32-x64@0.35.2': 3843 + optional: true 3844 + 3393 3845 '@jridgewell/gen-mapping@0.3.13': 3394 3846 dependencies: 3395 3847 '@jridgewell/sourcemap-codec': 1.5.5 ··· 3405 3857 '@jridgewell/sourcemap-codec@1.5.5': {} 3406 3858 3407 3859 '@jridgewell/trace-mapping@0.3.31': 3860 + dependencies: 3861 + '@jridgewell/resolve-uri': 3.1.2 3862 + '@jridgewell/sourcemap-codec': 1.5.5 3863 + 3864 + '@jridgewell/trace-mapping@0.3.9': 3408 3865 dependencies: 3409 3866 '@jridgewell/resolve-uri': 3.1.2 3410 3867 '@jridgewell/sourcemap-codec': 1.5.5 ··· 3600 4057 3601 4058 '@polka/url@1.0.0-next.29': {} 3602 4059 4060 + '@poppinss/colors@4.1.6': 4061 + dependencies: 4062 + kleur: 4.1.5 4063 + 4064 + '@poppinss/dumper@0.6.5': 4065 + dependencies: 4066 + '@poppinss/colors': 4.1.6 4067 + '@sindresorhus/is': 7.2.0 4068 + supports-color: 10.2.2 4069 + 4070 + '@poppinss/exception@1.2.3': {} 4071 + 3603 4072 '@rolldown/binding-android-arm64@1.1.5': 3604 4073 optional: true 3605 4074 ··· 3769 4238 '@rollup/rollup-win32-x64-msvc@4.62.2': 3770 4239 optional: true 3771 4240 4241 + '@sindresorhus/is@7.2.0': {} 4242 + 4243 + '@speed-highlight/core@1.2.17': {} 4244 + 3772 4245 '@standard-schema/spec@1.1.0': {} 3773 4246 3774 4247 '@storybook/addon-a11y@10.5.0(storybook@10.5.0(@types/react@19.2.17)(prettier@3.9.5)(react@19.2.7))': ··· 3905 4378 dependencies: 3906 4379 acorn: 8.17.0 3907 4380 4381 + '@sveltejs/adapter-cloudflare@7.2.9(@sveltejs/kit@2.69.3(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(typescript@6.0.3)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(wrangler@4.115.0)': 4382 + dependencies: 4383 + '@cloudflare/workers-types': 4.20260702.1 4384 + '@sveltejs/kit': 2.69.3(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(typescript@6.0.3)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) 4385 + worktop: 0.8.0-next.18 4386 + wrangler: 4.115.0 4387 + 3908 4388 '@sveltejs/adapter-node@5.5.7(@sveltejs/kit@2.69.3(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.5(@typescript-eslint/types@8.64.0))(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(svelte@5.56.5(@typescript-eslint/types@8.64.0))(typescript@6.0.3)(vite@8.1.4(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))': 3909 4389 dependencies: 3910 4390 '@rollup/plugin-commonjs': 29.0.3(rollup@4.62.2) ··· 4339 4819 4340 4820 balanced-match@4.0.4: {} 4341 4821 4822 + blake3-wasm@2.1.5: {} 4823 + 4342 4824 brace-expansion@5.0.7: 4343 4825 dependencies: 4344 4826 balanced-match: 4.0.4 ··· 4378 4860 convert-source-map@2.0.0: {} 4379 4861 4380 4862 cookie@0.6.0: {} 4863 + 4864 + cookie@1.1.1: {} 4381 4865 4382 4866 cross-spawn@7.0.6: 4383 4867 dependencies: ··· 4472 4956 entities@7.0.1: {} 4473 4957 4474 4958 entities@8.0.0: {} 4959 + 4960 + error-stack-parser-es@1.0.5: {} 4475 4961 4476 4962 es-errors@1.3.0: {} 4477 4963 ··· 4915 5401 4916 5402 min-indent@1.0.1: {} 4917 5403 5404 + miniflare@4.20260722.1: 5405 + dependencies: 5406 + '@cspotcode/source-map-support': 0.8.1 5407 + sharp: 0.35.2 5408 + undici: 7.28.0 5409 + workerd: 1.20260722.1 5410 + ws: 8.21.0 5411 + youch: 4.1.0-beta.10 5412 + transitivePeerDependencies: 5413 + - bufferutil 5414 + - utf-8-validate 5415 + 4918 5416 minimatch@10.2.5: 4919 5417 dependencies: 4920 5418 brace-expansion: 5.0.7 ··· 5020 5518 path-key@3.1.1: {} 5021 5519 5022 5520 path-parse@1.0.7: {} 5521 + 5522 + path-to-regexp@6.3.0: {} 5023 5523 5024 5524 pathe@2.0.3: {} 5025 5525 ··· 5128 5628 indent-string: 4.0.0 5129 5629 strip-indent: 3.0.0 5130 5630 5631 + regexparam@3.0.0: {} 5632 + 5131 5633 resolve@1.22.12: 5132 5634 dependencies: 5133 5635 es-errors: 1.3.0 ··· 5211 5713 5212 5714 set-cookie-parser@3.1.2: {} 5213 5715 5716 + sharp@0.35.2: 5717 + dependencies: 5718 + '@img/colour': 1.1.0 5719 + detect-libc: 2.1.2 5720 + semver: 7.8.5 5721 + optionalDependencies: 5722 + '@img/sharp-darwin-arm64': 0.35.2 5723 + '@img/sharp-darwin-x64': 0.35.2 5724 + '@img/sharp-freebsd-wasm32': 0.35.2 5725 + '@img/sharp-libvips-darwin-arm64': 1.3.1 5726 + '@img/sharp-libvips-darwin-x64': 1.3.1 5727 + '@img/sharp-libvips-linux-arm': 1.3.1 5728 + '@img/sharp-libvips-linux-arm64': 1.3.1 5729 + '@img/sharp-libvips-linux-ppc64': 1.3.1 5730 + '@img/sharp-libvips-linux-riscv64': 1.3.1 5731 + '@img/sharp-libvips-linux-s390x': 1.3.1 5732 + '@img/sharp-libvips-linux-x64': 1.3.1 5733 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 5734 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 5735 + '@img/sharp-linux-arm': 0.35.2 5736 + '@img/sharp-linux-arm64': 0.35.2 5737 + '@img/sharp-linux-ppc64': 0.35.2 5738 + '@img/sharp-linux-riscv64': 0.35.2 5739 + '@img/sharp-linux-s390x': 0.35.2 5740 + '@img/sharp-linux-x64': 0.35.2 5741 + '@img/sharp-linuxmusl-arm64': 0.35.2 5742 + '@img/sharp-linuxmusl-x64': 0.35.2 5743 + '@img/sharp-webcontainers-wasm32': 0.35.2 5744 + '@img/sharp-win32-arm64': 0.35.2 5745 + '@img/sharp-win32-ia32': 0.35.2 5746 + '@img/sharp-win32-x64': 0.35.2 5747 + 5214 5748 shebang-command@2.0.0: 5215 5749 dependencies: 5216 5750 shebang-regex: 3.0.0 ··· 5267 5801 strip-indent@3.0.0: 5268 5802 dependencies: 5269 5803 min-indent: 1.0.1 5804 + 5805 + supports-color@10.2.2: {} 5270 5806 5271 5807 supports-color@7.2.0: 5272 5808 dependencies: ··· 5405 5941 5406 5942 undici-types@7.18.2: {} 5407 5943 5944 + undici@7.28.0: {} 5945 + 5946 + unenv@2.0.0-rc.24: 5947 + dependencies: 5948 + pathe: 2.0.3 5949 + 5408 5950 unicode-segmenter@0.14.5: {} 5409 5951 5410 5952 universalify@2.0.1: {} ··· 5500 6042 5501 6043 word-wrap@1.2.5: {} 5502 6044 6045 + workerd@1.20260722.1: 6046 + optionalDependencies: 6047 + '@cloudflare/workerd-darwin-64': 1.20260722.1 6048 + '@cloudflare/workerd-darwin-arm64': 1.20260722.1 6049 + '@cloudflare/workerd-linux-64': 1.20260722.1 6050 + '@cloudflare/workerd-linux-arm64': 1.20260722.1 6051 + '@cloudflare/workerd-windows-64': 1.20260722.1 6052 + 6053 + worktop@0.8.0-next.18: 6054 + dependencies: 6055 + mrmime: 2.0.1 6056 + regexparam: 3.0.0 6057 + 6058 + wrangler@4.115.0: 6059 + dependencies: 6060 + '@cloudflare/kv-asset-handler': 0.5.0 6061 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260722.1) 6062 + blake3-wasm: 2.1.5 6063 + esbuild: 0.28.1 6064 + miniflare: 4.20260722.1 6065 + path-to-regexp: 6.3.0 6066 + unenv: 2.0.0-rc.24 6067 + workerd: 1.20260722.1 6068 + optionalDependencies: 6069 + fsevents: 2.3.3 6070 + transitivePeerDependencies: 6071 + - bufferutil 6072 + - utf-8-validate 6073 + 6074 + ws@8.21.0: {} 6075 + 5503 6076 ws@8.21.1: {} 5504 6077 5505 6078 wsl-utils@0.1.0: ··· 5512 6085 optional: true 5513 6086 5514 6087 yocto-queue@0.1.0: {} 6088 + 6089 + youch-core@0.3.3: 6090 + dependencies: 6091 + '@poppinss/exception': 1.2.3 6092 + error-stack-parser-es: 1.0.5 6093 + 6094 + youch@4.1.0-beta.10: 6095 + dependencies: 6096 + '@poppinss/colors': 4.1.6 6097 + '@poppinss/dumper': 0.6.5 6098 + '@speed-highlight/core': 1.2.17 6099 + cookie: 1.1.1 6100 + youch-core: 0.3.3 5515 6101 5516 6102 zimmerframe@1.1.2: {} 5517 6103
+1
web/pnpm-workspace.yaml
··· 1 1 allowBuilds: 2 2 esbuild: true 3 + workerd: true
+15
web/src/hooks.server.ts
··· 1 1 import type { Handle } from "@sveltejs/kit"; 2 2 3 + type BobbinService = { 4 + fetch(request: Request): Promise<Response>; 5 + }; 6 + 3 7 export const handle: Handle = async ({ event, resolve }) => { 8 + // Keep bobbin off the public network. In Cloudflare this is a Worker 9 + // service binding; the browser only ever sees the web origin. 10 + if (event.url.pathname === "/xrpc" || event.url.pathname.startsWith("/xrpc/")) { 11 + const bobbin = (event.platform?.env as { BOBBIN?: BobbinService } | undefined)?.BOBBIN; 12 + if (bobbin) { 13 + const upstream = new URL(event.request.url); 14 + upstream.hostname = "bobbin.internal"; 15 + return bobbin.fetch(new Request(upstream, event.request)); 16 + } 17 + } 18 + 4 19 return resolve(event, { 5 20 // sveltekit blocks atcute fetch handler from reading headers 6 21 // because it assumes backend APIs might return sensitive headers.
+1 -1
web/src/lib/auth.svelte.ts
··· 18 18 } from "@atcute/oauth-browser-client"; 19 19 import { getContext } from "svelte"; 20 20 import { SvelteURL, SvelteURLSearchParams } from "svelte/reactivity"; 21 - import oauthMetadata from "../../static/oauth-client-metadata.json"; 21 + import oauthMetadata from "./oauth-client-metadata.json"; 22 22 import { 23 23 type AuthAccount, 24 24 clearActive,
+13
web/src/routes/oauth-client-metadata.json/+server.ts
··· 1 + import { json } from "@sveltejs/kit"; 2 + import metadata from "../../lib/oauth-client-metadata.json"; 3 + 4 + export const GET = ({ url }) => { 5 + const origin = url.origin; 6 + 7 + return json({ 8 + ...metadata, 9 + client_id: `${origin}/oauth-client-metadata.json`, 10 + client_uri: origin, 11 + redirect_uris: [`${origin}/oauth/callback`] 12 + }); 13 + };
-1
web/static/.gitignore
··· 1 1 * 2 2 !.gitignore 3 - !oauth-client-metadata.json 4 3 !robots.txt
web/static/oauth-client-metadata.json web/src/lib/oauth-client-metadata.json
+4 -1
web/svelte.config.js
··· 1 + import cloudflareAdapter from "@sveltejs/adapter-cloudflare"; 1 2 import adapter from "@sveltejs/adapter-node"; 2 3 import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; 4 + 5 + const useCloudflareAdapter = process.env.SVELTE_ADAPTER === "cloudflare"; 3 6 4 7 const config = { 5 8 preprocess: vitePreprocess(), ··· 7 10 runes: ({ filename }) => (filename.split(/[/\\]/).includes("node_modules") ? undefined : true) 8 11 }, 9 12 kit: { 10 - adapter: adapter() 13 + adapter: useCloudflareAdapter ? cloudflareAdapter({ config: "wrangler.dev.jsonc" }) : adapter() 11 14 } 12 15 }; 13 16
+1 -1
web/vite.config.ts
··· 2 2 import { sveltekit } from "@sveltejs/kit/vite"; 3 3 import Icons from "unplugin-icons/vite"; 4 4 import { defineConfig } from "vitest/config"; 5 - import oauthMetadata from "./static/oauth-client-metadata.json"; 5 + import oauthMetadata from "./src/lib/oauth-client-metadata.json"; 6 6 import path from "node:path"; 7 7 import { fileURLToPath } from "node:url"; 8 8 import { storybookTest } from "@storybook/addon-vitest/vitest-plugin";
+35
web/wrangler.dev.jsonc
··· 1 + { 2 + "$schema": "node_modules/wrangler/config-schema.json", 3 + "name": "svfe-dev", 4 + "main": ".svelte-kit/cloudflare/_worker.js", 5 + "workers_dev": false, 6 + "compatibility_date": "2026-07-30", 7 + "compatibility_flags": ["nodejs_compat"], 8 + "observability": { 9 + "enabled": true 10 + }, 11 + "assets": { 12 + "binding": "ASSETS", 13 + "directory": ".svelte-kit/cloudflare", 14 + "run_worker_first": ["/oauth-client-metadata.json"] 15 + }, 16 + "services": [ 17 + { 18 + "binding": "BOBBIN", 19 + "service": "bobbin-svfe-dev" 20 + } 21 + ], 22 + "routes": [ 23 + { 24 + "pattern": "next.tangled.org", 25 + "custom_domain": true 26 + } 27 + ], 28 + "vars": { 29 + "BOBBIN_URL": "https://next.tangled.org", 30 + "KNOTMIRROR_URL": "https://mirror.tangled.network", 31 + "TANGLED_API_URL": "https://tangled.org", 32 + "CAMO_URL": "https://camo.tangled.sh", 33 + "AVATAR_URL": "https://avatar.tangled.sh" 34 + } 35 + }