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 (Aug 1, 2026, 12:55 AM +0300) commit 5a342f37 parent b6eb9b34 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 "$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", ··· 62 63 "typescript-eslint": "^8.64.0", 63 64 "unplugin-icons": "^23.0.1", 64 65 "vite": "^8.1.4", 65 - "vitest": "^4.1.10" 66 + "vitest": "^4.1.10", 67 + "wrangler": "^4.75.0" 66 68 }, 67 69 "dependencies": { 68 70 "@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))) ··· 171 174 vitest: 172 175 specifier: ^4.1.10 173 176 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)) 177 + wrangler: 178 + specifier: ^4.75.0 179 + version: 4.115.0 174 180 175 181 packages: 176 182 ··· 330 336 peerDependencies: 331 337 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 332 338 339 + '@cloudflare/kv-asset-handler@0.5.0': 340 + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} 341 + engines: {node: '>=22.0.0'} 342 + 343 + '@cloudflare/unenv-preset@2.16.1': 344 + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} 345 + peerDependencies: 346 + unenv: 2.0.0-rc.24 347 + workerd: '>1.20260305.0 <2.0.0-0' 348 + peerDependenciesMeta: 349 + workerd: 350 + optional: true 351 + 352 + '@cloudflare/workerd-darwin-64@1.20260722.1': 353 + resolution: {integrity: sha512-vZOP8vIS3NwnuaO+gz0FZ7kIGeiO3bZmxV35Ph9zOXKSREhDFlH7wQ7mkCdhW3O4jnXsew+XT7b+DNEI2CcJGQ==} 354 + engines: {node: '>=16'} 355 + cpu: [x64] 356 + os: [darwin] 357 + 358 + '@cloudflare/workerd-darwin-arm64@1.20260722.1': 359 + resolution: {integrity: sha512-EmIQymihDq6WNdER4+LF8Qn80yqayBUpJ+tkOO7wmY8pmgfyXjIUFNXotl21AHovTeu2seR7HdVUgeN/BilCWw==} 360 + engines: {node: '>=16'} 361 + cpu: [arm64] 362 + os: [darwin] 363 + 364 + '@cloudflare/workerd-linux-64@1.20260722.1': 365 + resolution: {integrity: sha512-jvZ3k9fxcnEn04s80CgIYxQfpOyAiz/8qC42DP8EBa9tR27qWyg9wmm31zIobVlrgBZn/+8NfdP73avRGcQOjQ==} 366 + engines: {node: '>=16'} 367 + cpu: [x64] 368 + os: [linux] 369 + 370 + '@cloudflare/workerd-linux-arm64@1.20260722.1': 371 + resolution: {integrity: sha512-BOSB55SMNdy+DA5uj2WirgiNanpHGis5PVvXH1wSfvjRKr4JGgWK+EZzxz0RFUo6QjjQQC/NimEzNZ7va7jmKg==} 372 + engines: {node: '>=16'} 373 + cpu: [arm64] 374 + os: [linux] 375 + 376 + '@cloudflare/workerd-windows-64@1.20260722.1': 377 + resolution: {integrity: sha512-sYM8YgUpKnRz2xjvdJLX1Ojzoi4MlA4gk8WTTExhGydjYB2UTs5NIbv0ZmpKgMoK9io3ixgmiW56ZnTbcWOdiA==} 378 + engines: {node: '>=16'} 379 + cpu: [x64] 380 + os: [win32] 381 + 382 + '@cloudflare/workers-types@4.20260702.1': 383 + resolution: {integrity: sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==} 384 + 385 + '@cspotcode/source-map-support@0.8.1': 386 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 387 + engines: {node: '>=12'} 388 + 333 389 '@emnapi/core@1.11.1': 334 390 resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} 335 391 ··· 582 638 '@iconify/utils@3.1.4': 583 639 resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} 584 640 641 + '@img/colour@1.1.0': 642 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 643 + engines: {node: '>=18'} 644 + 645 + '@img/sharp-darwin-arm64@0.35.2': 646 + resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} 647 + engines: {node: '>=20.9.0'} 648 + cpu: [arm64] 649 + os: [darwin] 650 + 651 + '@img/sharp-darwin-x64@0.35.2': 652 + resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} 653 + engines: {node: '>=20.9.0'} 654 + cpu: [x64] 655 + os: [darwin] 656 + 657 + '@img/sharp-freebsd-wasm32@0.35.2': 658 + resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} 659 + engines: {node: '>=20.9.0'} 660 + os: [freebsd] 661 + 662 + '@img/sharp-libvips-darwin-arm64@1.3.1': 663 + resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} 664 + cpu: [arm64] 665 + os: [darwin] 666 + 667 + '@img/sharp-libvips-darwin-x64@1.3.1': 668 + resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} 669 + cpu: [x64] 670 + os: [darwin] 671 + 672 + '@img/sharp-libvips-linux-arm64@1.3.1': 673 + resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} 674 + cpu: [arm64] 675 + os: [linux] 676 + libc: [glibc] 677 + 678 + '@img/sharp-libvips-linux-arm@1.3.1': 679 + resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} 680 + cpu: [arm] 681 + os: [linux] 682 + libc: [glibc] 683 + 684 + '@img/sharp-libvips-linux-ppc64@1.3.1': 685 + resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} 686 + cpu: [ppc64] 687 + os: [linux] 688 + libc: [glibc] 689 + 690 + '@img/sharp-libvips-linux-riscv64@1.3.1': 691 + resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} 692 + cpu: [riscv64] 693 + os: [linux] 694 + libc: [glibc] 695 + 696 + '@img/sharp-libvips-linux-s390x@1.3.1': 697 + resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} 698 + cpu: [s390x] 699 + os: [linux] 700 + libc: [glibc] 701 + 702 + '@img/sharp-libvips-linux-x64@1.3.1': 703 + resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} 704 + cpu: [x64] 705 + os: [linux] 706 + libc: [glibc] 707 + 708 + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': 709 + resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} 710 + cpu: [arm64] 711 + os: [linux] 712 + libc: [musl] 713 + 714 + '@img/sharp-libvips-linuxmusl-x64@1.3.1': 715 + resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} 716 + cpu: [x64] 717 + os: [linux] 718 + libc: [musl] 719 + 720 + '@img/sharp-linux-arm64@0.35.2': 721 + resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} 722 + engines: {node: '>=20.9.0'} 723 + cpu: [arm64] 724 + os: [linux] 725 + libc: [glibc] 726 + 727 + '@img/sharp-linux-arm@0.35.2': 728 + resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} 729 + engines: {node: '>=20.9.0'} 730 + cpu: [arm] 731 + os: [linux] 732 + libc: [glibc] 733 + 734 + '@img/sharp-linux-ppc64@0.35.2': 735 + resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} 736 + engines: {node: '>=20.9.0'} 737 + cpu: [ppc64] 738 + os: [linux] 739 + libc: [glibc] 740 + 741 + '@img/sharp-linux-riscv64@0.35.2': 742 + resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} 743 + engines: {node: '>=20.9.0'} 744 + cpu: [riscv64] 745 + os: [linux] 746 + libc: [glibc] 747 + 748 + '@img/sharp-linux-s390x@0.35.2': 749 + resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} 750 + engines: {node: '>=20.9.0'} 751 + cpu: [s390x] 752 + os: [linux] 753 + libc: [glibc] 754 + 755 + '@img/sharp-linux-x64@0.35.2': 756 + resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} 757 + engines: {node: '>=20.9.0'} 758 + cpu: [x64] 759 + os: [linux] 760 + libc: [glibc] 761 + 762 + '@img/sharp-linuxmusl-arm64@0.35.2': 763 + resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} 764 + engines: {node: '>=20.9.0'} 765 + cpu: [arm64] 766 + os: [linux] 767 + libc: [musl] 768 + 769 + '@img/sharp-linuxmusl-x64@0.35.2': 770 + resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} 771 + engines: {node: '>=20.9.0'} 772 + cpu: [x64] 773 + os: [linux] 774 + libc: [musl] 775 + 776 + '@img/sharp-wasm32@0.35.2': 777 + resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} 778 + engines: {node: '>=20.9.0'} 779 + 780 + '@img/sharp-webcontainers-wasm32@0.35.2': 781 + resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} 782 + engines: {node: '>=20.9.0'} 783 + cpu: [wasm32] 784 + 785 + '@img/sharp-win32-arm64@0.35.2': 786 + resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} 787 + engines: {node: '>=20.9.0'} 788 + cpu: [arm64] 789 + os: [win32] 790 + 791 + '@img/sharp-win32-ia32@0.35.2': 792 + resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} 793 + engines: {node: ^20.9.0} 794 + cpu: [ia32] 795 + os: [win32] 796 + 797 + '@img/sharp-win32-x64@0.35.2': 798 + resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} 799 + engines: {node: '>=20.9.0'} 800 + cpu: [x64] 801 + os: [win32] 802 + 585 803 '@jridgewell/gen-mapping@0.3.13': 586 804 resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 587 805 ··· 598 816 '@jridgewell/trace-mapping@0.3.31': 599 817 resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 600 818 819 + '@jridgewell/trace-mapping@0.3.9': 820 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 821 + 601 822 '@mdit/plugin-alert@1.0.1': 602 823 resolution: {integrity: sha512-gEZgbwlK2JSNIW3izqQyPoYJ8NXAEU0aON7XYpUHBzyD9km+ny5zFkAmoogMAzR8ird8iCQiK5pSv3nOtPBlLw==} 603 824 engines: {node: '>=22'} ··· 898 1119 899 1120 '@polka/url@1.0.0-next.29': 900 1121 resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 1122 + 1123 + '@poppinss/colors@4.1.6': 1124 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 1125 + 1126 + '@poppinss/dumper@0.6.5': 1127 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 1128 + 1129 + '@poppinss/exception@1.2.3': 1130 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 901 1131 902 1132 '@rolldown/binding-android-arm64@1.1.5': 903 1133 resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} ··· 1180 1410 cpu: [x64] 1181 1411 os: [win32] 1182 1412 1413 + '@sindresorhus/is@7.2.0': 1414 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 1415 + engines: {node: '>=18'} 1416 + 1417 + '@speed-highlight/core@1.2.17': 1418 + resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} 1419 + 1183 1420 '@standard-schema/spec@1.1.0': 1184 1421 resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 1185 1422 ··· 1299 1536 peerDependencies: 1300 1537 acorn: ^8.9.0 1301 1538 1539 + '@sveltejs/adapter-cloudflare@7.2.9': 1540 + resolution: {integrity: sha512-LEfLRYKZIiNYBPYk9Cu4dFCCIX37NO96jESNRDv7yr3vvblKU4Yh05FPUMRSrOWFKtG6bJcGIvdG/M2DSf4D1w==} 1541 + peerDependencies: 1542 + '@sveltejs/kit': ^2.0.0 1543 + wrangler: ^4.0.0 1544 + 1302 1545 '@sveltejs/adapter-node@5.5.7': 1303 1546 resolution: {integrity: sha512-uOfc9eVlI3A37RRSaKcgrheBYPrfJwC9VMqDp8x/O6tlKdcLLvHThSWD0KNIbjQ/d+7bwLGx3vx6aowAcRfd2g==} 1304 1547 peerDependencies: ··· 1687 1930 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 1688 1931 engines: {node: 18 || 20 || >=22} 1689 1932 1933 + blake3-wasm@2.1.5: 1934 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 1935 + 1690 1936 brace-expansion@5.0.7: 1691 1937 resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} 1692 1938 engines: {node: 18 || 20 || >=22} ··· 1757 2003 resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 1758 2004 engines: {node: '>= 0.6'} 1759 2005 2006 + cookie@1.1.1: 2007 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 2008 + engines: {node: '>=18'} 2009 + 1760 2010 cross-spawn@7.0.6: 1761 2011 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1762 2012 engines: {node: '>= 8'} ··· 1883 2133 entities@8.0.0: 1884 2134 resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} 1885 2135 engines: {node: '>=20.19.0'} 2136 + 2137 + error-stack-parser-es@1.0.5: 2138 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 1886 2139 1887 2140 es-errors@1.3.0: 1888 2141 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} ··· 2358 2611 resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 2359 2612 engines: {node: '>=4'} 2360 2613 2614 + miniflare@4.20260722.1: 2615 + resolution: {integrity: sha512-FJIg4omaCb2wwSyOeRosEdmVRi3JzGAOOH3pa3twmmtvWECl6BVZMIDwJbjByLKRyU+mrfk0M/n3oSiojFZvSA==} 2616 + engines: {node: '>=22.0.0'} 2617 + hasBin: true 2618 + 2361 2619 minimatch@10.2.5: 2362 2620 resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} 2363 2621 engines: {node: 18 || 20 || >=22} ··· 2435 2693 2436 2694 path-parse@1.0.7: 2437 2695 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2696 + 2697 + path-to-regexp@6.3.0: 2698 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 2438 2699 2439 2700 pathe@2.0.3: 2440 2701 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} ··· 2612 2873 resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2613 2874 engines: {node: '>=8'} 2614 2875 2876 + regexparam@3.0.0: 2877 + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} 2878 + engines: {node: '>=8'} 2879 + 2615 2880 resolve@1.22.12: 2616 2881 resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} 2617 2882 engines: {node: '>= 0.4'} ··· 2653 2918 set-cookie-parser@3.1.2: 2654 2919 resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} 2655 2920 2921 + sharp@0.35.2: 2922 + resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} 2923 + engines: {node: '>=20.9.0'} 2924 + 2656 2925 shebang-command@2.0.0: 2657 2926 resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2658 2927 engines: {node: '>=8'} ··· 2708 2977 strip-indent@3.0.0: 2709 2978 resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2710 2979 engines: {node: '>=8'} 2980 + 2981 + supports-color@10.2.2: 2982 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 2983 + engines: {node: '>=18'} 2711 2984 2712 2985 supports-color@7.2.0: 2713 2986 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} ··· 2876 3149 undici-types@7.18.2: 2877 3150 resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} 2878 3151 3152 + undici@7.28.0: 3153 + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} 3154 + engines: {node: '>=20.18.1'} 3155 + 3156 + unenv@2.0.0-rc.24: 3157 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 3158 + 2879 3159 unicode-segmenter@0.14.5: 2880 3160 resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 2881 3161 ··· 3032 3312 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 3033 3313 engines: {node: '>=0.10.0'} 3034 3314 3315 + workerd@1.20260722.1: 3316 + resolution: {integrity: sha512-NycKuc1x2onvsRfGGpM093vRlLFU2zHDAM0+APpccfg4+gZxDGCH27RmdDvkeBuoZyYqgLo3oAfF6re4mvC3vQ==} 3317 + engines: {node: '>=16'} 3318 + hasBin: true 3319 + 3320 + worktop@0.8.0-next.18: 3321 + resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} 3322 + engines: {node: '>=12'} 3323 + 3324 + wrangler@4.115.0: 3325 + resolution: {integrity: sha512-+upG2VW66M1sjb43yzgUZ6Ss8iYpJ6+7F3U4GF8TY5EYd+08sYdS54d24AEwCnhuef3J9KlSPusqiqR9WYy1UA==} 3326 + engines: {node: '>=22.0.0'} 3327 + hasBin: true 3328 + peerDependencies: 3329 + '@cloudflare/workers-types': ^5.20260722.1 3330 + peerDependenciesMeta: 3331 + '@cloudflare/workers-types': 3332 + optional: true 3333 + 3334 + ws@8.21.0: 3335 + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} 3336 + engines: {node: '>=10.0.0'} 3337 + peerDependencies: 3338 + bufferutil: ^4.0.1 3339 + utf-8-validate: '>=5.0.2' 3340 + peerDependenciesMeta: 3341 + bufferutil: 3342 + optional: true 3343 + utf-8-validate: 3344 + optional: true 3345 + 3035 3346 ws@8.21.1: 3036 3347 resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} 3037 3348 engines: {node: '>=10.0.0'} ··· 3060 3371 yocto-queue@0.1.0: 3061 3372 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3062 3373 engines: {node: '>=10'} 3374 + 3375 + youch-core@0.3.3: 3376 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 3377 + 3378 + youch@4.1.0-beta.10: 3379 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 3063 3380 3064 3381 zimmerframe@1.1.2: 3065 3382 resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} ··· 3291 3608 - '@chromatic-com/playwright' 3292 3609 - '@chromatic-com/vitest' 3293 3610 3611 + '@cloudflare/kv-asset-handler@0.5.0': {} 3612 + 3613 + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260722.1)': 3614 + dependencies: 3615 + unenv: 2.0.0-rc.24 3616 + optionalDependencies: 3617 + workerd: 1.20260722.1 3618 + 3619 + '@cloudflare/workerd-darwin-64@1.20260722.1': 3620 + optional: true 3621 + 3622 + '@cloudflare/workerd-darwin-arm64@1.20260722.1': 3623 + optional: true 3624 + 3625 + '@cloudflare/workerd-linux-64@1.20260722.1': 3626 + optional: true 3627 + 3628 + '@cloudflare/workerd-linux-arm64@1.20260722.1': 3629 + optional: true 3630 + 3631 + '@cloudflare/workerd-windows-64@1.20260722.1': 3632 + optional: true 3633 + 3634 + '@cloudflare/workers-types@4.20260702.1': {} 3635 + 3636 + '@cspotcode/source-map-support@0.8.1': 3637 + dependencies: 3638 + '@jridgewell/trace-mapping': 0.3.9 3639 + 3294 3640 '@emnapi/core@1.11.1': 3295 3641 dependencies: 3296 3642 '@emnapi/wasi-threads': 1.2.2 ··· 3479 3825 '@iconify/types': 2.0.0 3480 3826 import-meta-resolve: 4.2.0 3481 3827 3828 + '@img/colour@1.1.0': {} 3829 + 3830 + '@img/sharp-darwin-arm64@0.35.2': 3831 + optionalDependencies: 3832 + '@img/sharp-libvips-darwin-arm64': 1.3.1 3833 + optional: true 3834 + 3835 + '@img/sharp-darwin-x64@0.35.2': 3836 + optionalDependencies: 3837 + '@img/sharp-libvips-darwin-x64': 1.3.1 3838 + optional: true 3839 + 3840 + '@img/sharp-freebsd-wasm32@0.35.2': 3841 + dependencies: 3842 + '@img/sharp-wasm32': 0.35.2 3843 + optional: true 3844 + 3845 + '@img/sharp-libvips-darwin-arm64@1.3.1': 3846 + optional: true 3847 + 3848 + '@img/sharp-libvips-darwin-x64@1.3.1': 3849 + optional: true 3850 + 3851 + '@img/sharp-libvips-linux-arm64@1.3.1': 3852 + optional: true 3853 + 3854 + '@img/sharp-libvips-linux-arm@1.3.1': 3855 + optional: true 3856 + 3857 + '@img/sharp-libvips-linux-ppc64@1.3.1': 3858 + optional: true 3859 + 3860 + '@img/sharp-libvips-linux-riscv64@1.3.1': 3861 + optional: true 3862 + 3863 + '@img/sharp-libvips-linux-s390x@1.3.1': 3864 + optional: true 3865 + 3866 + '@img/sharp-libvips-linux-x64@1.3.1': 3867 + optional: true 3868 + 3869 + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': 3870 + optional: true 3871 + 3872 + '@img/sharp-libvips-linuxmusl-x64@1.3.1': 3873 + optional: true 3874 + 3875 + '@img/sharp-linux-arm64@0.35.2': 3876 + optionalDependencies: 3877 + '@img/sharp-libvips-linux-arm64': 1.3.1 3878 + optional: true 3879 + 3880 + '@img/sharp-linux-arm@0.35.2': 3881 + optionalDependencies: 3882 + '@img/sharp-libvips-linux-arm': 1.3.1 3883 + optional: true 3884 + 3885 + '@img/sharp-linux-ppc64@0.35.2': 3886 + optionalDependencies: 3887 + '@img/sharp-libvips-linux-ppc64': 1.3.1 3888 + optional: true 3889 + 3890 + '@img/sharp-linux-riscv64@0.35.2': 3891 + optionalDependencies: 3892 + '@img/sharp-libvips-linux-riscv64': 1.3.1 3893 + optional: true 3894 + 3895 + '@img/sharp-linux-s390x@0.35.2': 3896 + optionalDependencies: 3897 + '@img/sharp-libvips-linux-s390x': 1.3.1 3898 + optional: true 3899 + 3900 + '@img/sharp-linux-x64@0.35.2': 3901 + optionalDependencies: 3902 + '@img/sharp-libvips-linux-x64': 1.3.1 3903 + optional: true 3904 + 3905 + '@img/sharp-linuxmusl-arm64@0.35.2': 3906 + optionalDependencies: 3907 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 3908 + optional: true 3909 + 3910 + '@img/sharp-linuxmusl-x64@0.35.2': 3911 + optionalDependencies: 3912 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 3913 + optional: true 3914 + 3915 + '@img/sharp-wasm32@0.35.2': 3916 + dependencies: 3917 + '@emnapi/runtime': 1.11.2 3918 + optional: true 3919 + 3920 + '@img/sharp-webcontainers-wasm32@0.35.2': 3921 + dependencies: 3922 + '@img/sharp-wasm32': 0.35.2 3923 + optional: true 3924 + 3925 + '@img/sharp-win32-arm64@0.35.2': 3926 + optional: true 3927 + 3928 + '@img/sharp-win32-ia32@0.35.2': 3929 + optional: true 3930 + 3931 + '@img/sharp-win32-x64@0.35.2': 3932 + optional: true 3933 + 3482 3934 '@jridgewell/gen-mapping@0.3.13': 3483 3935 dependencies: 3484 3936 '@jridgewell/sourcemap-codec': 1.5.5 ··· 3494 3946 '@jridgewell/sourcemap-codec@1.5.5': {} 3495 3947 3496 3948 '@jridgewell/trace-mapping@0.3.31': 3949 + dependencies: 3950 + '@jridgewell/resolve-uri': 3.1.2 3951 + '@jridgewell/sourcemap-codec': 1.5.5 3952 + 3953 + '@jridgewell/trace-mapping@0.3.9': 3497 3954 dependencies: 3498 3955 '@jridgewell/resolve-uri': 3.1.2 3499 3956 '@jridgewell/sourcemap-codec': 1.5.5 ··· 3691 4148 3692 4149 '@polka/url@1.0.0-next.29': {} 3693 4150 4151 + '@poppinss/colors@4.1.6': 4152 + dependencies: 4153 + kleur: 4.1.5 4154 + 4155 + '@poppinss/dumper@0.6.5': 4156 + dependencies: 4157 + '@poppinss/colors': 4.1.6 4158 + '@sindresorhus/is': 7.2.0 4159 + supports-color: 10.2.2 4160 + 4161 + '@poppinss/exception@1.2.3': {} 4162 + 3694 4163 '@rolldown/binding-android-arm64@1.1.5': 3695 4164 optional: true 3696 4165 ··· 3860 4329 '@rollup/rollup-win32-x64-msvc@4.62.2': 3861 4330 optional: true 3862 4331 4332 + '@sindresorhus/is@7.2.0': {} 4333 + 4334 + '@speed-highlight/core@1.2.17': {} 4335 + 3863 4336 '@standard-schema/spec@1.1.0': {} 3864 4337 3865 4338 '@storybook/addon-a11y@10.5.0(storybook@10.5.0(@types/react@19.2.17)(prettier@3.9.5)(react@19.2.7))': ··· 3996 4469 dependencies: 3997 4470 acorn: 8.17.0 3998 4471 4472 + '@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)': 4473 + dependencies: 4474 + '@cloudflare/workers-types': 4.20260702.1 4475 + '@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)) 4476 + worktop: 0.8.0-next.18 4477 + wrangler: 4.115.0 4478 + 3999 4479 '@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)))': 4000 4480 dependencies: 4001 4481 '@rollup/plugin-commonjs': 29.0.3(rollup@4.62.2) ··· 4438 4918 4439 4919 balanced-match@4.0.4: {} 4440 4920 4921 + blake3-wasm@2.1.5: {} 4922 + 4441 4923 brace-expansion@5.0.7: 4442 4924 dependencies: 4443 4925 balanced-match: 4.0.4 ··· 4488 4970 convert-source-map@2.0.0: {} 4489 4971 4490 4972 cookie@0.6.0: {} 4973 + 4974 + cookie@1.1.1: {} 4491 4975 4492 4976 cross-spawn@7.0.6: 4493 4977 dependencies: ··· 4589 5073 entities@7.0.1: {} 4590 5074 4591 5075 entities@8.0.0: {} 5076 + 5077 + error-stack-parser-es@1.0.5: {} 4592 5078 4593 5079 es-errors@1.3.0: {} 4594 5080 ··· 5053 5539 5054 5540 min-indent@1.0.1: {} 5055 5541 5542 + miniflare@4.20260722.1: 5543 + dependencies: 5544 + '@cspotcode/source-map-support': 0.8.1 5545 + sharp: 0.35.2 5546 + undici: 7.28.0 5547 + workerd: 1.20260722.1 5548 + ws: 8.21.0 5549 + youch: 4.1.0-beta.10 5550 + transitivePeerDependencies: 5551 + - bufferutil 5552 + - utf-8-validate 5553 + 5056 5554 minimatch@10.2.5: 5057 5555 dependencies: 5058 5556 brace-expansion: 5.0.7 ··· 5160 5658 path-key@3.1.1: {} 5161 5659 5162 5660 path-parse@1.0.7: {} 5661 + 5662 + path-to-regexp@6.3.0: {} 5163 5663 5164 5664 pathe@2.0.3: {} 5165 5665 ··· 5268 5768 indent-string: 4.0.0 5269 5769 strip-indent: 3.0.0 5270 5770 5771 + regexparam@3.0.0: {} 5772 + 5271 5773 resolve@1.22.12: 5272 5774 dependencies: 5273 5775 es-errors: 1.3.0 ··· 5351 5853 5352 5854 set-cookie-parser@3.1.2: {} 5353 5855 5856 + sharp@0.35.2: 5857 + dependencies: 5858 + '@img/colour': 1.1.0 5859 + detect-libc: 2.1.2 5860 + semver: 7.8.5 5861 + optionalDependencies: 5862 + '@img/sharp-darwin-arm64': 0.35.2 5863 + '@img/sharp-darwin-x64': 0.35.2 5864 + '@img/sharp-freebsd-wasm32': 0.35.2 5865 + '@img/sharp-libvips-darwin-arm64': 1.3.1 5866 + '@img/sharp-libvips-darwin-x64': 1.3.1 5867 + '@img/sharp-libvips-linux-arm': 1.3.1 5868 + '@img/sharp-libvips-linux-arm64': 1.3.1 5869 + '@img/sharp-libvips-linux-ppc64': 1.3.1 5870 + '@img/sharp-libvips-linux-riscv64': 1.3.1 5871 + '@img/sharp-libvips-linux-s390x': 1.3.1 5872 + '@img/sharp-libvips-linux-x64': 1.3.1 5873 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 5874 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 5875 + '@img/sharp-linux-arm': 0.35.2 5876 + '@img/sharp-linux-arm64': 0.35.2 5877 + '@img/sharp-linux-ppc64': 0.35.2 5878 + '@img/sharp-linux-riscv64': 0.35.2 5879 + '@img/sharp-linux-s390x': 0.35.2 5880 + '@img/sharp-linux-x64': 0.35.2 5881 + '@img/sharp-linuxmusl-arm64': 0.35.2 5882 + '@img/sharp-linuxmusl-x64': 0.35.2 5883 + '@img/sharp-webcontainers-wasm32': 0.35.2 5884 + '@img/sharp-win32-arm64': 0.35.2 5885 + '@img/sharp-win32-ia32': 0.35.2 5886 + '@img/sharp-win32-x64': 0.35.2 5887 + 5354 5888 shebang-command@2.0.0: 5355 5889 dependencies: 5356 5890 shebang-regex: 3.0.0 ··· 5409 5943 strip-indent@3.0.0: 5410 5944 dependencies: 5411 5945 min-indent: 1.0.1 5946 + 5947 + supports-color@10.2.2: {} 5412 5948 5413 5949 supports-color@7.2.0: 5414 5950 dependencies: ··· 5566 6102 5567 6103 undici-types@7.18.2: {} 5568 6104 6105 + undici@7.28.0: {} 6106 + 6107 + unenv@2.0.0-rc.24: 6108 + dependencies: 6109 + pathe: 2.0.3 6110 + 5569 6111 unicode-segmenter@0.14.5: {} 5570 6112 5571 6113 universalify@2.0.1: {} ··· 5661 6203 5662 6204 word-wrap@1.2.5: {} 5663 6205 6206 + workerd@1.20260722.1: 6207 + optionalDependencies: 6208 + '@cloudflare/workerd-darwin-64': 1.20260722.1 6209 + '@cloudflare/workerd-darwin-arm64': 1.20260722.1 6210 + '@cloudflare/workerd-linux-64': 1.20260722.1 6211 + '@cloudflare/workerd-linux-arm64': 1.20260722.1 6212 + '@cloudflare/workerd-windows-64': 1.20260722.1 6213 + 6214 + worktop@0.8.0-next.18: 6215 + dependencies: 6216 + mrmime: 2.0.1 6217 + regexparam: 3.0.0 6218 + 6219 + wrangler@4.115.0: 6220 + dependencies: 6221 + '@cloudflare/kv-asset-handler': 0.5.0 6222 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260722.1) 6223 + blake3-wasm: 2.1.5 6224 + esbuild: 0.28.1 6225 + miniflare: 4.20260722.1 6226 + path-to-regexp: 6.3.0 6227 + unenv: 2.0.0-rc.24 6228 + workerd: 1.20260722.1 6229 + optionalDependencies: 6230 + fsevents: 2.3.3 6231 + transitivePeerDependencies: 6232 + - bufferutil 6233 + - utf-8-validate 6234 + 6235 + ws@8.21.0: {} 6236 + 5664 6237 ws@8.21.1: {} 5665 6238 5666 6239 wsl-utils@0.1.0: ··· 5673 6246 optional: true 5674 6247 5675 6248 yocto-queue@0.1.0: {} 6249 + 6250 + youch-core@0.3.3: 6251 + dependencies: 6252 + '@poppinss/exception': 1.2.3 6253 + error-stack-parser-es: 1.0.5 6254 + 6255 + youch@4.1.0-beta.10: 6256 + dependencies: 6257 + '@poppinss/colors': 4.1.6 6258 + '@poppinss/dumper': 0.6.5 6259 + '@speed-highlight/core': 1.2.17 6260 + cookie: 1.1.1 6261 + youch-core: 0.3.3 5676 6262 5677 6263 zimmerframe@1.1.2: {} 5678 6264
+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 + }