diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ab6a833602..6dc76c423b 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -5,7 +5,15 @@ const MARKDOWN_EXT = "md,mdx" module.exports = { root: true, - plugins: ["@graphql-eslint", "mdx", "@typescript-eslint", "tailwindcss"], + plugins: [ + "@graphql-eslint", + "mdx", + "@typescript-eslint", + "tailwindcss", + "react", + "@next/next", + "react-hooks", + ], overrides: [ { files: [`**/*.{${CODE_EXT}}`], @@ -14,8 +22,42 @@ module.exports = { "plugin:@typescript-eslint/recommended", "plugin:tailwindcss/recommended", "prettier", + "plugin:@next/next/recommended", + "plugin:react-hooks/recommended-legacy", + "plugin:react/recommended", ], rules: { + "react/react-in-jsx-scope": "off", // TS checks this + "react/prop-types": "off", // and this + "no-undef": "off", // and this too + // This is type checking for projects without `@types/react`. Disabled due to false positives. + "react/no-unknown-property": "off", + + "react/no-unescaped-entities": [ + "warn", // quotes and apostrophes are okay + { + forbid: [ + { + char: "<", + alternatives: ["<"], + }, + { + char: ">", + alternatives: [">"], + }, + { + char: "{", + alternatives: ["{"], + }, + { + char: "}", + alternatives: ["}"], + }, + ], + }, + ], + "@next/next/no-img-element": "off", // straight up upsell, small `img`s actually don't need optimization + "tailwindcss/classnames-order": "off", "@typescript-eslint/no-restricted-imports": [ "error", @@ -41,6 +83,9 @@ module.exports = { tailwindcss: { whitelist: ["roboto-mono"], }, + react: { + version: "detect", + }, }, }, { @@ -63,6 +108,7 @@ module.exports = { }, rules: { "mdx/remark": "error", + "no-unused-expressions": "off", }, }, { @@ -90,7 +136,9 @@ module.exports = { { files: [ `src/pages/blog/**/*.{${MARKDOWN_EXT}}`, + `src/pages/graphql-js/running-an-express-graphql-server.mdx`, `src/code/**/*.{${MARKDOWN_EXT}}`, + `src/app/conf/**/*.{${MARKDOWN_EXT}}`, ], rules: { // Disable `remark-lint-first-heading-level` since in blogs we don't want to enforce the first heading to be an `h1` diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 6894e33cd7..0983094d3e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,9 +17,8 @@ jobs: - name: Install Dependencies run: pnpm i - # Commented out until later PR that changes the ESLint config - # - name: Run ESLint - # run: pnpm lint --quiet + - name: Run ESLint + run: pnpm lint --quiet - name: Run Prettier Check run: pnpm format:check diff --git a/package.json b/package.json index b7d60df083..b7ee9ec91e 100644 --- a/package.json +++ b/package.json @@ -21,29 +21,30 @@ }, "dependencies": { "@graphql-tools/schema": "10.0.15", - "@headlessui/react": "^1.7.17", - "@radix-ui/react-radio-group": "^1.1.3", + "@headlessui/react": "^2.2.4", + "@radix-ui/react-radio-group": "^1.2.2", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", - "@tailwindcss/typography": "^0.5.10", - "autoprefixer": "^10.4.17", - "clsx": "^2.1.0", + "@tailwindcss/typography": "^0.5.15", + "autoprefixer": "^10.4.20", + "calendar-link": "^2.10.0", + "clsx": "^2.1.1", "codemirror": "^5.65.19", "codemirror-graphql": "1.3.2", "date-fns": "^2.30.0", - "fast-glob": "^3.3.2", + "fast-glob": "^3.3.3", "graphql": "16.10.0", "gray-matter": "^4.0.3", "hast-util-to-string": "3.0.1", - "iframe-resizer-react": "^1.1.0", + "iframe-resizer-react": "^1.1.1", "leaflet": "^1.9.4", "lucide-react": "^0.469.0", - "markdown-to-jsx": "^7.4.0", + "markdown-to-jsx": "^7.7.2", "marked": "5.1.2", "motion": "^12.11.0", - "next": "^14.2.5", - "next-image-export-optimizer": "^1.12.3", - "next-query-params": "^5.0.0", + "next": "^14.2.22", + "next-image-export-optimizer": "^1.18.0", + "next-query-params": "^5.0.1", "next-sitemap": "^4.2.3", "next-with-less": "^3.0.1", "nextra": "3.0.0-alpha.28", @@ -51,7 +52,7 @@ "numbro": "2.5.0", "p-limit": "^4.0.0", "parser-front-matter": "1.6.4", - "postcss": "^8.4.33", + "postcss": "^8.4.49", "react": "^18.3.1", "react-dom": "^18.3.1", "react-medium-image-zoom": "5.2.13", @@ -59,8 +60,8 @@ "rss": "1.2.2", "server-only": "0.0.1", "string-similarity": "^4.0.4", - "string-strip-html": "^13.4.5", - "tailwindcss": "^3.4.1", + "string-strip-html": "^13.4.8", + "tailwindcss": "^3.4.17", "timeago.js": "4.0.2", "unified": "11.0.5", "unist-util-visit": "^5.0.0", @@ -68,11 +69,12 @@ }, "devDependencies": { "@graphql-eslint/eslint-plugin": "4.3.0", - "@svgr/webpack": "^8.0.1", + "@next/eslint-plugin-next": "^15.3.3", + "@svgr/webpack": "^8.1.0", "@types/codemirror": "5.60.7", "@types/hast": "3.0.4", - "@types/node": "^22.10.2", - "@types/react": "^18.2.73", + "@types/node": "^22.10.5", + "@types/react": "^18.3.18", "@types/rss": "0.0.32", "@types/string-similarity": "^4.0.2", "@typescript-eslint/eslint-plugin": "7.18.0", @@ -80,15 +82,17 @@ "eslint": "8.57.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-mdx": "^3.1.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-tailwindcss": "3.17.5", - "prettier": "3.4.2", - "prettier-plugin-pkg": "^0.18.1", - "prettier-plugin-tailwindcss": "^0.6.9", + "prettier": "3.5.3", + "prettier-plugin-pkg": "^0.20.0", + "prettier-plugin-tailwindcss": "^0.6.12", "remark-frontmatter": "5.0.0", "remark-lint-first-heading-level": "3.1.2", "remark-lint-heading-increment": "3.1.2", - "tsx": "^4.7.0", - "typescript": "^5.4.3" + "tsx": "^4.19.4", + "typescript": "^5.8.3" }, "pnpm": { "patchedDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2cde5d2db..50f31bb379 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,10 +17,10 @@ importers: specifier: 10.0.15 version: 10.0.15(graphql@16.10.0) '@headlessui/react': - specifier: ^1.7.17 - version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.2.4 + version: 2.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-radio-group': - specifier: ^1.1.3 + specifier: ^1.2.2 version: 1.2.2(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tailwindcss/container-queries': specifier: ^0.1.1 @@ -29,13 +29,16 @@ importers: specifier: 0.0.0-insiders.565cd3e version: 0.0.0-insiders.565cd3e(postcss@8.4.49) '@tailwindcss/typography': - specifier: ^0.5.10 + specifier: ^0.5.15 version: 0.5.15(tailwindcss@3.4.17) autoprefixer: - specifier: ^10.4.17 + specifier: ^10.4.20 version: 10.4.20(postcss@8.4.49) + calendar-link: + specifier: ^2.10.0 + version: 2.10.0 clsx: - specifier: ^2.1.0 + specifier: ^2.1.1 version: 2.1.1 codemirror: specifier: ^5.65.19 @@ -47,7 +50,7 @@ importers: specifier: ^2.30.0 version: 2.30.0 fast-glob: - specifier: ^3.3.2 + specifier: ^3.3.3 version: 3.3.3 graphql: specifier: 16.10.0 @@ -59,7 +62,7 @@ importers: specifier: 3.0.1 version: 3.0.1 iframe-resizer-react: - specifier: ^1.1.0 + specifier: ^1.1.1 version: 1.1.1(@babel/core@7.26.0)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) leaflet: specifier: ^1.9.4 @@ -68,7 +71,7 @@ importers: specifier: ^0.469.0 version: 0.469.0(react@18.3.1) markdown-to-jsx: - specifier: ^7.4.0 + specifier: ^7.7.2 version: 7.7.2(react@18.3.1) marked: specifier: 5.1.2 @@ -77,13 +80,13 @@ importers: specifier: ^12.11.0 version: 12.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: - specifier: ^14.2.5 + specifier: ^14.2.22 version: 14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-image-export-optimizer: - specifier: ^1.12.3 + specifier: ^1.18.0 version: 1.18.0(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) next-query-params: - specifier: ^5.0.0 + specifier: ^5.0.1 version: 5.0.1(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(use-query-params@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) next-sitemap: specifier: ^4.2.3 @@ -93,10 +96,10 @@ importers: version: 3.0.1(less-loader@12.2.0(less@4.2.1))(less@4.2.1)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) nextra: specifier: 3.0.0-alpha.28 - version: 3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + version: 3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) nextra-theme-docs: specifier: 3.0.0-alpha.28 - version: 3.0.0-alpha.28(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.0-alpha.28(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) numbro: specifier: 2.5.0 version: 2.5.0 @@ -107,7 +110,7 @@ importers: specifier: 1.6.4 version: 1.6.4 postcss: - specifier: ^8.4.33 + specifier: ^8.4.49 version: 8.4.49 react: specifier: ^18.3.1 @@ -131,10 +134,10 @@ importers: specifier: ^4.0.4 version: 4.0.4 string-strip-html: - specifier: ^13.4.5 + specifier: ^13.4.8 version: 13.4.8 tailwindcss: - specifier: ^3.4.1 + specifier: ^3.4.17 version: 3.4.17 timeago.js: specifier: 4.0.2 @@ -151,10 +154,13 @@ importers: devDependencies: '@graphql-eslint/eslint-plugin': specifier: 4.3.0 - version: 4.3.0(@types/node@22.10.5)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.7.2) + version: 4.3.0(@types/node@22.10.5)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.8.3) + '@next/eslint-plugin-next': + specifier: ^15.3.3 + version: 15.3.3 '@svgr/webpack': - specifier: ^8.0.1 - version: 8.1.0(typescript@5.7.2) + specifier: ^8.1.0 + version: 8.1.0(typescript@5.8.3) '@types/codemirror': specifier: 5.60.7 version: 5.60.7 @@ -162,10 +168,10 @@ importers: specifier: 3.0.4 version: 3.0.4 '@types/node': - specifier: ^22.10.2 + specifier: ^22.10.5 version: 22.10.5 '@types/react': - specifier: ^18.2.73 + specifier: ^18.3.18 version: 18.3.18 '@types/rss': specifier: 0.0.32 @@ -175,10 +181,10 @@ importers: version: 4.0.2 '@typescript-eslint/eslint-plugin': specifier: 7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: 7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.7.2) + version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) eslint: specifier: 8.57.1 version: 8.57.1 @@ -188,18 +194,24 @@ importers: eslint-plugin-mdx: specifier: ^3.1.5 version: 3.1.5(eslint@8.57.1) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@8.57.1) eslint-plugin-tailwindcss: specifier: 3.17.5 version: 3.17.5(tailwindcss@3.4.17) prettier: - specifier: 3.4.2 - version: 3.4.2 + specifier: 3.5.3 + version: 3.5.3 prettier-plugin-pkg: - specifier: ^0.18.1 - version: 0.18.1(prettier@3.4.2) + specifier: ^0.20.0 + version: 0.20.0(prettier@3.5.3) prettier-plugin-tailwindcss: - specifier: ^0.6.9 - version: 0.6.9(prettier@3.4.2) + specifier: ^0.6.12 + version: 0.6.12(prettier@3.5.3) remark-frontmatter: specifier: 5.0.0 version: 5.0.0 @@ -210,11 +222,11 @@ importers: specifier: 3.1.2 version: 3.1.2 tsx: - specifier: ^4.7.0 - version: 4.19.2 + specifier: ^4.19.4 + version: 4.19.4 typescript: - specifier: ^5.4.3 - version: 5.7.2 + specifier: ^5.8.3 + version: 5.8.3 packages: @@ -826,146 +838,152 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -988,6 +1006,27 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} + + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@graphql-eslint/eslint-plugin@4.3.0': resolution: {integrity: sha512-9UTJfYNGAK5GuFapsNvA+508ke8YPc9Yt6mgT4Lc+gS18p53oG5wmXd3jdmNeVOfxhUefJcJbn925vIrjg/8/g==} engines: {node: '>=18'} @@ -1132,6 +1171,13 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 + '@headlessui/react@2.2.4': + resolution: {integrity: sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1372,6 +1418,9 @@ packages: '@next/env@14.2.22': resolution: {integrity: sha512-EQ6y1QeNQglNmNIXvwP/Bb+lf7n9WtgcWvtoFsHquVLCJUuxRs+6SfZ5EK0/EqkkLex4RrDySvKgKNN7PXip7Q==} + '@next/eslint-plugin-next@15.3.3': + resolution: {integrity: sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==} + '@next/swc-darwin-arm64@14.2.22': resolution: {integrity: sha512-HUaLiehovgnqY4TMBZJ3pDaOsTE1spIXeR10pWgdQVPYqDGQmHJBj3h3V6yC0uuo/RoY2GC0YBFRkOX3dI9WVQ==} engines: {node: '>= 10'} @@ -1619,6 +1668,43 @@ packages: '@types/react': optional: true + '@react-aria/focus@3.20.3': + resolution: {integrity: sha512-rR5uZUMSY4xLHmpK/I8bP1V6vUNHFo33gTvrvNUsAKKqvMfa7R2nu5A6v97dr5g6tVH6xzpdkPsOJCWh90H2cw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.25.1': + resolution: {integrity: sha512-ntLrlgqkmZupbbjekz3fE/n3eQH2vhncx8gUp0+N+GttKWevx7jos11JUBjnJwb1RSOPgRUFcrluOqBp0VgcfQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.8': + resolution: {integrity: sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.29.0': + resolution: {integrity: sha512-jSOrZimCuT1iKNVlhjIxDkAhgF7HSp3pqyT6qjg/ZoA0wfqCi/okmrMPiWSAKBnkgX93N8GYTLT3CIEO6WZe9Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.1': + resolution: {integrity: sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==} + + '@react-stately/utils@3.10.6': + resolution: {integrity: sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.29.1': + resolution: {integrity: sha512-KtM+cDf2CXoUX439rfEhbnEdAgFZX20UP2A35ypNIawR7/PFFPjQDWyA2EnClCcW/dLWJDEPX2U8+EJff8xqmQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} @@ -1709,6 +1795,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -1727,12 +1816,21 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@tanstack/react-virtual@3.13.9': + resolution: {integrity: sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-virtual@3.8.4': resolution: {integrity: sha512-Dq0VQr3QlTS2qL35g360QaJWBt7tCn/0xw4uZ0dHXPLO1Ak4Z4nVX4vuj1Npg1b/jqNMDToRtR5OIxM2NXRBWg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/virtual-core@3.13.9': + resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} + '@tanstack/virtual-core@3.8.4': resolution: {integrity: sha512-iO5Ujgw3O1yIxWDe9FgUPNkGjyT657b1WNX52u+Wv1DyBFEpdCdGkuVaky0M3hHFqNWjAmHWTn4wgj9rTr7ZQg==} @@ -1973,6 +2071,14 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} @@ -1980,6 +2086,26 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -1988,6 +2114,10 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -1995,6 +2125,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + babel-plugin-polyfill-corejs2@0.4.12: resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: @@ -2053,6 +2187,21 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + calendar-link@2.10.0: + resolution: {integrity: sha512-m1x0/m/uBrLi5HBXMbwXnhxMHeBbS+6VvCDIPTPat30ugFT8vZ3uwXXjKjP1dDmd4YTCWpvuaPw3As/Tx1+9Vw==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2065,8 +2214,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001690: - resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + caniuse-lite@1.0.30001721: + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2407,6 +2556,18 @@ packages: dagre-d3-es@7.0.10: resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dataloader@2.2.3: resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} @@ -2454,6 +2615,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -2482,6 +2651,10 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -2509,6 +2682,10 @@ packages: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2538,8 +2715,40 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -2583,6 +2792,18 @@ packages: peerDependencies: eslint: '>=8.0.0' + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-tailwindcss@3.17.5: resolution: {integrity: sha512-8Mi7p7dm+mO1dHgRHHFdPu4RDTBk69Cn4P0B40vRQR+MrguUpwmKwhZy1kqYe3Km8/4nb+cyrCF+5SodOEmaow==} engines: {node: '>=18.12.0'} @@ -2682,6 +2903,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2730,6 +2955,10 @@ packages: focus-visible@5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} @@ -2770,16 +2999,35 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2813,10 +3061,18 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2863,6 +3119,10 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@2.0.0: resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} engines: {node: '>=0.10.0'} @@ -2875,6 +3135,21 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2983,6 +3258,10 @@ packages: inline-style-parser@0.2.3: resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -3005,12 +3284,24 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-buffer@1.0.0: resolution: {integrity: sha512-fP08vt1YuBWSWdDCWkHUDo/Gb+YpnsiK41w2kP3iAkWhMKV4uuAAwPQm9GkA4r+OCDzpa+APIOaHZW6d83e5Ug==} engines: {node: '>=4'} @@ -3019,6 +3310,10 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -3026,10 +3321,22 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.16.0: resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} @@ -3051,10 +3358,18 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -3065,6 +3380,18 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3088,10 +3415,46 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -3099,6 +3462,9 @@ packages: resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} engines: {node: '>=0.10.0'} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3111,6 +3477,10 @@ packages: peerDependencies: ws: '*' + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -3168,6 +3538,10 @@ packages: engines: {node: '>=6'} hasBin: true + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + katex@0.16.10: resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} hasBin: true @@ -3315,6 +3689,10 @@ packages: engines: {node: '>= 16'} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mathjax-full@3.2.2: resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} @@ -3806,6 +4184,30 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3813,6 +4215,10 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -3920,6 +4326,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -3983,21 +4393,21 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-pkg@0.18.1: - resolution: {integrity: sha512-FuUxvsYZR/8rsLH8s/jbPQmgYvv0yxW8LoIHCy6+Q7p4FBjjdP3DNKx8fMTOsc0SlEB1skB4o1LcahRceIh87A==} + prettier-plugin-pkg@0.20.0: + resolution: {integrity: sha512-SOMC6CweLsSAmbtaZJcv8z9oHY7okHrHm9WW0r9xYIdUJQJS3aw8pUUdve6Typ1fiBQM9roc2U3s6K5ud5oyaA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: prettier: ^3.0.3 - prettier-plugin-tailwindcss@0.6.9: - resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==} + prettier-plugin-tailwindcss@0.6.12: + resolution: {integrity: sha512-OuTQKoqNwV7RnxTPwXWzOFXy6Jc4z8oeRZYGuMpRyG3WbuR3jjXdQFK8qFBMBx8UHWdHrddARz2fgUenild6aw==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig-melody': '*' + '@zackad/prettier-plugin-twig': '*' prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' @@ -4019,7 +4429,7 @@ packages: optional: true '@trivago/prettier-plugin-sort-imports': optional: true - '@zackad/prettier-plugin-twig-melody': + '@zackad/prettier-plugin-twig': optional: true prettier-plugin-astro: optional: true @@ -4044,8 +4454,8 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -4133,6 +4543,10 @@ packages: reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -4146,6 +4560,10 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -4224,6 +4642,10 @@ packages: resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} hasBin: true + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -4264,9 +4686,21 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -4307,10 +4741,22 @@ packages: server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + set-getter@0.1.1: resolution: {integrity: sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==} engines: {node: '>=0.10.0'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -4338,6 +4784,22 @@ packages: shiki@1.2.1: resolution: {integrity: sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4381,6 +4843,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4420,6 +4886,25 @@ packages: resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} engines: {node: '>=16'} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4508,6 +4993,9 @@ packages: resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -4577,8 +5065,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + tsx@4.19.4: + resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} engines: {node: '>=18.0.0'} hasBin: true @@ -4602,14 +5090,34 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -4733,6 +5241,11 @@ packages: react-router-dom: optional: true + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4797,6 +5310,22 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -5675,76 +6204,79 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.23.1': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': @@ -5770,16 +6302,41 @@ snapshots: '@eslint/js@8.57.1': {} - '@graphql-eslint/eslint-plugin@4.3.0(@types/node@22.10.5)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.7.2)': + '@floating-ui/core@1.7.0': dependencies: - '@graphql-tools/code-file-loader': 8.1.10(graphql@16.10.0) - '@graphql-tools/graphql-tag-pluck': 8.3.9(graphql@16.10.0) + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.7.0': + dependencies: + '@floating-ui/core': 1.7.0 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.9': {} + + '@graphql-eslint/eslint-plugin@4.3.0(@types/node@22.10.5)(eslint@8.57.1)(graphql@16.10.0)(typescript@5.8.3)': + dependencies: + '@graphql-tools/code-file-loader': 8.1.10(graphql@16.10.0) + '@graphql-tools/graphql-tag-pluck': 8.3.9(graphql@16.10.0) '@graphql-tools/utils': 10.6.4(graphql@16.10.0) debug: 4.4.0 eslint: 8.57.1 fast-glob: 3.3.3 graphql: 16.10.0 - graphql-config: 5.1.3(@types/node@22.10.5)(graphql@16.10.0)(typescript@5.7.2) + graphql-config: 5.1.3(@types/node@22.10.5)(graphql@16.10.0)(typescript@5.8.3) graphql-depth-limit: 1.1.0(graphql@16.10.0) lodash.lowercase: 4.3.0 transitivePeerDependencies: @@ -5996,6 +6553,16 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@headlessui/react@2.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.20.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/interactions': 3.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -6208,6 +6775,10 @@ snapshots: '@next/env@14.2.22': {} + '@next/eslint-plugin-next@15.3.3': + dependencies: + fast-glob: 3.3.1 + '@next/swc-darwin-arm64@14.2.22': optional: true @@ -6401,14 +6972,63 @@ snapshots: optionalDependencies: '@types/react': 18.3.18 + '@react-aria/focus@3.20.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.29.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/interactions@3.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.8(react@18.3.1) + '@react-aria/utils': 3.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/flags': 3.1.1 + '@react-types/shared': 3.29.1(react@18.3.1) + '@swc/helpers': 0.5.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.8(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-aria/utils@3.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.8(react@18.3.1) + '@react-stately/flags': 3.1.1 + '@react-stately/utils': 3.10.6(react@18.3.1) + '@react-types/shared': 3.29.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-stately/flags@3.1.1': + dependencies: + '@swc/helpers': 0.5.17 + + '@react-stately/utils@3.10.6(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-types/shared@3.29.1(react@18.3.1)': + dependencies: + react: 18.3.1 + '@repeaterjs/repeater@3.0.6': {} '@shikijs/core@1.2.1': {} - '@shikijs/twoslash@1.2.1(typescript@5.7.2)': + '@shikijs/twoslash@1.2.1(typescript@5.8.3)': dependencies: '@shikijs/core': 1.2.1 - twoslash: 0.2.5(typescript@5.7.2) + twoslash: 0.2.5(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript @@ -6457,12 +7077,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0) - '@svgr/core@8.1.0(typescript@5.7.2)': + '@svgr/core@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.26.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.7.2) + cosmiconfig: 8.3.6(typescript@5.8.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -6473,41 +7093,45 @@ snapshots: '@babel/types': 7.26.3 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.7.2))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': dependencies: '@babel/core': 7.26.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) - '@svgr/core': 8.1.0(typescript@5.7.2) + '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.7.2))(typescript@5.7.2)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.7.2) - cosmiconfig: 8.3.6(typescript@5.7.2) + '@svgr/core': 8.1.0(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.8.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/webpack@8.1.0(typescript@5.7.2)': + '@svgr/webpack@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.0) '@babel/preset-env': 7.26.0(@babel/core@7.26.0) '@babel/preset-react': 7.26.3(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@svgr/core': 8.1.0(typescript@5.7.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.2)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.7.2))(typescript@5.7.2) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 @@ -6530,12 +7154,20 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17 + '@tanstack/react-virtual@3.13.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.13.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@tanstack/react-virtual@3.8.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.8.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@tanstack/virtual-core@3.13.9': {} + '@tanstack/virtual-core@3.8.4': {} '@theguild/remark-mermaid@0.0.7(react@18.3.1)': @@ -6646,34 +7278,34 @@ snapshots: dependencies: '@types/node': 22.10.5 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.3.0(typescript@5.8.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.4 eslint: 8.57.1 optionalDependencies: - typescript: 5.7.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6682,21 +7314,21 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.3.4 eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.3.0(typescript@5.8.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -6705,18 +7337,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.3.0(typescript@5.8.3) optionalDependencies: - typescript: 5.7.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -6800,24 +7432,87 @@ snapshots: argparse@2.0.1: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + array-iterate@2.0.1: {} array-union@2.1.0: {} + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + arrify@1.0.1: {} astring@1.8.6: {} + async-function@1.0.0: {} + autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + caniuse-lite: 1.0.30001721 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.4.49 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: '@babel/compat-data': 7.26.3 @@ -6872,7 +7567,7 @@ snapshots: browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001690 + caniuse-lite: 1.0.30001721 electron-to-chromium: 1.5.74 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) @@ -6883,13 +7578,34 @@ snapshots: dependencies: streamsearch: 1.1.0 + calendar-link@2.10.0: + dependencies: + dayjs: 1.11.10 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase-css@2.0.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001690: {} + caniuse-lite@1.0.30001721: {} ccount@2.0.1: {} @@ -7025,14 +7741,14 @@ snapshots: dependencies: layout-base: 1.0.2 - cosmiconfig@8.3.6(typescript@5.7.2): + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.8.3 cross-inspect@1.0.1: dependencies: @@ -7266,6 +7982,24 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.21 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dataloader@2.2.3: {} date-fns@2.30.0: @@ -7294,6 +8028,18 @@ snapshots: deepmerge@4.3.1: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -7316,6 +8062,10 @@ snapshots: dlv@1.1.3: {} + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -7347,6 +8097,12 @@ snapshots: dset@3.1.3: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} electron-to-chromium@1.5.74: {} @@ -7370,32 +8126,134 @@ snapshots: dependencies: is-arrayish: 0.2.1 - esbuild@0.23.1: + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -7450,6 +8308,32 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.5(eslint@8.57.1): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + eslint-plugin-tailwindcss@3.17.5(tailwindcss@3.4.17): dependencies: fast-glob: 3.3.3 @@ -7589,6 +8473,14 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7643,6 +8535,10 @@ snapshots: focus-visible@5.2.0: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + for-in@1.0.2: {} foreground-child@3.3.0: @@ -7670,11 +8566,46 @@ snapshots: function-bind@1.1.2: {} + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + gensync@1.0.0-beta.2: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@3.0.0: {} - get-tsconfig@4.8.1: + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -7720,6 +8651,11 @@ snapshots: dependencies: type-fest: 0.20.2 + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -7729,11 +8665,13 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} - graphql-config@5.1.3(@types/node@22.10.5)(graphql@16.10.0)(typescript@5.7.2): + graphql-config@5.1.3(@types/node@22.10.5)(graphql@16.10.0)(typescript@5.8.3): dependencies: '@graphql-tools/graphql-file-loader': 8.0.8(graphql@16.10.0) '@graphql-tools/json-file-loader': 8.0.8(graphql@16.10.0) @@ -7741,7 +8679,7 @@ snapshots: '@graphql-tools/merge': 9.0.14(graphql@16.10.0) '@graphql-tools/url-loader': 8.0.20(@types/node@22.10.5)(graphql@16.10.0) '@graphql-tools/utils': 10.6.4(graphql@16.10.0) - cosmiconfig: 8.3.6(typescript@5.7.2) + cosmiconfig: 8.3.6(typescript@5.8.3) graphql: 16.10.0 jiti: 2.4.2 minimatch: 9.0.5 @@ -7785,12 +8723,28 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 + has-bigints@1.1.0: {} + has-flag@2.0.0: {} has-flag@3.0.0: {} has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -7977,6 +8931,12 @@ snapshots: inline-style-parser@0.2.3: {} + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + internmap@1.0.1: {} internmap@2.0.3: {} @@ -7997,10 +8957,28 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + is-binary-buffer@1.0.0: dependencies: is-buffer: 1.1.6 @@ -8009,14 +8987,32 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-buffer@1.1.6: {} is-buffer@2.0.5: {} + is-callable@1.2.7: {} + is-core-module@2.16.0: dependencies: hasown: 2.0.2 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-decimal@1.0.4: {} is-decimal@2.0.1: {} @@ -8031,8 +9027,19 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -8041,6 +9048,15 @@ snapshots: is-hexadecimal@2.0.1: {} + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-path-inside@3.0.3: {} @@ -8057,12 +9073,53 @@ snapshots: dependencies: '@types/estree': 1.0.5 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + is-stream@1.1.0: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-what@3.14.1: {} is-whitespace@0.3.0: {} + isarray@2.0.5: {} + isexe@2.0.0: {} isobject@3.0.1: {} @@ -8071,6 +9128,15 @@ snapshots: dependencies: ws: 8.18.0 + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 @@ -8114,6 +9180,13 @@ snapshots: json5@2.2.3: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + katex@0.16.10: dependencies: commander: 8.3.0 @@ -8239,6 +9312,8 @@ snapshots: marked@5.1.2: {} + math-intrinsics@1.1.0: {} + mathjax-full@3.2.2: dependencies: esm: 3.2.25 @@ -8997,7 +10072,7 @@ snapshots: next: 14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 sharp: 0.33.5 - typescript: 5.7.2 + typescript: 5.8.3 next-query-params@5.0.1(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(use-query-params@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: @@ -9031,7 +10106,7 @@ snapshots: '@next/env': 14.2.22 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001690 + caniuse-lite: 1.0.30001721 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -9051,7 +10126,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.0.0-alpha.28(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@3.0.0-alpha.28(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -9062,19 +10137,19 @@ snapshots: intersection-observer: 0.12.2 next: 14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + nextra: 3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.22.4 - nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2): + nextra@3.0.0-alpha.28(patch_hash=rggcgtpcrgz5zyoxmhwje4p6rm)(@types/react@18.3.18)(next@14.2.22(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 3.0.1 '@mdx-js/react': 3.0.1(@types/react@18.3.18)(react@18.3.1) '@napi-rs/simple-git': 0.1.16 - '@shikijs/twoslash': 1.2.1(typescript@5.7.2) + '@shikijs/twoslash': 1.2.1(typescript@5.8.3) '@theguild/remark-mermaid': 0.0.7(react@18.3.1) '@theguild/remark-npm2yarn': 0.3.0 better-react-mathjax: 2.0.3(react@18.3.1) @@ -9162,6 +10237,40 @@ snapshots: object-hash@3.0.0: {} + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -9175,6 +10284,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-finally@1.0.0: {} p-limit@3.1.0: @@ -9295,6 +10410,8 @@ snapshots: pirates@4.0.6: {} + possible-typed-array-names@1.1.0: {} + postcss-import@15.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -9355,15 +10472,15 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-pkg@0.18.1(prettier@3.4.2): + prettier-plugin-pkg@0.20.0(prettier@3.5.3): dependencies: - prettier: 3.4.2 + prettier: 3.5.3 - prettier-plugin-tailwindcss@0.6.9(prettier@3.4.2): + prettier-plugin-tailwindcss@0.6.12(prettier@3.5.3): dependencies: - prettier: 3.4.2 + prettier: 3.5.3 - prettier@3.4.2: {} + prettier@3.5.3: {} proc-log@3.0.0: {} @@ -9447,6 +10564,17 @@ snapshots: reading-time@1.5.0: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -9459,6 +10587,15 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -9609,6 +10746,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -9659,8 +10802,27 @@ snapshots: dependencies: mri: 1.2.0 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} sax@1.4.1: @@ -9694,10 +10856,32 @@ snapshots: server-only@0.0.1: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + set-getter@0.1.1: dependencies: to-object-path: 0.3.0 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -9744,6 +10928,34 @@ snapshots: dependencies: '@shikijs/core': 1.2.1 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -9778,6 +10990,11 @@ snapshots: sprintf-js@1.0.3: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamsearch@1.1.0: {} string-collapse-leading-whitespace@7.0.7: {} @@ -9821,6 +11038,50 @@ snapshots: emoji-regex: 10.4.0 strip-ansi: 7.1.0 + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -9906,6 +11167,8 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 + tabbable@6.2.0: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -9974,9 +11237,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.7.2): + ts-api-utils@1.3.0(typescript@5.8.3): dependencies: - typescript: 5.7.2 + typescript: 5.8.3 ts-dedent@2.2.0: {} @@ -9986,20 +11249,20 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.2: + tsx@4.19.4: dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.8.1 + esbuild: 0.25.5 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 twoslash-protocol@0.2.5: {} - twoslash@0.2.5(typescript@5.7.2): + twoslash@0.2.5(typescript@5.8.3): dependencies: '@typescript/vfs': 1.5.0 twoslash-protocol: 0.2.5 - typescript: 5.7.2 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -10011,9 +11274,49 @@ snapshots: type-fest@3.13.1: {} + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typedarray@0.0.6: {} - typescript@5.7.2: {} + typescript@5.8.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 undici-types@6.19.8: {} @@ -10197,6 +11500,10 @@ snapshots: react-dom: 18.3.1(react@18.3.1) serialize-query-params: 2.0.2 + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} uuid@9.0.1: {} @@ -10280,6 +11587,47 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@1.3.1: dependencies: isexe: 2.0.0 diff --git a/scripts/sync-sched/schedule-2025.json b/scripts/sync-sched/schedule-2025.json index ce6339ac91..c91c1186d7 100644 --- a/scripts/sync-sched/schedule-2025.json +++ b/scripts/sync-sched/schedule-2025.json @@ -3,23 +3,97 @@ "event_key": "1", "active": "Y", "pinned": "N", - "name": "Keynote Session Example", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-08 08:00", + "event_end": "2025-09-08 18:30", + "event_type": "Registration + Badge Pick-up", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "BG Foyer", + "id": "aa6a893426a3d92bcbc4b140abeb56c6", + "venue_id": "2152797", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "18:30", + "start_date": "2025-09-08", + "start_time": "08:00:00", + "start_time_ts": 1757314800, + "end_date": "2025-09-08", + "end_time": "18:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "15", + "active": "Y", + "pinned": "N", + "name": "Keynote: Welcome & Opening Remarks", "event_start": "2025-09-08 09:00", - "event_end": "2025-09-08 09:15", + "event_end": "2025-09-08 09:10", "event_type": "Keynote Sessions", "goers": "0", "seats": "0", "invite_only": "N", - "venue": "Keynote Room", - "audience": "Any", - "id": "aa6a893426a3d92bcbc4b140abeb56c6", - "venue_id": "2111098", + "venue": "Grote Zaal", + "company": "Any", + "id": "3276a4a0491cb8293b9f5cbe46c68866", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:10", + "start_date": "2025-09-08", + "start_time": "09:00:00", + "start_time_ts": 1757318400, + "end_date": "2025-09-08", + "end_time": "09:10:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "922697", + "active": "Y", + "pinned": "N", + "name": "What Is the GraphQL Foundation? - Jeff Auriemma, Apollo GraphQL", + "event_start": "2025-09-08 09:10", + "event_end": "2025-09-08 09:20", + "event_type": "Keynote Sessions", + "description": "This talk will give attendees an overview of the structure of GraphQL's official organizations: The GraphQL Foundation and the GraphQL Specification Project. It will get specific about the governance and roadmaps of each organization and their specific priorities in 2025 and beyond.\n \nIn my time serving in these various institutions, I've noticed that even the most active GraphQL practitioners aren't fully aware of what they are and what they do. Attendees will learn about the GraphQL Working Group, the Technical Steering Committee, and the Foundation's Governing Board. We'll also touch upon the various technical working groups and the new Community Working Group. The talk culminates in a call to action for folks to get involved.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "1874c6f0bece5c91a1b6ff621cd21e2d", + "venue_id": "2152800", "speakers": [ { - "username": "lee_byron.25jvpjmb", - "id": "18743534", - "name": "Lee Byron", - "company": "GraphQL Foundation", + "username": "jeff.auriemma", + "id": "18743876", + "name": "Jeff Auriemma", + "company": "Apollo GraphQL", "custom_order": 0 } ], @@ -29,37 +103,37 @@ "event_start_day": "8", "event_start_weekday": "Monday", "event_start_weekday_short": "Mon", - "event_start_time": "09:00", + "event_start_time": "09:10", "event_end_year": "2025", "event_end_month": "September", "event_end_month_short": "Sep", "event_end_day": "8", "event_end_weekday": "Monday", "event_end_weekday_short": "Mon", - "event_end_time": "09:15", + "event_end_time": "09:20", "start_date": "2025-09-08", - "start_time": "09:00:00", - "start_time_ts": 1757318400, + "start_time": "09:10:00", + "start_time_ts": 1757319000, "end_date": "2025-09-08", - "end_time": "09:15:00", - "event_type_sort": "2", - "description": "" + "end_time": "09:20:00", + "event_subtype": "" }, { - "event_key": "2", + "event_key": "927784", "active": "Y", "pinned": "N", - "name": "Breakout session example", - "event_start": "2025-09-10 10:30", - "event_end": "2025-09-10 10:45", - "event_type": "Breakout Session", - "description": "This is an example description.", + "name": "Community Update 2025: Growing in the Open - Benjie Gillam, Graphile & Uri Goldshtein, The Guild", + "event_start": "2025-09-08 09:20", + "event_end": "2025-09-08 09:30", + "event_type": "Keynote Sessions", + "description": "Even ten years in, GraphQL continues to evolve—not just in code, but in connection. This year the Foundation has doubled down on transparency, support, and shared leadership: board minutes are now public, Subject Matter Experts have helped shape the conference agenda, and we'll be launching a new program live on stage! There are also updates on our existing initiatives including community grants and GraphQL Locals.\n \nThis talk is a thank you to the people behind the progress and a celebration of our growing constellation of contributors. It's also an invitation to step forward and get involved—one of the best ways to do that is by joining our new Community Working Group, giving passionate community members a voice in shaping the Foundation's directions and initiatives for the next ten years of GraphQL.", "goers": "0", "seats": "0", "invite_only": "N", - "venue": "Breakout Session Room", - "id": "c0205884be221948a39bc4af9939c675", - "venue_id": "2111100", + "venue": "Grote Zaal", + "company": "Any", + "id": "f31a60c9bffdbc04ea8fe446bd8d644b", + "venue_id": "2152800", "speakers": [ { "username": "benjie3", @@ -67,27 +141,3429 @@ "name": "Benjie Gillam", "company": "Graphile", "custom_order": 0 + }, + { + "username": "uri_goldshtein.23xujj9a", + "id": "14900013", + "name": "Uri Goldshtein", + "company": "The Guild", + "custom_order": 1 } ], "event_start_year": "2025", "event_start_month": "September", "event_start_month_short": "Sep", - "event_start_day": "10", - "event_start_weekday": "Wednesday", - "event_start_weekday_short": "Wed", - "event_start_time": "10:30", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:20", "event_end_year": "2025", "event_end_month": "September", "event_end_month_short": "Sep", - "event_end_day": "10", - "event_end_weekday": "Wednesday", - "event_end_weekday_short": "Wed", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "09:30", + "start_date": "2025-09-08", + "start_time": "09:20:00", + "start_time_ts": 1757319600, + "end_date": "2025-09-08", + "end_time": "09:30:00", + "event_subtype": "" + }, + { + "event_key": "16", + "active": "Y", + "pinned": "N", + "name": "Keynote Sessions to be Announced", + "event_start": "2025-09-08 09:30", + "event_end": "2025-09-08 10:20", + "event_type": "Keynote Sessions", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "d76bd13df5fb354ed716d88f5e3ba88d", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "09:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "10:20", + "start_date": "2025-09-08", + "start_time": "09:30:00", + "start_time_ts": 1757320200, + "end_date": "2025-09-08", + "end_time": "10:20:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "4", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-08 10:20", + "event_end": "2025-09-08 10:45", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "34f3bff88293c5b2c571cc440aa44141", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", "event_end_time": "10:45", - "start_date": "2025-09-10", - "start_time": "10:30:00", - "start_time_ts": 1757496600, - "end_date": "2025-09-10", + "start_date": "2025-09-08", + "start_time": "10:20:00", + "start_time_ts": 1757323200, + "end_date": "2025-09-08", "end_time": "10:45:00", - "event_type_sort": "1" + "event_subtype": "", + "description": "" + }, + { + "event_key": "910351", + "active": "Y", + "pinned": "N", + "name": "GraphQL Federation on Top of 1700+ Swaggers - Arnaud Leymet, Bouygues Telecom", + "event_start": "2025-09-08 10:45", + "event_end": "2025-09-08 11:15", + "event_type": "GraphQL in Production", + "description": "Large enterprises often benefit from numerous teams executing a wide array of operations, each with its own specifications. Bouygues Telecom in France is a prime example, boasting over 1,700 swagger endpoints (and counting). This diversity often leads to challenges such as path and schema conflicts. We will demonstrate to our audience how we overcame these obstacles by leveraging the guild's comprehensive toolkit to create a unified Knowledge Graph that serves our entire enterprise.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Advanced", + "id": "8ce9df846276a2fc5c1b050aae61d8de", + "venue_id": "2152806", + "speakers": [ + { + "username": "aleymet", + "id": "23098717", + "name": "Arnaud Leymet", + "company": "Bouygues Telecom", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:15", + "start_date": "2025-09-08", + "start_time": "10:45:00", + "start_time_ts": 1757324700, + "end_date": "2025-09-08", + "end_time": "11:15:00", + "event_subtype": "Case studies" + }, + { + "event_key": "913063", + "active": "Y", + "pinned": "N", + "name": "How To Use Fragments (they're Not for Re-use!) - Janette Cheng, Meta", + "event_start": "2025-09-08 10:45", + "event_end": "2025-09-08 11:15", + "event_type": "GraphQL in Production", + "description": "The most natural way to understand fragments is as a reusable part of a query. We at Meta know that this isn't true and can lead to a world of pain when it comes to making sure the data you fetch matches the code that uses that data (no over-fetching).\n \nThe worst part is both the GraphQL spec and the educational materials mention re-use for fragments as part of their value:\n\"Fragments allow for the reuse of common repeated selections of fields, reducing duplicated text in the document.\"\n \nThis talk will explain what we've learned is the best way to use fragments (as subcomponents you convert to in order to pass to the logic that is tied to that fragment).\n \nWe will use Relay's per-file graphql co-location as a demonstration of this philosophy in action", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Beginner", + "id": "95c83506420d9a9a3a971a8802ba96f8", + "venue_id": "2152809", + "speakers": [ + { + "username": "janettelc", + "id": "23098753", + "name": "Janette Cheng", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "10:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:15", + "start_date": "2025-09-08", + "start_time": "10:45:00", + "start_time_ts": 1757324700, + "end_date": "2025-09-08", + "end_time": "11:15:00", + "event_subtype": "Scaling" + }, + { + "event_key": "927779", + "active": "Y", + "pinned": "N", + "name": "Fixing GraphQL's Biggest Mistake in 512 Bytes - Benjie Gillam, Graphile", + "event_start": "2025-09-08 11:25", + "event_end": "2025-09-08 11:55", + "event_type": "Developer Experience", + "description": "GraphQL error handling sucks. There, I said it.\n \nEver hunted through the errors list to figure out if a null was legit or caused by an error? If you're like me, you gave up and now treat nulls as \"maybe errored, maybe absent, maybe both.\"\n \nAnd nullability. Schema designers make anything that might fail nullable, producing partial responses when errors occur. But since anything can fail, now everything is nullable—\nand we're drowning in null checks. We recklessly cast to non-null or fall back to the empty string out of desperation. And we still don't know what's truly nullable.\n \nNo more.\n \nThis talk introduces a new, pragmatic approach, born from years of work by the Nullability WG. We propose a future where schemas reflect the true nullability of business entities, and error handling is where it belongs: in your code, not your data. Use your language's built-in tools to handle errors ergonomically; and drop the unnecessary null checks. When you read a null, it should mean one thing: the absence of data.\n \nThis isn't some distant ideal on the horizon of GraphQL's future; with just 512 bytes added to your GraphQL client, you can start adopting this today. Come see how.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "4ed67778faddda05ce0a191e525d43ee", + "venue_id": "2152800", + "speakers": [ + { + "username": "benjie3", + "id": "18743846", + "name": "Benjie Gillam", + "company": "Graphile", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:55", + "start_date": "2025-09-08", + "start_time": "11:25:00", + "start_time_ts": 1757327100, + "end_date": "2025-09-08", + "end_time": "11:55:00", + "event_subtype": "Frontend" + }, + { + "event_key": "924672", + "active": "Y", + "pinned": "N", + "name": "Performant GraphQL at Scale - Andreas Marek, Atlassian", + "event_start": "2025-09-08 11:25", + "event_end": "2025-09-08 11:55", + "event_type": "GraphQL in Production", + "description": "After maintaining GraphQL Java for 10 years we learned what aspects of GraphQL are critical for optimal performance. \n \nWe we look at what users of GraphQL should consider and which aspects of the spec are critical for optimal performance.\n \nWe will look also closer into the aspects of operating GraphQL at scale including and what it means when the schema and requests continue to grow.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "80ed10821b62754e5321d4984181cbfa", + "venue_id": "2152809", + "speakers": [ + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "11:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "11:55", + "start_date": "2025-09-08", + "start_time": "11:25:00", + "start_time_ts": 1757327100, + "end_date": "2025-09-08", + "end_time": "11:55:00", + "event_subtype": "Scaling" + }, + { + "event_key": "925253", + "active": "Y", + "pinned": "N", + "name": "Offset Pagination Is Dead! Meet Relative Cursors - Michael Staib, ChilliCream", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:15", + "event_type": "Developer Experience", + "description": "What if you could keep traditional UI pagination concepts, but with the performance and reliability of cursor-based pagination? In this lightning talk, you’ll learn how relative cursors enable fast, consistent pagination while preserving familiar UX patterns like “jump to page.” It’s a smarter, more robust approach to navigating data—ideal for modern APIs and real-world apps.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Advanced", + "id": "73b37145c961856b3c857568d0739a9f", + "venue_id": "2152800", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:15", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757329500, + "end_date": "2025-09-08", + "end_time": "12:15:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "903215", + "active": "Y", + "pinned": "N", + "name": "Modernizing a Million Lines of Code: Jira's Journey To GraphQL and Relay - Sourav Shaw & Vivek Yadav, Atlassian", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:35", + "event_type": "GraphQL in Production", + "description": "Abstract\nDiscover how we transformed Jira's issue view to GraphQL and Relay—handling billions of monthly interactions across 100+ field types while meeting enterprise compliance and reliability agreements. With hundreds of developers and teams modifying a decade-old codebase daily in a frontend monorepo, we faced unique challenges in technical design and execution.\nWe'll share:\n- GraphQL schema design for scale\n- Bridging Redux, Sweet State, and Relay in a multi-team environment\n- Incremental rollout strategies with feature flags for safe migration\n- Field-by-field adoption approaches maintaining workflow and compliance\n- Performance optimization under enterprise-scale load\n- Testing approaches at scale\n- Developer experience takeaways\n \nImpact & Takeaways\n- Performance metrics during incremental migration\n- Developer experience improvements\n- Cross-team collaboration\n- Production-proven strategies for state management in existing codebase\n \nThis isn't about building new—it's about modernizing Jira's critical interface while maintaining compliance for enterprise customers. Ideal for leaders coordinating teams and architects planning GraphQL adoption in regulated organizations.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Advanced", + "id": "66474085903bcfccef1dc71e1784b204", + "venue_id": "2152806", + "speakers": [ + { + "username": "shawsourav91", + "id": "23098801", + "name": "Sourav Shaw", + "company": "Atlassian", + "custom_order": 0 + }, + { + "username": "vivekyadav.cse.2005", + "id": "23098813", + "name": "Vivek Yadav", + "company": "Atlassian", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757329500, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "event_subtype": "Case studies" + }, + { + "event_key": "922057", + "active": "Y", + "pinned": "N", + "name": "@async: Defer Even More! - Matt Mahoney, Meta", + "event_start": "2025-09-08 12:05", + "event_end": "2025-09-08 12:35", + "event_type": "GraphQL in Production", + "description": "@defer allows you to specify which parts of your operation are urgent, and which can be delayed. However, there is still a contract with @defer: all your data will always be returned, at some later point.\n \nThis poses a problem for certain classes of product: if only 10% of your operation will ever be on consumed, but you don't know exactly which 10% that will be, defer can introduce substantial hidden costs. To improve performance and reduce compute costs, Meta created @async to ensure products only ask for data when it's needed.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Advanced", + "id": "4614b0dbd6236e202a87270ceda0c3bf", + "venue_id": "2152809", + "speakers": [ + { + "username": "matt_mahoney.28dhc1w9", + "id": "23099454", + "name": "Matt Mahoney", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:05:00", + "start_time_ts": 1757329500, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "event_subtype": "Scaling" + }, + { + "event_key": "925279", + "active": "Y", + "pinned": "N", + "name": "See the Graph in GraphQL: Graph Visualization in Action - Ivan Goncharov, ApolloGraphQL", + "event_start": "2025-09-08 12:25", + "event_end": "2025-09-08 12:35", + "event_type": "Developer Experience", + "description": "Despite having \"Graph\" in its name, GraphQL schemas are rarely visualized as actual graphs. \n \nThis lightning talk explores the untapped potential of graph visualization for GraphQL schemas based on lessons learned while working on graphql-voyager. \n \nWe'll explore the theory behind effective schema visualization, share key insights from my 9 years of experience in this field, and discuss current challenges in representing complex schemas. \n \nI'll also present experimental approaches that go beyond existing libraries, pushing the boundaries of how we understand and interact with GraphQL schemas. \n \nJoin me for a visual journey that reveals what makes the \"Graph\" in GraphQL truly powerful, potentially reshaping how we design and understand our APIs.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "2a74602450df6a446ac2b18d6e6fa6b5", + "venue_id": "2152800", + "speakers": [ + { + "username": "ivan.goncharov.ua", + "id": "23096422", + "name": "Ivan Goncharov", + "company": "ApolloGraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "12:35", + "start_date": "2025-09-08", + "start_time": "12:25:00", + "start_time_ts": 1757330700, + "end_date": "2025-09-08", + "end_time": "12:35:00", + "event_subtype": "Documentation" + }, + { + "event_key": "10", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2025-09-08 12:35", + "event_end": "2025-09-08 13:45", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "457da0fb4bd44feb088e8f4388b0f9c1", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "12:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "13:45", + "start_date": "2025-09-08", + "start_time": "12:35:00", + "start_time_ts": 1757331300, + "end_date": "2025-09-08", + "end_time": "13:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "894556", + "active": "Y", + "pinned": "N", + "name": "From Docs To Conversation & Action - Daniel Hai, monday.com", + "event_start": "2025-09-08 13:45", + "event_end": "2025-09-08 14:15", + "event_type": "Developer Experience", + "description": "Great documentation has always been the gold standard of API developer experience, and always a real challenge for GraphQL APIs. With the rise of AI and interactive API playgrounds, developer expectations have evolved. Static docs can be slow, confusing, and outdated, while an AI-powered assistant and API playground offer a dynamic, conversational, and instantly actionable experience. In this session, we’ll explore how we at monday.com leveraged AI and interactive tools to replace traditional documentation for our public GraphQL API, reducing friction and accelerating adoption.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "ed1b84b384c39fd16cbba908aeeda283", + "venue_id": "2152806", + "speakers": [ + { + "username": "danielha4", + "id": "23098732", + "name": "Daniel Hai", + "company": "monday.com", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:15", + "start_date": "2025-09-08", + "start_time": "13:45:00", + "start_time_ts": 1757335500, + "end_date": "2025-09-08", + "end_time": "14:15:00", + "event_subtype": "Documentation" + }, + { + "event_key": "882751", + "active": "Y", + "pinned": "N", + "name": "GraphQL Subscriptions Are Stateful; We Made Them Stateless - Matteo Collina, Platformatic", + "event_start": "2025-09-08 13:45", + "event_end": "2025-09-08 14:15", + "event_type": "GraphQL in Production", + "description": "GraphQL Subscriptions over WebSockets is an extremely popular way to notify the caller that something happened on the back end. While a high level of Quality of Service is possible in other protocols such as STOMP or MQTT, there is no actual guarantee of delivery with GraphQL Subscriptions: any acknowledgment mechanism should be built in userland.\n \nWebSockets can be interrupted at any time with both graceful and ungraceful disconnections, and the lack of acknowledgment in the subscription protocol affects reliability, making GraphQL Subscription over WebSocket connections susceptible to disconnections, as any protocol failures will result in messages being lost. In other words, Subscriptions are stateful. In this talk, we will investigate a mitigation technique to make them resumable so that the connection can be destroyed and recreated without any message loss.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "0c3828d450fca7c409a3dda68f066428", + "venue_id": "2152800", + "speakers": [ + { + "username": "matteo.collina1", + "id": "11925534", + "name": "Matteo Collina", + "company": "Platformatic", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:15", + "start_date": "2025-09-08", + "start_time": "13:45:00", + "start_time_ts": 1757335500, + "end_date": "2025-09-08", + "end_time": "14:15:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "926734", + "active": "Y", + "pinned": "N", + "name": "Composing Your UI With GraphQL: Building Federated Component Systems That Scale - Gabriel Cura-Castro, StubHub Inc", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "Developer Experience", + "description": "GraphQL federation has changed how we think about data and it's time to adopt that thinking to how we build UIs and component systems. In this talk, Gabe will share his deep experience from building design systems at Apple, Netflix and now StubHub to help you design yours.\n \nWhat are the advantages GraphQL brings to a traditional React component system? How can fragments optimize the composability of your components? How to reduce duplication while reducing the time you need to ship new features?\n \nWe will provide guidance on how to build and leverage a federated component system along-side your design system. \n \nFinally, we will cover how we've leveraged AI to speedup the creation of our design system and federated components at StuHub. Join to learn more!", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "4d43e71c77159a2cdfea61b076428a8f", + "venue_id": "2152806", + "speakers": [ + { + "username": "gabe210", + "id": "23098750", + "name": "Gabriel Cura-Castro", + "company": "StubHub Inc", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757337900, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "event_subtype": "Frontend" + }, + { + "event_key": "923772", + "active": "Y", + "pinned": "N", + "name": "Rethinking GraphQL Execution - Raymie Stata, Airbnb", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "GraphQL in Production", + "description": "To ease life for the roughly 1,000 developers who contribute regularly to our GraphQL interface, Airbnb has a highly opinionated developer API that we believe eases life for both developers and the operators who maintain the service. In the past, this API was implemented on top of a traditional, specification-based GraphQL engine, which supported agility as we evolved our opinionated approach to resolvers. As that approach matured, we saw opportunities to build a more efficient engine to support them.\n \nThis talk describes our new GraphQL engine. Key elements in our design include:\n \n- Refactoring query execution into distinct resolution and completion phases.\n \n- A query planner that optimizes and orchestrates the execution of those phases.\n \n- A new data structure that is the intermediary between the two phases, a data structure that allows for principled communication between the many resolvers involved in executing a query", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Advanced", + "id": "9426f470312d5ebb39a99a3a822f2821", + "venue_id": "2152800", + "speakers": [ + { + "username": "raymie2", + "id": "23098792", + "name": "Raymie Stata", + "company": "Airbnb", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757337900, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "879918", + "active": "Y", + "pinned": "N", + "name": "Unlocking Federation Security at Scale in Booking.com - Sanver Tarmur & Minghe Huang, Booking.com", + "event_start": "2025-09-08 14:25", + "event_end": "2025-09-08 14:55", + "event_type": "GraphQL in Production", + "description": "In Booking.com we are heavily using Federated GraphQL approach, more than 150 backend sub-graph services are integrated from different domains of the company such as accommodations, partner, flights, cars, trips, and fintech.\n \n \nOur federated GraphQL layer hosts daily 11b+ incoming requests, Federation in the back distributes 14b+ requests to the sub-graphs per day. We have a diverse set of clients such as Booking traveller, partner native apps/web clients, 140+ SSR (Server Side Rendering) services for Web/Mobile rendering, and AI chatbots. This level of adoption brings unique challenges in terms of security and traffic management. In Booking.com we have a large attack surface since our GraphQL schema is huge, to be specific we have ~7k types with 27k+ fields. In this session, we will share our schema driven approaches to mitigate risks due to authN/Z leaks, DDoS attacks or exposure of sensitive PII/PCI data. These methodologies are designed with a high degree of generality, ensuring their applicability and scalability across every other Federated GraphQL system.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "4fd6c149b3e2fec837a6abad57421002", + "venue_id": "2152809", + "speakers": [ + { + "username": "sanvertarmur", + "id": "23098798", + "name": "Sanver Tarmur", + "company": "Booking.com", + "custom_order": 0 + }, + { + "username": "minghe.huang", + "id": "23098789", + "name": "Minghe Huang", + "company": "Booking.com", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "14:55", + "start_date": "2025-09-08", + "start_time": "14:25:00", + "start_time_ts": 1757337900, + "end_date": "2025-09-08", + "end_time": "14:55:00", + "event_subtype": "Security" + }, + { + "event_key": "925128", + "active": "Y", + "pinned": "N", + "name": "Event Sourcing + GraphQL = ♥️ - Mike Astle, Xolvio", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "Developer Experience", + "description": "Event Sourcing is emerging as a preferred approach to building complex software systems. It enables rapid development, smooth evolution over time, and opens the door to AI-based acceleration.\n \nWe will make a brief introduction to the core concepts of Event Sourcing and why the approach is loved by its adherents. We will review the foundational elements of an Event Sourced application including some common architectural choices.\n \nGraphQL is known for expressive queries, precise data fetching, real-time capabilities, and a strong ecosystem. All of these pair well with Event Sourced applications. GraphQL simplifies the complexity of querying event streams, enables precise control over client-server interactions, and supports flexible schema evolution that is crucial to long term success. We will discuss this in the context of established patterns (and anti-patterns!).\n \nBy the end of this talk, attendees will clearly understand how combining Event Sourcing and GraphQL accelerates development and prepares data-driven apps to take advantage of AI-driven acceleration in the near future.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "22bac0a80d82ca49dcb156f96a307b8b", + "venue_id": "2152806", + "speakers": [ + { + "username": "michael.astle", + "id": "23098786", + "name": "Mike Astle", + "company": "Xolvio", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757340300, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "895837", + "active": "Y", + "pinned": "N", + "name": "GraphQL Performance Issues at Netflix Scale - Stephen Chambers, Netflix", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "GraphQL in Production", + "description": "The Member Experience Core Systems team at Netflix is entrusted with orchestrating every facet of the member experience. From the intricacies of the profiles screen to the dynamic homepage and the seamless search for your favorite shows, our robust API layer is the backbone that supports it all.\n \nOperating at an astronomical scale, our two principal Subgraph Services collectively manage over a million GraphQL queries per second. This immense scale, coupled with the diverse queries our systems accommodate, ensures that even the most minute edge cases are brought to light.\n \nIn this presentation, we will delve into two significant production bugs that emerged at scale. The first involved a federation-based solution at the query planning layer, which culminated in a 20% reduction in requests per second and yielded substantial cost savings amounting to hundreds of thousands of dollars. The second, a subgraph service specific enhancement, remarkably doubled the efficiency of our entire fleet.\n \nBy sharing our journey of identifying and resolving these issues, we aspire to provide insights that will directly enhance your day-to-day endeavors using GraphQL.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "682168b9f5a3998f61c54d12094ead0e", + "venue_id": "2152800", + "speakers": [ + { + "username": "stephenchambers", + "id": "23098804", + "name": "Stephen Chambers", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757340300, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "919948", + "active": "Y", + "pinned": "N", + "name": "Breaking and Building Boundaries: Securing Federated GraphQL - Yehuda Rosenberg, JFrog", + "event_start": "2025-09-08 15:05", + "event_end": "2025-09-08 15:35", + "event_type": "GraphQL in Production", + "description": "You added security measures to all your subgraphs and are sure you're safe? Think again. In a federated GraphQL system, the most significant risks often hide not within individual services, but within the logic and trust assumptions of the federation layer itself.\n \nThis talk explores how federated GraphQL architectures introduce a new class of security challenges that traditional testing and validation frequently overlook. We'll walk through practical examples based on real-world use cases and both offensive and defensive insights, showing why stitching secure services together doesn’t automatically result in a secure supergraph.\n \nAttendees will see federation-specific threats in action, learn important security concepts, and walk away with actionable strategies for hardening routers, auditing configurations, and building safer service interactions. We'll also share PoC code and conceptual outlines for detection tooling to help apply these learnings in real-world systems.\n \nAn engaging, practical, and scenario-driven session - especially relevant for developers and security engineers working with federated GraphQL systems.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "95f18f64a644710d42f294df2a2883e1", + "venue_id": "2152809", + "speakers": [ + { + "username": "yehudar", + "id": "23098819", + "name": "Yehuda Rosenberg", + "company": "JFrog", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:35", + "start_date": "2025-09-08", + "start_time": "15:05:00", + "start_time_ts": 1757340300, + "end_date": "2025-09-08", + "end_time": "15:35:00", + "event_subtype": "Security" + }, + { + "event_key": "5", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-08 15:35", + "event_end": "2025-09-08 15:55", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "307b54cb1c642d7bd8a6fb371b42bab6", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "15:55", + "start_date": "2025-09-08", + "start_time": "15:35:00", + "start_time_ts": 1757342100, + "end_date": "2025-09-08", + "end_time": "15:55:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "911156", + "active": "Y", + "pinned": "N", + "name": "GraphQL Isn't Just for Enterprises: The New King of Fullstack Typescript Applications - Alec Aivazis, HoudiniLabs", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:25", + "event_type": "Developer Experience", + "description": "Over the past few years, GraphQL has fallen out of favor for developers looking to build full-stack typescript applications. With projects like TRPC and NextJS, many people have started to pigeonhole GraphQL into an enterprise-shaped box. But this doesn't have to be the case! In this talk, Alec will give a practical introduction with live coding to Houdini, a GraphQL-first application framework and demonstrate how to rapidly move from idea to creation with a state-of-the-art developer experience that brings GraphQL back as a contender for the best choice for smaller applications.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Beginner", + "id": "dda1fbb70f8b5b73223a6e37a736e5bd", + "venue_id": "2152809", + "speakers": [ + { + "username": "alec102", + "id": "18743870", + "name": "Alec Aivazis", + "company": "HoudiniLabs", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757343300, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "event_subtype": "Frontend" + }, + { + "event_key": "924335", + "active": "Y", + "pinned": "N", + "name": "The Federated GraphQL Subscriptions Zoo - Tom Houlé, Grafbase", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:05", + "event_type": "GraphQL in Production", + "description": "Subscriptions are not like queries and mutations. They require specific thinking and care in any implementation strategy.\nFederation adds a layer of infrastructure that can complicate subscriptions in two ways:\n \n- scaling, because the federation gateway may have to resolve many subscription streams at the same time,\n- translation, because each subgraph has the protocols it supports, and they may not overlap with the protocol used by the clients.\n \nThis lightning talk dives into the challenges of translation we encountered in concrete scenarios:\n \n- How websocket init payloads map, or not, to http headers\n- How to translate SSE requests to websocket requests\n- Alternatives like multipart streams\n- Websocket subprotocols", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "f4c4515cba67a0ef57bb208e2c805c6c", + "venue_id": "2152806", + "speakers": [ + { + "username": "tom817", + "id": "23098807", + "name": "Tom Houlé", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:05", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757343300, + "end_date": "2025-09-08", + "end_time": "16:05:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "924894", + "active": "Y", + "pinned": "N", + "name": "From Private To Public: Evolving a GraphQL API for the Outside World - Laurin Quast, The Guild", + "event_start": "2025-09-08 15:55", + "event_end": "2025-09-08 16:25", + "event_type": "GraphQL in Production", + "description": "Turning a private GraphQL API into a public one comes with unexpected challenges. We’ll share how we approached this transition—starting from an existing internal schema that wasn’t shaped for external consumers—and the steps we took to expose only what was ready. Using Apollo Federation Contracts, we filtered out unstable or sensitive parts of the graph. Along the way, we defined best practices for the public schema, like cursor-based pagination, using oneOf for inputs and results.\nWe’ll also touch on how we serve the schema through Hive Gateway with a supergraph setup, and the security measures we added, like depth limiting and complexity analysis. To keep things evolving safely, we rely on GraphQL Hive to track usage and guide deprecations.\n \nIf you’re thinking about exposing a GraphQL API—or just want ideas for keeping one clean and manageable—this talk will share what worked for us, what didn’t, and what we learned.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Beginner", + "id": "11ee2487ca4b81120d1d7218b13f2003", + "venue_id": "2152800", + "speakers": [ + { + "username": "laurinquast", + "id": "18743819", + "name": "Laurin Quast", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "15:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "15:55:00", + "start_time_ts": 1757343300, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "924336", + "active": "Y", + "pinned": "N", + "name": "Authorization in Federated GraphQL - Tom Houlé, Grafbase", + "event_start": "2025-09-08 16:15", + "event_end": "2025-09-08 16:25", + "event_type": "GraphQL in Production", + "description": "Adopting GraphQL federation creates a convenient place in your infrastructure to make authorization decisions:\n \n- It comes early in the request lifecycle, before any subgraph.\n- It has access to the whole client request, as well as the entirety of the federated graph.\n- Authorization can still be the responsibility of the subgraph teams, or a cross cutting concern.\n \nThis talk is about leveraging the special position of the federation gateway for authorization.\n \nWe'll cover the directives federation offers for authorization out of the box: `@authenticated`, `@requiresScopes`, `@policy`. To cover a more advanced use case, we'll explore how to implement fine-grained authorization taking advantage of data from your federated graph by leveraging extensions in the open source Grafbase Gateway.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "4c9e99eb72e65a8115cabc6df964e106", + "venue_id": "2152806", + "speakers": [ + { + "username": "tom817", + "id": "23098807", + "name": "Tom Houlé", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "16:25", + "start_date": "2025-09-08", + "start_time": "16:15:00", + "start_time_ts": 1757344500, + "end_date": "2025-09-08", + "end_time": "16:25:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "925267", + "active": "Y", + "pinned": "N", + "name": "Compose Your Mobile App With GraphQL - Martin Bonnin, Apollo", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "Developer Experience", + "description": "Jetpack Compose is a declarative UI framework for Kotlin and Android. Jetpack Compose makes it easy to describe your UI graph and build composable UIs.\n \nOn the other hand, GraphQL is a declarative language for your Data. GraphQL makes it easy to describe and query your Data Graph.\n \nSounds like a perfect match! \n \nIn this presentation, we'll take a look at the current mobile architectures and how they differ from web architectures. \n \nWe will dive into cache, offline mode and error handling and investigate how GraphQL can help mobile developers build more reactive and robust UIs.\n \nUsing real life examples from the GraphQL conf 2025 app, we well discuss patterns such as colocated fragments, optimistic updates, subscriptions and see how they fit in the mobile app development cycle.\n \nWhile it will use some Kotlin, most of the examples can be applied to iOS and/or any other mobile platform. \n \nIf you're a web developer, I'm hoping to give you some talking point to start the discussion with your mobile teams. Let's unite frontend developers!", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "33ba3777057f6b5d6e17b0e6fe86e7d9", + "venue_id": "2152809", + "speakers": [ + { + "username": "loginsessionize", + "id": "23098783", + "name": "Martin Bonnin", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757345700, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "event_subtype": "Frontend" + }, + { + "event_key": "925144", + "active": "Y", + "pinned": "N", + "name": "Building an Open-source Query Planner - Dotan Simha & Kamil Kisiela, The Guild", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "GraphQL in Production", + "description": "A talk covering the journey of The Guild building a query planner for the future. We are going to share our journey learnings, insights and real-life examples on how we built our open-source Federation query planner. \n \nIn this talk, we’ll cover:\n \n- The background and journey The Guild did (from composition to query planning)\n- An overview of our query planner architecture\n- Audit-based development\n- Why we build our query planner as a library\n- Next steps and the community can get involved", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Advanced", + "id": "1a0475a575803503fce927f22dd1beae", + "venue_id": "2152806", + "speakers": [ + { + "username": "dotan1", + "id": "23098735", + "name": "Dotan Simha", + "company": "The Guild", + "custom_order": 0 + }, + { + "username": "kamilkisiela", + "id": "19082388", + "name": "Kamil Kisiela", + "company": "The Guild", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757345700, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "924929", + "active": "Y", + "pinned": "N", + "name": "Death, Taxes, and Deprecation - Stephen Spalding, Netflix", + "event_start": "2025-09-08 16:35", + "event_end": "2025-09-08 17:05", + "event_type": "GraphQL in Production", + "description": "alt title: Surviving Change Without Breaking Everything\n \nWhen we launched our new GraphQL API at Netflix, it felt perfect—destined to power hundreds of millions of devices. Yet, change is inevitable. Even if your schema seems flawless today (which it isn't), requirements will shift, new features will emerge, and regrets will follow.\n \nGraphQL promises evolvability, allowing us to move forward without multiple API versions. But how does this hold up in practice? We mark fields as @deprecated, but what happens next? How can we embrace experimentation without entombing technical debt in the API? Does federation complicate things? Evolving your schema without breaking clients is easy, right? Right??\n \nDrawing from experience with the Netflix API, this talk explores techniques for evolving your schema safely and painlessly. We'll cover the schema lifecycle—from experimentation to design, deprecation, and deletion.\n \nAttendees will leave with:\n- Schema design principles that facilitate change\n- Practical techniques for evolving GraphQL schemas\n- Strategies for managing a deprecation workflow\n \nJoin us as we learn to face the inevitability of change with confidence and serenity.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "8e63bb4173054c8a5b67cfdac6649049", + "venue_id": "2152800", + "speakers": [ + { + "username": "sspalding2", + "id": "18743825", + "name": "Stephen Spalding", + "company": "Netflix", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "16:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:05", + "start_date": "2025-09-08", + "start_time": "16:35:00", + "start_time_ts": 1757345700, + "end_date": "2025-09-08", + "end_time": "17:05:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "894809", + "active": "Y", + "pinned": "N", + "name": "Building a Kotlin Federated GraphQL Gateway and Executor - Samuel Bernardo Vázquez Andalón, Expedia Group", + "event_start": "2025-09-08 17:15", + "event_end": "2025-09-08 17:45", + "event_type": "GraphQL in Production", + "description": "In this talk, we'll explore the design and implementation of a distributed GraphQL router built with Kotlin, leveraging graphql-java and Spring Boot. \nBy using Kotlin’s powerful scripting and DSLs, we can create a highly configurable and scalable solution that simplifies the complexity of managing distributed GraphQL APIs.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "cb0e7d61d4055d199e7b9040617c2f88", + "venue_id": "2152806", + "speakers": [ + { + "username": "sam_2f", + "id": "23098795", + "name": "Samuel Bernardo Vázquez Andalón", + "company": "Expedia Group", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "17:45", + "start_date": "2025-09-08", + "start_time": "17:15:00", + "start_time_ts": 1757348100, + "end_date": "2025-09-08", + "end_time": "17:45:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "13", + "active": "Y", + "pinned": "N", + "name": "Attendee Reception", + "event_start": "2025-09-08 17:45", + "event_end": "2025-09-08 19:15", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "a7b3192f95abd8295c126d103c3a42e5", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "8", + "event_start_weekday": "Monday", + "event_start_weekday_short": "Mon", + "event_start_time": "17:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "8", + "event_end_weekday": "Monday", + "event_end_weekday_short": "Mon", + "event_end_time": "19:15", + "start_date": "2025-09-08", + "start_time": "17:45:00", + "start_time_ts": 1757349900, + "end_date": "2025-09-08", + "end_time": "19:15:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "2", + "active": "Y", + "pinned": "N", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-09 08:00", + "event_end": "2025-09-09 17:30", + "event_type": "Registration + Badge Pick-up", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "BG Foyer", + "id": "c0205884be221948a39bc4af9939c675", + "venue_id": "2152797", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "08:00:00", + "start_time_ts": 1757401200, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "17", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "id": "5e4653a4e04e5b927347c0d4bce36517", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757404800, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "19", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "id": "8a6e23690797787ee42c86f5799d212c", + "venue_id": "2152809", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757404800, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "18", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 09:00", + "event_end": "2025-09-09 10:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "id": "d8e4cb9845b91db297a665bcd712b039", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "10:30", + "start_date": "2025-09-09", + "start_time": "09:00:00", + "start_time_ts": 1757404800, + "end_date": "2025-09-09", + "end_time": "10:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "6", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-09 10:30", + "event_end": "2025-09-09 11:00", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "5c604292949899cb7ef2c8f36a86d098", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "10:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:00", + "start_date": "2025-09-09", + "start_time": "10:30:00", + "start_time_ts": 1757410200, + "end_date": "2025-09-09", + "end_time": "11:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "21", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 11:00", + "event_end": "2025-09-09 12:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "id": "3712b5f88962e155f080a7afa612e46e", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:30", + "start_date": "2025-09-09", + "start_time": "11:00:00", + "start_time_ts": 1757412000, + "end_date": "2025-09-09", + "end_time": "12:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "20", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 11:00", + "event_end": "2025-09-09 12:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "id": "6fbc71a3ad13189339d753cb078ec781", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:30", + "start_date": "2025-09-09", + "start_time": "11:00:00", + "start_time_ts": 1757412000, + "end_date": "2025-09-09", + "end_time": "12:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "927134", + "active": "Y", + "pinned": "N", + "name": "Namespacing Is the Next Frontier of GraphQL Federation - Martijn Walraven, Apollo", + "event_start": "2025-09-09 11:00", + "event_end": "2025-09-09 11:40", + "event_type": "GraphQL Working Group", + "description": "Although the topic of namespacing has been brought up repeatedly in the GraphQL community over the last decade, there is an understandable worry that it would lead to anti-patterns in schema design. If namespacing is used as an excuse to avoid coordination between teams, this can result in a fragmented GraphQL schema that reflects current team boundaries as opposed to domain or client concerns.\n \nGraphQL Federation offers an alternative architecture: when coordination is enforced and consistency guaranteed, a large number of teams can contribute to a single, coherent GraphQL schema without the danger of stepping on each other's toes.\n \nEven with that architecture in place however, I believe there are still legitimate use cases for namespacing. In this talk, I will go over some of those use cases, and formulate a set of design principles that could guide the introduction of namespacing in GraphQL.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "2bd94376bccf70783dd302222f29ca82", + "venue_id": "2152809", + "speakers": [ + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "11:40", + "start_date": "2025-09-09", + "start_time": "11:00:00", + "start_time_ts": 1757412000, + "end_date": "2025-09-09", + "end_time": "11:40:00", + "event_subtype": "Federation specification" + }, + { + "event_key": "925079", + "active": "Y", + "pinned": "N", + "name": "The State of GraphQL Federation - Michael Staib, ChilliCream & Martijn Walraven, Apollo", + "event_start": "2025-09-09 11:50", + "event_end": "2025-09-09 12:30", + "event_type": "GraphQL Working Group", + "description": "The GraphQL community has come together to standardize how people can build distributed systems with GraphQL as an orchestrator. In this talk I will explain the general idea that we have for GraphQL as an Orchestrator in this space and how the new specification is tackling this. We will look at the progress we have made since last GraphQL Conf in the GraphQL composite schema working group and also get some sneak peaks at our early RFCs and prototypes. I will outline how this new specification is taking the best ideas of existing solutions in the market to make the next big leap towards mainstream adoption. This will allow anyone to build tooling by implementing the spec or parts of the spec that seamlessly integrate with other vendors.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "534377045b9341cbcbb1098699294f99", + "venue_id": "2152809", + "speakers": [ + { + "username": "michael_staib.23xujj9p", + "id": "14900031", + "name": "Michael Staib", + "company": "ChilliCream", + "custom_order": 0 + }, + { + "username": "martijn.walraven", + "id": "21066825", + "name": "Martijn Walraven", + "company": "Apollo", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "11:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "12:30", + "start_date": "2025-09-09", + "start_time": "11:50:00", + "start_time_ts": 1757415000, + "end_date": "2025-09-09", + "end_time": "12:30:00", + "event_subtype": "Federation specification" + }, + { + "event_key": "11", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2025-09-09 12:30", + "event_end": "2025-09-09 14:00", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "c792d79fcbf90eafe5aeccec4e753e2a", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "12:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "14:00", + "start_date": "2025-09-09", + "start_time": "12:30:00", + "start_time_ts": 1757417400, + "end_date": "2025-09-09", + "end_time": "14:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "22", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 14:00", + "event_end": "2025-09-09 15:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "id": "61b4f19f5c720bac6400331bf791af14", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:30", + "start_date": "2025-09-09", + "start_time": "14:00:00", + "start_time_ts": 1757422800, + "end_date": "2025-09-09", + "end_time": "15:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "922927", + "active": "Y", + "pinned": "N", + "name": "Lower Latency With Streaming GraphQL - Rob Richard, 1stDibs", + "event_start": "2025-09-09 14:00", + "event_end": "2025-09-09 14:40", + "event_type": "GraphQL Working Group", + "description": "Learn how to lower latency in your applications by streaming your GraphQL responses using the @defer and @stream directives. Learn the trade-offs of when to use these new directives and how they differ from GraphQL Subscriptions. \n \n@defer and @stream have been in development for some time now and have gone through many iterations. Learn about the motivation behind these changes and how they will lead to scalable GraphQL servers and efficient clients.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "7774f5b0afdc94f922694d15a5593dfc", + "venue_id": "2152809", + "speakers": [ + { + "username": "robrichard87", + "id": "21066852", + "name": "Rob Richard", + "company": "1stDibs", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "14:40", + "start_date": "2025-09-09", + "start_time": "14:00:00", + "start_time_ts": 1757422800, + "end_date": "2025-09-09", + "end_time": "14:40:00", + "event_subtype": "GraphQL specification" + }, + { + "event_key": "26", + "active": "Y", + "pinned": "N", + "name": "Unconference", + "event_start": "2025-09-09 14:00", + "event_end": "2025-09-09 15:30", + "event_type": "Unconference", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "b258c762df3ef4565c012424ee06727e", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:30", + "start_date": "2025-09-09", + "start_time": "14:00:00", + "start_time_ts": 1757422800, + "end_date": "2025-09-09", + "end_time": "15:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "925101", + "active": "Y", + "pinned": "N", + "name": "The State of GraphQL Open Telemetry - Pascal Senn, ChilliCream", + "event_start": "2025-09-09 14:50", + "event_end": "2025-09-09 15:30", + "event_type": "GraphQL Working Group", + "description": "Curious about how observability is evolving in the GraphQL ecosystem? This session explores the current state of OpenTelemetry and its integration with GraphQL. We'll cover the fundamentals of OpenTelemetry, introduce the OpenTelemetry working group (https://github.com/graphql/otel-wg), and dive into tracing, logging, and metrics - all essential pillars of observability. You'll also learn how OpenTelemetry is being applied in distributed GraphQL architectures to improve performance monitoring and troubleshooting across services. Whether you're new to observability or looking to level up your GraphQL stack, this talk will bring you up to speed on where the community is heading.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "01ac876254b68e3c824f6d7e077ef654", + "venue_id": "2152809", + "speakers": [ + { + "username": "pascal.senn", + "id": "21066839", + "name": "Pascal Senn", + "company": "ChilliCream", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "14:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "15:30", + "start_date": "2025-09-09", + "start_time": "14:50:00", + "start_time_ts": 1757425800, + "end_date": "2025-09-09", + "end_time": "15:30:00", + "event_subtype": "Reference software" + }, + { + "event_key": "7", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-09 15:30", + "event_end": "2025-09-09 16:00", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "beef68627af8441ecda3c744db096f49", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "15:30", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "16:00", + "start_date": "2025-09-09", + "start_time": "15:30:00", + "start_time_ts": 1757428200, + "end_date": "2025-09-09", + "end_time": "16:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "24", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 17:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "id": "3b8701f24da2cf5456ffd5b793836ace", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757430000, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "25", + "active": "Y", + "pinned": "N", + "name": "Session to be Announced", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 17:30", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "id": "9e3b7585a118a16e47f466a7036304cb", + "venue_id": "2152809", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757430000, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_type": "", + "event_subtype": "", + "description": "" + }, + { + "event_key": "27", + "active": "Y", + "pinned": "N", + "name": "Unconference", + "event_start": "2025-09-09 16:00", + "event_end": "2025-09-09 17:30", + "event_type": "Unconference", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "0518875a37f944a72fce2c0a20d1188b", + "venue_id": "2152806", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "9", + "event_start_weekday": "Tuesday", + "event_start_weekday_short": "Tue", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "9", + "event_end_weekday": "Tuesday", + "event_end_weekday_short": "Tue", + "event_end_time": "17:30", + "start_date": "2025-09-09", + "start_time": "16:00:00", + "start_time_ts": 1757430000, + "end_date": "2025-09-09", + "end_time": "17:30:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "3", + "active": "Y", + "pinned": "N", + "name": "Registration + Badge Pick-up", + "event_start": "2025-09-10 08:00", + "event_end": "2025-09-10 17:00", + "event_type": "Registration + Badge Pick-up", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "BG Foyer", + "id": "684f3f2c57d94cc9ad1e3bba980712ec", + "venue_id": "2152797", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "08:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "17:00", + "start_date": "2025-09-10", + "start_time": "08:00:00", + "start_time_ts": 1757487600, + "end_date": "2025-09-10", + "end_time": "17:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "924215", + "active": "Y", + "pinned": "N", + "name": "Next-generation GraphQL Cache Management in Your Android and IOS Apps - Benoit Lubek, Apollo Graph & Zach FettersMoore, Apollo GraphQL", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 09:10", + "event_type": "Developer Experience", + "description": "Effective caching is essential for building fast, resilient mobile apps especially when aiming for offline-first experiences. Apollo Kotlin and Apollo iOS offer a powerful Normalized Cache component tailored to GraphQL. In this lightning talk, we’ll showcase the latest advancements in both libraries, including support for pagination, cache expiration, and other new features designed to simplify and supercharge cache management on mobile.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "a0e2a06e7fa0578e1b252beef517aef2", + "venue_id": "2152806", + "speakers": [ + { + "username": "zach.fetters", + "id": "23098822", + "name": "Zach FettersMoore", + "company": "Apollo GraphQL", + "custom_order": 0 + }, + { + "username": "benoit_lubek.28dhc1v7", + "id": "23099457", + "name": "Benoit Lubek", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:10", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757491200, + "end_date": "2025-09-10", + "end_time": "09:10:00", + "event_subtype": "Frontend" + }, + { + "event_key": "913037", + "active": "Y", + "pinned": "N", + "name": "Local Data Consistency With GraphQL - Sabrina Wasserman, Meta", + "event_start": "2025-09-10 09:00", + "event_end": "2025-09-10 09:30", + "event_type": "GraphQL in Production", + "description": "Have you ever wondered how GraphQL clients like Relay keep local data consistent across surfaces, ensuring that changes made within a session are seamlessly reflected across an application? In this talk, I'll delve into the concept of Local Data Consistency and explore how GraphQL clients at Meta, such as Relay, efficiently track and update changing GraphQL data locally, without introducing additional networking dependencies, and the UX benefits and features this unlocks.\n \nSpecifically, I’ll cover:\n- What even is Local Data Consistency, and why is it valuable to product developers?\n- How do you implement a data consistency engine from scratch?\n- How are advanced client-side features like offline mutation updates, asynchronous GraphQL request fetching, and more all made possible using a Local Data Consistency?", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Advanced", + "id": "c14c567785a5bebf241630d57eaababd", + "venue_id": "2152809", + "speakers": [ + { + "username": "sabrina.wasserman", + "id": "21066857", + "name": "Sabrina Wasserman", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:30", + "start_date": "2025-09-10", + "start_time": "09:00:00", + "start_time_ts": 1757491200, + "end_date": "2025-09-10", + "end_time": "09:30:00", + "event_subtype": "Case studies" + }, + { + "event_key": "929204", + "active": "Y", + "pinned": "N", + "name": "What If GraphQL Knew Accessibility? - Vanessa Johnson, The New York Times", + "event_start": "2025-09-10 09:20", + "event_end": "2025-09-10 09:30", + "event_type": "Developer Experience", + "description": "What if your GraphQL schema could do more than provide data? What if it could help your app be more accessible from the start? In this lightning talk, we'll explore an innovative idea of embedding accessibility metadata directly into GraphQL schemas. Inspired by using Kotlin semantics in Jetpack Compose, imagine annotating fields with labels, roles, or screen reader hints that can be used to support screen readers, improve navigation, and even power automated accessibility testing. By adding custom accessibility annotations, tools could generate more accessible UI components, which enhances both the developer experience and the user experience. This is a call to rethink the developer experience and treat accessibility as a first-class concern. Let's reimagine GraphQL not just as a data layer, but as an inclusive design enabler.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "87264d07e7aaafb1811ba5ad451285a2", + "venue_id": "2152806", + "speakers": [ + { + "username": "vmjohnson999", + "id": "23098810", + "name": "Vanessa Johnson", + "company": "The New York Times", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "09:30", + "start_date": "2025-09-10", + "start_time": "09:20:00", + "start_time_ts": 1757492400, + "end_date": "2025-09-10", + "end_time": "09:30:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "925025", + "active": "Y", + "pinned": "N", + "name": "One API Definition To Rule Them All: Generating GraphQL Schemas From TypeSpec - Fiona Huang, Pinterest", + "event_start": "2025-09-10 09:40", + "event_end": "2025-09-10 10:10", + "event_type": "Developer Experience", + "description": "Managing separate API definitions for REST and GraphQL APIs that serve the same underlying data can be inefficient and lead to duplicated efforts. At Pinterest, we are streamlining our API definitions and unifying our data models with TypeSpec. TypeSpec allows us to define our API shapes once and generate API schemas in multiple forms such as OpenAPI, Protobuf, and now GraphQL!\n \nWe’ve developed an open-source TypeSpec GraphQL Emitter which generates valid GraphQL schemas directly from TypeSpec definitions.\n \nJoin us for an overview of how TypeSpec and the GraphQL Emitter can streamline your API workflow. We'll explore:\n \n* How TypeSpec's unified definition approach accelerates development across multiple API specs\n* The inner workings of our open-source GraphQL Emitter\n* Our wins and lessons learned while building the GraphQL Emitter\n \nThis talk will be perfect for anyone interested in GraphQL schema generation, unified API definitions, and vague Lord of the Rings references! See you there!", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "0843f99870a32c08d091379a43d0c224", + "venue_id": "2152806", + "speakers": [ + { + "username": "fthompson11", + "id": "23098747", + "name": "Fiona Huang", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:10", + "start_date": "2025-09-10", + "start_time": "09:40:00", + "start_time_ts": 1757493600, + "end_date": "2025-09-10", + "end_time": "10:10:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "914113", + "active": "Y", + "pinned": "N", + "name": "From Hobby Project To Industry Standard: Lessons From 10 Years of GraphQL Java - Donna Zhou & Andreas Marek, Atlassian", + "event_start": "2025-09-10 09:40", + "event_end": "2025-09-10 10:10", + "event_type": "GraphQL in Production", + "description": "What started as a single developer's passion project now powers mission-critical APIs for tech giants like Twitter/X, Netflix, Amazon, AirBnB, and Atlassian. As the engine behind Spring for GraphQL and with over 2.2 million monthly downloads, GraphQL Java has become the Java implementation of GraphQL.\n \nHow does a volunteer-driven open source project not just survive, but thrive for a decade? In this talk, we'll share the crucial technical decisions and community building strategies that transformed a hobby project into an industry standard. We'll share how we fostered contributions from over 250 volunteers while maintaining high code quality and project momentum. You'll walk away with actionable insights to help you lead any software project, whether it's open source or enterprise.\n \nAbout the speakers: we are the maintainers of GraphQL Java, who have guided the project from its first commit to becoming the industry standard.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Any", + "id": "3cfd3578b6acb121870ddcc96b69543e", + "venue_id": "2152809", + "speakers": [ + { + "username": "donnasiqizhou", + "id": "18743879", + "name": "Donna Zhou", + "company": "Atlassian", + "custom_order": 0 + }, + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "09:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:10", + "start_date": "2025-09-10", + "start_time": "09:40:00", + "start_time_ts": 1757493600, + "end_date": "2025-09-10", + "end_time": "10:10:00", + "event_subtype": "Case studies" + }, + { + "event_key": "925146", + "active": "Y", + "pinned": "N", + "name": "From Data Loaders To Batch Resolvers - Aileen Chen, Airbnb", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:50", + "event_type": "Developer Experience", + "description": "In theory, data loaders solve most \"N+1\" problems in GraphQL. In practice, they can be hard to implement, so they’re typically used only in performance-critical situations and often reactively, once inefficiencies surface. To achieve better performance, batching needs to be applied wherever possible.\n \nThis talk introduces batch resolvers, a more developer-friendly alternative to data loaders. While traditional GraphQL resolvers take a single input and produce a single output, batching resolvers take a list of inputs and return a list of outputs. A batch resolver can simply call a batch service API without worrying about data loaders.\n \nWhen a developer provides a batch resolver, our GraphQL server automatically aggregates individual data fetches into a single call to that resolver. It can also apply heuristics to improve aggregation, for example by consolidating different selection sets for the same entity into a single input. This design not only makes application developers’ lives easier, but also allows the server to better optimize query execution by coordinating batch dispatching as part of a broader execution strategy.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "77fa615db3eebcfe0063c0535e2fe972", + "venue_id": "2152806", + "speakers": [ + { + "username": "aileen.chen", + "id": "23098708", + "name": "Aileen Chen", + "company": "Airbnb", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757496000, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "event_subtype": "Backend" + }, + { + "event_key": "924155", + "active": "Y", + "pinned": "N", + "name": "Rebuilding Buffer's Public API - Amanda Marochko & Joe Birch, Buffer", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:50", + "event_type": "GraphQL in Production", + "description": "Buffer’s Public API has long enabled developers to build tools that amplify the power of social media management. However, as the landscape of social platforms and developer needs has evolved, so too have the requirements for a robust, secure, and developer-friendly API. In this talk, we'll share our journey as we rebuild Buffer’s public API from the ground up, embracing modern GraphQL principles and best practices.\n \nAttendees will get an inside look at our design decisions, from intuitive schema design to robust authentication, and how we’re ensuring a smooth migration path for existing users. We’ll explore how we’re balancing the needs of our developer community with evolving platform policies and technical constraints.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Any", + "id": "e6262da79f7c90fd01a2a13570d6b6bc", + "venue_id": "2152809", + "speakers": [ + { + "username": "amanda1988", + "id": "23098711", + "name": "Amanda Marochko", + "company": "Buffer", + "custom_order": 0 + }, + { + "username": "joebirch", + "id": "23098765", + "name": "Joe Birch", + "company": "Buffer", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757496000, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "event_subtype": "Case studies" + }, + { + "event_key": "919595", + "active": "Y", + "pinned": "N", + "name": "Not Your Regular Rate Limiting #GraphQL - Meenakshi Dhanani, Postman", + "event_start": "2025-09-10 10:20", + "event_end": "2025-09-10 10:30", + "event_type": "GraphQL in Production", + "description": "Rate limiting in GraphQL APIs goes beyond the traditional approaches used in REST APIs. Regular techniques fall short when handling complex queries and preventing abuse. In this lightning talk, we will explore creative strategies for overcoming these challenges within the unique context of GraphQL's single endpoint architecture. We will also discuss practical techniques and dive into real-world examples that demonstrate how to optimize rate limiting in your GraphQL APIs and ensure the scalability and security of your applications.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "c428aec39dca93980c2c74fd8c52a6cb", + "venue_id": "2152800", + "speakers": [ + { + "username": "meenakshi.dhanani1", + "id": "18777983", + "name": "Meenakshi Dhanani", + "company": "Postman", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:20", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:30", + "start_date": "2025-09-10", + "start_time": "10:20:00", + "start_time_ts": 1757496000, + "end_date": "2025-09-10", + "end_time": "10:30:00", + "event_subtype": "Scaling" + }, + { + "event_key": "898726", + "active": "Y", + "pinned": "N", + "name": "GraphQL Caching Lightning Talk - Emily Goodwin, Independent", + "event_start": "2025-09-10 10:40", + "event_end": "2025-09-10 10:50", + "event_type": "GraphQL in Production", + "description": "GraphQL provides flexibility in fetching data but this can prove challenging for caching. In this talk I cover the basics of caching in GraphQL such as layers you can cache at a high level. Layers such as the CDN, client side, server side, and database are touched upon with solutions from the community. The talk will also cover when to use each layer and what statistics to look at for improvement. I talk about how caching at multiple layers provides the best experience for the end user. By the end of this talk beginners will have a path forward to how they can cache at different layers for better performance.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Beginner", + "id": "af87438a9b7238f69626d9e1ce57f088", + "venue_id": "2152800", + "speakers": [ + { + "username": "goodwin.y.emily", + "id": "23098741", + "name": "Emily Goodwin", + "company": "Independent", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:40", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "10:50", + "start_date": "2025-09-10", + "start_time": "10:40:00", + "start_time_ts": 1757497200, + "end_date": "2025-09-10", + "end_time": "10:50:00", + "event_subtype": "Scaling" + }, + { + "event_key": "8", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-10 10:50", + "event_end": "2025-09-10 11:15", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "7a2a2ad935e2f7ac1801b3b17e322d74", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "10:50", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:15", + "start_date": "2025-09-10", + "start_time": "10:50:00", + "start_time_ts": 1757497800, + "end_date": "2025-09-10", + "end_time": "11:15:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "925047", + "active": "Y", + "pinned": "N", + "name": "Introducing Pollen - An Open-source Developer Portal Framework for GraphQL - Jason Kuhrt, The Guild", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "Developer Experience", + "description": "There are many aspects to consider when building a GraphQL API: Authentication, authorization, performance, schema design, and team workflow to name a few. Each aspect encompasses considerations, practices, and tools (or lack thereof). One aspect, documentation, can be easily neglected. At The Guild we are building an open source tool called Polen to address this. It aims to make beautiful developer portals easy and reduce the gap of docs tools between GraphQL and REST communities.\n \nThis presentation would mark the first formal introduction of Polen, covering:\n \n1. How/why Polen came to be\n2. What it does so far\n3. What it could do in the future\n \nThis talk would continue the larger docs conversation (e.g. last year https://www.youtube.com/watch?v=kWe_v6YVj8U) by sharing what encoding some of our best docs ideas into tooling could look like. Ideally it would help the audience think about how they can make their APIs more accessible for their users. Finally, given Polen is not a commercial offering, I also hope to inspire people to get involved, make issues, give feedback, and send pull requests.\n \nPolen is already public today at http://github.com/the-guild-org/polen", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "6c9b846e538e001af3db938d771d1178", + "venue_id": "2152800", + "speakers": [ + { + "username": "jasonkuhrt", + "id": "23098756", + "name": "Jason Kuhrt", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757499300, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "event_subtype": "Documentation" + }, + { + "event_key": "924207", + "active": "Y", + "pinned": "N", + "name": "Deep Dive Into a GraphQL Federation Gateway, From Query Planning To the Execution - Benjamin Rabier, Grafbase", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "GraphQL in Production", + "description": "Traditional GraphQL servers execute queries field by field with a depth-first algorithm as defined in the GraphQL specification. In contrast, GraphQL federation gateways need to partition the query and retrieve chunks of data from external data sources, creating new challenges. We'll present how we solved those challenges with a focus on performance.\n \nThe first, query planning, is to find the best possible plan with the multiple possibilities federation offers to unify your data and the various data sources with their requirements. We express this problem as a graph of possibilities and solve it as a Steiner Tree problem. The second challenge is performant execution. As we need to read and write overlapping chunks of the response in parallel, it's hard to be as efficient as a traditional GraphQL server writing a response iteratively with independent fields. We build an execution DAG with field dependencies, parallelizing work as much as possible without any lock on the response. We also pre-compute the expected data shape to ingest and validate incoming data into the response without any intermediate memory allocation.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "d017baa3d96bc8ee7e195dbdce137a96", + "venue_id": "2152809", + "speakers": [ + { + "username": "benjamin154", + "id": "23098720", + "name": "Benjamin Rabier", + "company": "Grafbase", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757499300, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "925151", + "active": "Y", + "pinned": "N", + "name": "Safely Roll Out Strict Error Handling in Your GraphQL Codebase - Itamar Kestenbaum, Meta", + "event_start": "2025-09-10 11:15", + "event_end": "2025-09-10 11:45", + "event_type": "GraphQL in Production", + "description": "Last year we introduced strict error handling - with @throwOnFieldError as an example of how this can be accomplished. This year, we’ll discuss how to safely roll it out.\n \nYou’ve had a GraphQL codebase that weakly handled server-side errors for years. Now, you have the tools (directives, hooks, handlers, and language features) that let you treat field errors properly. However, it’s a daunting task to suddenly explode queries en-masse by flipping a switch. This move is powerful, but requires a thoughtful and data-driven approach to do safely.\n \nIn this talk we’ll cover:\n* Preparing the groundwork for migration to stricter error handling\n* Using data to make informed decisions about fragment/query behavior\n* Gating your change at a singular point\n* Scaling the rollout to a large codebase\n* How we’re approaching this rollout at Meta", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "bca05d46cfc531aeb3cd84927f6483c1", + "venue_id": "2152806", + "speakers": [ + { + "username": "itamark", + "id": "80829", + "name": "Itamar Kestenbaum", + "company": "Meta", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:15", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "11:45", + "start_date": "2025-09-10", + "start_time": "11:15:00", + "start_time_ts": 1757499300, + "end_date": "2025-09-10", + "end_time": "11:45:00", + "event_subtype": "Scaling" + }, + { + "event_key": "924776", + "active": "Y", + "pinned": "N", + "name": "GraphQL in a World of Full-stack, Rich Clients: The Next Evolution - Robert Balicki, Pinterest", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "Developer Experience", + "description": "One of the great achievements of GraphQL is composable, full-stack type safety: a strongly-typed schema, against which one writes client components, and from which minimal yet sufficient queries are generated. This seamless flow from database to UI, with immediate feedback, compile-time guarantees and great performance, represents an unmatched DevEx breakthrough.\n \nBut what if we use a full-stack client (like Isograph aims to be)? Or use a rich client in combination with a Hasura, Prisma or PostGraphile, and effectively write components against an SQL schema? Have both the GraphQL schema and its operation language become mere implementation details?\n \nIn this talk, I'll explore how GraphQL's apparent disappearance into tooling actually represents its ultimate victory. Even as GraphQL-the-syntax fades from view, its architectural innovations—fragment composability, full-stack type safety, document merging, persisted operations—become the invisible foundation of modern development.\n \nThe best way to honor this legacy isn't to protect its syntax — it's to let its principles be reborn in new forms, evolving as our tools evolve, making app development better for years to come.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "a2bb7f46355a46dcab47d654c9ccbe4e", + "venue_id": "2152800", + "speakers": [ + { + "username": "robert.balicki", + "id": "18743858", + "name": "Robert Balicki", + "company": "Pinterest", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757501700, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "event_subtype": "Frontend" + }, + { + "event_key": "929166", + "active": "Y", + "pinned": "N", + "name": "Breaking the Monolith: Our Journey From Proto To Federated GraphQL at Scale - Mansi Mittal, Booking.com", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "GraphQL in Production", + "description": "HotelPage Service (HPS) is one of the busiest, most business-critical systems at Booking.com — originally built as a REST API with Protobufs for speed and structure. It was fast but rigid. As product demands grew and clients needed more flexibility, cracks began to show: over-fetching, unclear ownership, and slow iteration cycles.\n \nThis talk shares our real-world journey of modernizing that stack with GraphQL — not just adopting it as a new interface, but transforming how teams design schemas, collaborate across domains, and scale under load. We’ll walk through how we evolved from a proto-backed monolith to a federated GraphQL architecture — improving performance, enabling resolver ownership, and making the schema reflect real product needs.\n \nWhether you're planning a GraphQL migration or scaling one across teams, this talk delivers actionable insights and hard-won lessons from operating at billions of requests per day.\n \nAttendees will gain:\n- Align schema design with client and product needs\n- Handle organisational complexity in federation\n- Avoid pitfalls like over-fetching and the N+1 trap\n- Drive resolver ownership and collaboration\n- Optimise execution paths under high traffic", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Any", + "id": "0296c34928a818353f1568775e47b47a", + "venue_id": "2152809", + "speakers": [ + { + "username": "mansi.mittal", + "id": "23098777", + "name": "Mansi Mittal", + "company": "Booking.com", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757501700, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "919528", + "active": "Y", + "pinned": "N", + "name": "Smarter Caching With Events: Targeted Invalidation in Federated Graphs - Juan Carlos Blanco Delgado, RS Group", + "event_start": "2025-09-10 11:55", + "event_end": "2025-09-10 12:25", + "event_type": "GraphQL in Production", + "description": "Caching is one of the most powerful tools for improving API performance—but in a federated GraphQL architecture, stale data can quickly become a serious challenge. In this session, we will dive into how event-driven patterns can enable precise cache invalidation at the subgraph level, keeping your data fresh without sacrificing speed.\n \nYou will learn key design principles, practical integration strategies for GraphQL subgraphs, and the business impact of a smarter caching approach. We will also explore real-world use cases and demonstrate how CloudEvents can standardize event-based workflows across your architecture. Whether you are optimizing an existing caching layer or just beginning your caching journey, this talk will equip you with practical strategies to reduce latency, lower infrastructure costs, and deliver more reliable experiences to your users.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "aa21698ac3efc45ee1e7a9cbbaf830fe", + "venue_id": "2152806", + "speakers": [ + { + "username": "juancarlosjr97", + "id": "23098768", + "name": "Juan Carlos Blanco Delgado", + "company": "RS Group", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "11:55", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "12:25", + "start_date": "2025-09-10", + "start_time": "11:55:00", + "start_time_ts": 1757501700, + "end_date": "2025-09-10", + "end_time": "12:25:00", + "event_subtype": "Scaling" + }, + { + "event_key": "12", + "active": "Y", + "pinned": "N", + "name": "Lunch", + "event_start": "2025-09-10 12:25", + "event_end": "2025-09-10 13:45", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "466063ea35a642dc69aa3f25ad47aa3e", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "12:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "13:45", + "start_date": "2025-09-10", + "start_time": "12:25:00", + "start_time_ts": 1757503500, + "end_date": "2025-09-10", + "end_time": "13:45:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "923860", + "active": "Y", + "pinned": "N", + "name": "Reintroducing Apollo Client: V4 and Beyond - Jerel Miller & Lenz Weber-Tronic, Apollo GraphQL", + "event_start": "2025-09-10 13:45", + "event_end": "2025-09-10 14:15", + "event_type": "Developer Experience", + "description": "`useQuery` is a powerful and simple abstraction, but there is so much more to Apollo Client today. In this talk we’ll re-introduce Apollo Client for this new era. Query preloading, suspense, fragment APIs, and data masking have given GraphQL practitioners a toolset to build sophisticated, scalable, and highly performant applications like never before. Learn about these new APIs, upgraded tooling, and how version 4.0 (and beyond) gives users a leaner, cleaner, and more capable open source GraphQL client.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "efe5aee612551209ba413d57d3ddbb4e", + "venue_id": "2152800", + "speakers": [ + { + "username": "jerel.miller", + "id": "23098762", + "name": "Jerel Miller", + "company": "Apollo GraphQL", + "custom_order": 0 + }, + { + "username": "mail1232", + "id": "23098771", + "name": "Lenz Weber-Tronic", + "company": "Apollo GraphQL", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:15", + "start_date": "2025-09-10", + "start_time": "13:45:00", + "start_time_ts": 1757508300, + "end_date": "2025-09-10", + "end_time": "14:15:00", + "event_subtype": "Frontend" + }, + { + "event_key": "924498", + "active": "Y", + "pinned": "N", + "name": "LinkedIn's Code-First Approach To Federated GraphQL With gRPC - Ethan Shen, LinkedIn", + "event_start": "2025-09-10 13:45", + "event_end": "2025-09-10 14:15", + "event_type": "GraphQL in Production", + "description": "Imagine having a federated GraphQL query builder customized to meet unique software infrastructure requirements—have you ever dreamed of such a tool? If so, please join us for an exciting session where we uncover LinkedIn’s code first approach to querying entity-oriented data with federated GraphQL on top of backend gRPC services. Discover how our solution leverages the advanced capabilities of gRPC for enhanced performance, low latency, and multi-language support, while achieving seamless integration with our established Rest.li framework. We will dive into the motivations behind adopting this strategy, the intricate challenges encountered, and the significant improvements in developer experience and productivity it brings. With real-world examples and performance benchmarks, witness how this approach modernizes our service infrastructure, leading to more efficient and scalable solutions.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "dbabde0d810676b2a3633fa3b35de544", + "venue_id": "2152809", + "speakers": [ + { + "username": "ethan_shen.28dgusli", + "id": "23098744", + "name": "Ethan Shen", + "company": "LinkedIn", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:15", + "start_date": "2025-09-10", + "start_time": "13:45:00", + "start_time_ts": 1757508300, + "end_date": "2025-09-10", + "end_time": "14:15:00", + "event_subtype": "Federation and distributed systems" + }, + { + "event_key": "922855", + "active": "Y", + "pinned": "N", + "name": "The Two GraphQLs - Andrei Bocan & Andreas Marek, Atlassian", + "event_start": "2025-09-10 13:45", + "event_end": "2025-09-10 14:15", + "event_type": "GraphQL in Production", + "description": "When adopting GraphQL, teams diligently follow \"best practices\" without realizing they're actually choosing between two fundamentally different approaches: designing schemas to serve UI components (frontend-first) or to represent domain models (structure-first). This distinction is rarely framed as an explicit choice in GraphQL literature, with most examples showcasing the structure-first approach by default. \n \nYet this initial decision shapes everything from your team structure to how you handle breaking changes—and if you start with a structure-first approach, it's especially difficult to unwind that decision later. In this session, we'll explore the critical differences between these philosophies, examine how they manifest in real schemas, and analyze the trade-offs each approach presents. You'll see how changes that feel natural in one approach become deeply problematic in the other, and learn to identify which patterns your team has already begun to follow.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "f0b80ea2f4d001d47e50ee68ee8ef27f", + "venue_id": "2152806", + "speakers": [ + { + "username": "andrei.bocan", + "id": "21066797", + "name": "Andrei Bocan", + "company": "Atlassian", + "custom_order": 0 + }, + { + "username": "andreas.marek1", + "id": "21066795", + "name": "Andreas Marek", + "company": "Atlassian", + "custom_order": 1 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "13:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:15", + "start_date": "2025-09-10", + "start_time": "13:45:00", + "start_time_ts": 1757508300, + "end_date": "2025-09-10", + "end_time": "14:15:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "927072", + "active": "Y", + "pinned": "N", + "name": "The New GraphiQL - Dimitri Postolov, -", + "event_start": "2025-09-10 14:25", + "event_end": "2025-09-10 14:55", + "event_type": "Developer Experience", + "description": "In this talk, I will discuss recent developments in GraphiQL, including compiling source code with the React Compiler, support for React 19, migration to Zustand for state management, and the long-awaited transition to the Monaco Editor.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Any", + "id": "0ff353b09a53bca86f60c961faa4c6f3", + "venue_id": "2152809", + "speakers": [ + { + "username": "en3m", + "id": "18743843", + "name": "Dimitri Postolov", + "company": "-", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:55", + "start_date": "2025-09-10", + "start_time": "14:25:00", + "start_time_ts": 1757510700, + "end_date": "2025-09-10", + "end_time": "14:55:00", + "event_subtype": "Frontend" + }, + { + "event_key": "924505", + "active": "Y", + "pinned": "N", + "name": "Instagram’s REST To GraphQL Migration - Xiao Han, Meta Inc.; Chi Chan & Anirudh Padmarao & Lisa Watkins, Meta; Curtis Li, Meta Platforms", + "event_start": "2025-09-10 14:25", + "event_end": "2025-09-10 14:55", + "event_type": "GraphQL in Production", + "description": "Imagine you have a decade old REST API codebase with thousands of daily commits by hundreds of engineers, how would you incrementally adopt GraphQL? How would the data models be compatible with both REST and GraphQL to avoid divergence? How…?\n \nWe will share Instagram’s journey from 100% REST API development to 95%+ new APIs developed in GraphQL over a two year period.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "5488aa89d9612e06d58e66cc521bcc38", + "venue_id": "2152800", + "speakers": [ + { + "username": "x65han", + "id": "23098816", + "name": "Xiao Han", + "company": "Meta Inc.", + "custom_order": 0 + }, + { + "username": "chanc2", + "id": "23098726", + "name": "Chi Chan", + "company": "Meta", + "custom_order": 1 + }, + { + "username": "curtis99877", + "id": "23098729", + "name": "Curtis Li", + "company": "Meta Platforms", + "custom_order": 2 + }, + { + "username": "apadmarao", + "id": "23098714", + "name": "Anirudh Padmarao", + "company": "Meta", + "custom_order": 3 + }, + { + "username": "lisamwatkins", + "id": "23098774", + "name": "Lisa Watkins", + "company": "Meta", + "custom_order": 4 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:55", + "start_date": "2025-09-10", + "start_time": "14:25:00", + "start_time_ts": 1757510700, + "end_date": "2025-09-10", + "end_time": "14:55:00", + "event_subtype": "Case studies" + }, + { + "event_key": "924826", + "active": "Y", + "pinned": "N", + "name": "\"Please Migrate Away From Field X To Field Y Before Z\" - A Story on Automating Our Deprecation Li - Rick Bijkerk, Bol", + "event_start": "2025-09-10 14:25", + "event_end": "2025-09-10 14:35", + "event_type": "GraphQL in Production", + "description": "Any company that wants to innovate deals with change. Within GraphQL that often means introducing new fields but also deprecating old fields & types.\nThe faster you can get rid of these old fields & types the less complex your architecture is and less complexity means an easier time building new features!\n \nWe saw this problem and got tired of the endless “please migrate away from field X to field Y before Z” emails, which were often not even sent to the right group of consumers!\n \nWe automated this process by building a slack bot that uses production analytical data to figure out what clients are using deprecated fields and automated the communication!", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "b22c4cbb4356649d15129696322b6777", + "venue_id": "2152806", + "speakers": [ + { + "username": "rickbijkerk54", + "id": "19320231", + "name": "Rick Bijkerk", + "company": "Bol", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:25", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:35", + "start_date": "2025-09-10", + "start_time": "14:25:00", + "start_time_ts": 1757510700, + "end_date": "2025-09-10", + "end_time": "14:35:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "929620", + "active": "Y", + "pinned": "N", + "name": "Efficient Semantic Comparison of GraphQL Queries - Duckki Oe, Apollo GraphQL", + "event_start": "2025-09-10 14:45", + "event_end": "2025-09-10 14:55", + "event_type": "Developer Experience", + "description": "Ever wondered if two seemingly different GraphQL queries actually return the same data? Or how to ensure that complex queries—packed with type conditions and directives like @skip/@include—still mean the same thing after a major refactor? In this talk, we’ll explore a novel static analysis technique that efficiently checks whether one query’s response is always a subset of another’s. By performing this subset test in both directions, we can reliably determine query equivalence—bringing new clarity to complex GraphQL operations.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Intermediate", + "id": "deac4044512d6d0a59c76aa712a777a4", + "venue_id": "2152806", + "speakers": [ + { + "username": "duckki.dev", + "id": "23098738", + "name": "Duckki Oe", + "company": "Apollo GraphQL", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "14:45", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "14:55", + "start_date": "2025-09-10", + "start_time": "14:45:00", + "start_time_ts": 1757511900, + "end_date": "2025-09-10", + "end_time": "14:55:00", + "event_subtype": "Testing" + }, + { + "event_key": "925155", + "active": "Y", + "pinned": "N", + "name": "Building Resilient APIs: Techniques for Easy and Effective Error Handling - Jesper Rasmussen, The LEGO Group", + "event_start": "2025-09-10 15:05", + "event_end": "2025-09-10 15:35", + "event_type": "Developer Experience", + "description": "Error handling is a critical aspect of developing robust GraphQL applications. Misuse or misunderstanding of errors can lead to applications that fail to function correctly, causing frustration for both developers and users.\n \nIn this talk, we explore how to effectively manage errors in GraphQL, ensuring they are wrapped in a useful way, the implementation details are hidden behind them, and common design pitfalls are avoided.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Studio", + "company": "Intermediate", + "id": "8ac5513fb2d9a6accff3ed83471540e2", + "venue_id": "2152809", + "speakers": [ + { + "username": "jesperrasmussen", + "id": "5254118", + "name": "Jesper Rasmussen", + "company": "The LEGO Group", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:35", + "start_date": "2025-09-10", + "start_time": "15:05:00", + "start_time_ts": 1757513100, + "end_date": "2025-09-10", + "end_time": "15:35:00", + "event_subtype": "Patterns and community trends" + }, + { + "event_key": "929167", + "active": "Y", + "pinned": "N", + "name": "“One Scheme To Rule Them All”: Simplifying 10+ Mediaset Apps With One Single GraphQL Service - Marco Reni, Mediaset", + "event_start": "2025-09-10 15:05", + "event_end": "2025-09-10 15:35", + "event_type": "GraphQL in Production", + "description": "Mediaset, one of Europe largest free broadcasters, owns and manages more than ten consumer-facing applications across web, mobile, and smart TV platforms, leading the Media and Entertainment ecosystem in Italy and Europe. Historically, each of these apps (managed by distinct development teams) interacted directly with several different backend APIs to serve content to customers, resulting in redundant development efforts, inconsistencies between platforms and enormous and useless network transfers. \n \nIn this session we will present how, by creating a carefully designed GraphQL schema, we managed to transition each of them to a more streamlined approach, where the backend complexity and variety is hidden from the frontend integrations. We will dive into the choices made, the GraphQL features that we leveraged (one among all, Persisted Queries to exploit CDNs), the issues that we've encountered while building the system, and the benefits that we gained from all perspectives: user experience, development perspective, feature delivery and time to market.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Intermediate", + "id": "c8078724c37fbcf7a899c4c653e473f9", + "venue_id": "2152800", + "speakers": [ + { + "username": "marco.reni", + "id": "23098780", + "name": "Marco Reni", + "company": "Mediaset", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:35", + "start_date": "2025-09-10", + "start_time": "15:05:00", + "start_time_ts": 1757513100, + "end_date": "2025-09-10", + "end_time": "15:35:00", + "event_subtype": "Case studies" + }, + { + "event_key": "924552", + "active": "Y", + "pinned": "N", + "name": "Proven Schema Designs and Best-practices - Jeff Dolle, The Guild", + "event_start": "2025-09-10 15:05", + "event_end": "2025-09-10 15:35", + "event_type": "GraphQL in Production", + "description": "\"There are only two hard things in Computer Science: cache invalidation and naming things\".\n \nGraphQL provides many benefits over other query languages. Federation builds on top of this foundation to provide even more flexibility and power. But even with all that GraphQL has to offer, the problem of naming remains.\n \nIn this talk, Jeff Dolle, from The Guild, will share what he's learned about schema design: proven design philosophies, designing for forward compatibility, exposing errors through types, and tips for how to avoid ambiguous or misleading type names.\n \nTogether, we will then go through an example product design meeting: taking user stories and building a complete GraphQL schema.", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "IJzaal", + "company": "Any", + "id": "9e816cd378c96b466658842ef0900183", + "venue_id": "2152806", + "speakers": [ + { + "username": "jeff737", + "id": "23098759", + "name": "Jeff Dolle", + "company": "The Guild", + "custom_order": 0 + } + ], + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:05", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "15:35", + "start_date": "2025-09-10", + "start_time": "15:05:00", + "start_time_ts": 1757513100, + "end_date": "2025-09-10", + "end_time": "15:35:00", + "event_subtype": "Schema evolution" + }, + { + "event_key": "9", + "active": "Y", + "pinned": "N", + "name": "Break", + "event_start": "2025-09-10 15:35", + "event_end": "2025-09-10 16:00", + "event_type": "Breaks + Networking", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Foyer Grote Zaal", + "id": "9ef4af16d7ad63877af95cb200d75848", + "venue_id": "2152803", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "15:35", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "16:00", + "start_date": "2025-09-10", + "start_time": "15:35:00", + "start_time_ts": 1757514900, + "end_date": "2025-09-10", + "end_time": "16:00:00", + "event_subtype": "", + "description": "" + }, + { + "event_key": "14", + "active": "Y", + "pinned": "N", + "name": "Keynote Sessions to be Announced", + "event_start": "2025-09-10 16:00", + "event_end": "2025-09-10 17:00", + "event_type": "Keynote Sessions", + "goers": "0", + "seats": "0", + "invite_only": "N", + "venue": "Grote Zaal", + "company": "Any", + "id": "cb86b2c03a77f0f4133f2d906911cd83", + "venue_id": "2152800", + "event_start_year": "2025", + "event_start_month": "September", + "event_start_month_short": "Sep", + "event_start_day": "10", + "event_start_weekday": "Wednesday", + "event_start_weekday_short": "Wed", + "event_start_time": "16:00", + "event_end_year": "2025", + "event_end_month": "September", + "event_end_month_short": "Sep", + "event_end_day": "10", + "event_end_weekday": "Wednesday", + "event_end_weekday_short": "Wed", + "event_end_time": "17:00", + "start_date": "2025-09-10", + "start_time": "16:00:00", + "start_time_ts": 1757516400, + "end_date": "2025-09-10", + "end_time": "17:00:00", + "event_subtype": "", + "description": "" } ] \ No newline at end of file diff --git a/scripts/sync-sched/speakers.json b/scripts/sync-sched/speakers.json index b70f20dcb9..0d437dd80f 100644 --- a/scripts/sync-sched/speakers.json +++ b/scripts/sync-sched/speakers.json @@ -68,6 +68,21 @@ ], "~syncedDetailsAt": 1749503031962 }, + { + "username": "aileen.chen", + "company": "Airbnb", + "position": "Staff Software Engineer", + "name": "Aileen Chen", + "about": "I work on Viaduct, Airbnb's GraphQL-based data-oriented service mesh.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/65/23098708/avatar.jpg.320x320px.jpg?37c", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592065466 + }, { "username": "ajhingran", "company": "IBM", @@ -101,13 +116,13 @@ }, { "username": "alec102", - "company": "Arista Networks", - "position": "Software Engineer", + "company": "HoudiniLabs", + "position": "CEO", "name": "Alec Aivazis", "about": "Alec is an open source enthusiast currently focused on Houdini, a GraphQL client. He spends his time away from the keyboard tending to a collection of carnivorous plants. And when he's in the mood for a sunburn, he also enjoys cycling and sailing with his family.", "location": "", "url": "https://alec.aivazis.com/", - "avatar": "//avatars.sched.co/d/b3/18743870/avatar.jpg.320x320px.jpg?ac7", + "avatar": "//avatars.sched.co/d/b3/18743870/avatar.jpg.320x320px.jpg?03d", "socialurls": [ { "service": "Twitter", @@ -119,9 +134,10 @@ } ], "_years": [ - 2023 + 2023, + 2025 ], - "~syncedDetailsAt": 1749497543087 + "~syncedDetailsAt": 1749592044011 }, { "username": "alex_reilly.7ldur4l", @@ -171,6 +187,36 @@ ], "~syncedDetailsAt": 1749497543087 }, + { + "username": "aleymet", + "company": "Bouygues Telecom", + "position": "Senior Architect", + "name": "Arnaud Leymet", + "about": "A dedicated Senior Solutions Architect & Staff Engineer with a proven ability to lead projects and drive software development initiatives. I thrive in dynamic environments, leveraging my strong technical skills, deep product knowledge and collaborative approach to drive innovation and deliver composable and impactful solutions.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/80/23098717/avatar.jpg.320x320px.jpg?ed8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592065466 + }, + { + "username": "amanda1988", + "company": "Buffer", + "position": "Staff Product Manager", + "name": "Amanda Marochko", + "about": "Originally from Ottawa, Canada, and currently based in Amsterdam, The Netherlands. Amanda Marochko is a Staff Product Manager at Buffer, responsible for maintaining and expanding Buffer's core product offering through channels and integrations. Prior to Buffer, she was the International Growth Lead (EMEA) at Shopify. Outside of work, she runs a non-profit for women in tech.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/80/23098711/avatar.jpg.320x320px.jpg?fab", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592065466 + }, { "username": "amy1908", "company": "RedwoodJS", @@ -233,17 +279,18 @@ { "username": "andreas.marek1", "company": "Atlassian", - "position": "Software Developer", + "position": "Developer", "name": "Andreas Marek", "about": "GraphQL TSC Member and GraphQL Java founder. Working on all things GraphQL at Atlassian.", "location": "", "url": "", - "avatar": "//avatars.sched.co/1/ac/21066795/avatar.jpg.320x320px.jpg?e5e", + "avatar": "//avatars.sched.co/1/ac/21066795/avatar.jpg.320x320px.jpg?556", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749505494947 + "~syncedDetailsAt": 1749592065466 }, { "username": "andrei.bocan", @@ -253,12 +300,13 @@ "about": "Andrei is a professional book hoarder who frequently complains about software.", "location": "", "url": "", - "avatar": "//avatars.sched.co/f/c3/21066797/avatar.jpg.320x320px.jpg?012", + "avatar": "//avatars.sched.co/f/c3/21066797/avatar.jpg.320x320px.jpg?fc6", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749505494947 + "~syncedDetailsAt": 1749592065466 }, { "username": "andrew.doyle1", @@ -382,6 +430,21 @@ ], "~syncedDetailsAt": 1749501873331 }, + { + "username": "apadmarao", + "company": "Meta", + "position": "Software Engineer", + "name": "Anirudh Padmarao", + "about": "Server Infrastructure at Instagram", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/7a/23098714/avatar.jpg.320x320px.jpg?a19", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592073267 + }, { "username": "ardatanrikulu", "company": "The Guild", @@ -467,15 +530,30 @@ ], "~syncedDetailsAt": 1749497439360 }, + { + "username": "benjamin154", + "company": "Grafbase", + "position": "Software Engineer", + "name": "Benjamin Rabier", + "about": "Living close to Paris, I've been at Grafbase for over two years building the GraphQL federation gateway among other things.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/22/23098720/avatar.jpg.320x320px.jpg?a94", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592073267 + }, { "username": "benjie3", "company": "Graphile", - "position": "GraphQL Community Gardener", + "position": "GraphQL TSC Member", "name": "Benjie Gillam", - "about": "A self-described \"community-funded open source maintainer,\" Benjie spends much of his time on OSS, enabled by appreciative and forward-thinking individuals and organizations who sponsor his continued efforts. Through his 5 years attending the GraphQL Working Group, Benjie has become one of the key members – both in terms of his own contributions, and in terms of helping others to advance their submissions. As a member of the GraphQL TSC, Benjie is proud to help guide GraphQL into the future.", + "about": "A self-described \"community-funded open source maintainer,\" Benjie dedicates much of his time to open source, made possible by the support of appreciative and forward-thinking individuals and organizations. He can often be found helping contributors advance their proposals, and has been instrumental in many key GraphQL advancements and initiatives. As a member of the GraphQL Technical Steering Committee (TSC), Benjie is proud to help guide GraphQL into the future.", "location": "Chandler's Ford, UK", "url": "https://graphile.org/", - "avatar": "//avatars.sched.co/b/99/18743846/avatar.jpg.320x320px.jpg?b57", + "avatar": "//avatars.sched.co/b/99/18743846/avatar.jpg.320x320px.jpg?a19", "socialurls": [ { "service": "Twitter", @@ -488,9 +566,40 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749503993038 + "~syncedDetailsAt": 1749592065466 + }, + { + "username": "benoit_lubek.28dhc1v7", + "company": "", + "position": "", + "name": "Benoit Lubek", + "about": "", + "location": "", + "url": "", + "avatar": "", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, + { + "username": "BoD", + "company": "Apollo Graph", + "position": "Android Developer", + "name": "Benoit", + "about": "Currently working on Apollo-Kotlin, the Kotlin SDK for GraphQL, Benoit has been writing software for 20 years, with a focus on Android since its v1. When he’s not coding, you can find him enjoying movies or geocaching.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/0/d3/431358/avatar.jpg.320x320px.jpg?e99", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592073267 }, { "username": "brandon.r.minnick", @@ -591,6 +700,21 @@ ], "~syncedDetailsAt": 1749501873331 }, + { + "username": "chanc2", + "company": "Meta", + "position": "Software Engineer", + "name": "Chi Chan", + "about": "GraphQL server side framework at Meta.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/6c/23098726/avatar.jpg.320x320px.jpg?2c3", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592073267 + }, { "username": "christian.ernst", "company": "Booking.com", @@ -645,6 +769,21 @@ ], "~syncedDetailsAt": 1749505494947 }, + { + "username": "curtis99877", + "company": "Meta Platforms", + "position": "Software Engineer", + "name": "Curtis Li", + "about": "Supporting GraphQL for mobile at Meta", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/b/59/23098729/avatar.jpg.320x320px.jpg?30d", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749592073267 + }, { "username": "danadajian", "company": "Expedia Group", @@ -665,6 +804,21 @@ ], "~syncedDetailsAt": 1749501873331 }, + { + "username": "danielha4", + "company": "monday.com", + "position": "API Product Lead", + "name": "Daniel Hai", + "about": "Daniel Hai is the API Product Manager at monday.com, leading the strategy behind one of the largest public GraphQL implementations in the industry. With a decade of experience spanning software engineering and product management, he specializes in building APIs that developers love.\n \nBeyond his role at monday, Daniel actively shares insights on API product management and consults companies and startups on creating world-class developer experiences for the APIs.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/9a/23098732/avatar.jpg.320x320px.jpg?0c3", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749594926268 + }, { "username": "danielle.man", "company": "Apollo GraphQL", @@ -700,10 +854,10 @@ "company": "Atlassian", "position": "Software Engineer", "name": "Donna Zhou", - "about": "I'm a maintainer of GraphQL Java and software engineer at Atlassian. I've published a book, \"GraphQL with Java and Spring\", all about the official Spring for GraphQL integration and the GraphQL Java library.", + "about": "I'm a maintainer of GraphQL Java and software engineer at Atlassian. I've published a book, GraphQL with Java and Spring, all about the official Spring for GraphQL integration and the GraphQL Java library.", "location": "", "url": "", - "avatar": "//avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e1f", + "avatar": "//avatars.sched.co/0/1d/18743879/avatar.jpg.320x320px.jpg?e2e", "socialurls": [ { "service": "LinkedIn", @@ -711,9 +865,25 @@ } ], "_years": [ - 2023 + 2023, + 2025 ], - "~syncedDetailsAt": 1749503546034 + "~syncedDetailsAt": 1749592065466 + }, + { + "username": "dotan1", + "company": "The Guild", + "position": "CTO", + "name": "Dotan Simha", + "about": "CTO @ The Guild, creator and maintainer of many open-source libraries in the GraphQL ecosystem, including GraphQL-Codegen.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/1e/23098735/avatar.jpg.320x320px.jpg?7a3", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749595055987 }, { "username": "dotansimha", @@ -735,6 +905,21 @@ ], "~syncedDetailsAt": 1749503782817 }, + { + "username": "duckki.dev", + "company": "Apollo GraphQL", + "position": "Staff Software Engineer", + "name": "Duckki Oe", + "about": "Duckki is an engineer at Apollo GraphQL, working on Apollo Federation. With a decade of experience building static analysis tools to detect bugs and security vulnerabilities, he’s passionate about making GraphQL more reliable and efficient. Duckki holds a PhD from the University of Iowa and is committed to advancing tools and techniques that help developers maximize the potential of GraphQL.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/61/23098738/avatar.jpg.320x320px.jpg?53a", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, { "username": "eitan15", "company": "Inigo", @@ -772,13 +957,13 @@ }, { "username": "en3m", - "company": "The Guild", - "position": "Machina", + "company": "-", + "position": "dimaMachina.com", "name": "Dimitri Postolov", - "about": "Open Source developer from Paris GraphQL-ESLint, Nextra and GraphiQL maintener", + "about": "Open Source developer from Paris\nGraphQL-ESLint, Nextra and GraphiQL maintener", "location": "", "url": "https://the-guild.dev", - "avatar": "//avatars.sched.co/5/78/18743843/avatar.jpg.320x320px.jpg?664", + "avatar": "//avatars.sched.co/5/78/18743843/avatar.jpg.320x320px.jpg?bb3", "socialurls": [ { "service": "Twitter", @@ -794,9 +979,10 @@ } ], "_years": [ - 2023 + 2023, + 2025 ], - "~syncedDetailsAt": 1749503981180 + "~syncedDetailsAt": 1749592065466 }, { "username": "erikwrede2", @@ -846,6 +1032,51 @@ ], "~syncedDetailsAt": 1749503981180 }, + { + "username": "ethan_shen.28dgusli", + "company": "LinkedIn", + "position": "Staff Software Engineer", + "name": "Ethan Shen", + "about": "I have over five years of experience working with GraphQL, applying the technology across both backend and frontend systems. I currently serve as a Staff Engineer and Tech Lead of the GraphQL Infrastructure team at LinkedIn.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/a/2f/23098744/avatar.jpg.320x320px.jpg?2ab", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, + { + "username": "fthompson11", + "company": "Pinterest", + "position": "Senior Software Engineer", + "name": "Fiona Huang", + "about": "Fiona Huang is a Senior Software Engineer at Pinterest 📌 working on GraphQL on the Core API Platform team. Previously, she worked on planet scale APIs at Google, GraphQL at Twitter, and APIs at Braintree. Fiona enjoys data modeling 👩🏻‍💻, coffee ☕, croissants 🥐, and superfluous emoji usage ✨.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/64/23098747/avatar.jpg.320x320px.jpg?c82", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, + { + "username": "gabe210", + "company": "StubHub Inc", + "position": "Senior Software Engineer - Design System Lead", + "name": "Gabriel Cura-Castro", + "about": "Gabriel Cura-Castro is senior software engineer with a particular interest in UX and design systems. He has two decades of experience developing software in a diverse range of fields spanning from developer tools, internet infrastructure, and finance.\n \nHe has spent the last decade building design systems and federated components for the likes of Apple, Netflix, and now StubHub.\n \nIn his spare time you can find him hiking the mountains of California with his daughter and partner.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/54/23098750/avatar.jpg.320x320px.jpg?1ee", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, { "username": "gabrielschulhof", "company": "Auction.com", @@ -953,6 +1184,21 @@ ], "~syncedDetailsAt": 1749505650884 }, + { + "username": "goodwin.y.emily", + "company": "Independent", + "position": "Professional GraphQL Developer turned GraphQL Hobbiest", + "name": "Emily Goodwin", + "about": "Emily has professionally worked with GraphQL for a bit over two years and has shifted to working with GraphQL as a hobby. She has experience with production schema stitching federate environments and customized GraphQL tools. When not coding she enjoys Magic the Gathering and volunteering.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/45/23098741/avatar.jpg.320x320px.jpg?a4f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, { "username": "hello2358", "company": "IBM", @@ -1001,7 +1247,7 @@ "about": "Software Engineer working on Infrastructure experiences at Meta", "location": "", "url": "https://www.threads.net/@itamarok", - "avatar": "//avatars.sched.co/b/e5/80829/avatar.jpg.320x320px.jpg?988", + "avatar": "//avatars.sched.co/b/e5/80829/avatar.jpg.320x320px.jpg?5bf", "socialurls": [ { "service": "Facebook", @@ -1013,9 +1259,25 @@ } ], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749501888881 + "~syncedDetailsAt": 1749592044011 + }, + { + "username": "ivan.goncharov.ua", + "company": "ApolloGraphQL", + "position": "Staff Software Engineer", + "name": "Ivan Goncharov", + "about": "Ivan has been active in the GraphQL community since its early days and is currently a member of the GraphQL Technical Steering Committee.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/6f/23096422/avatar.jpg.320x320px.jpg?958", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 }, { "username": "jamie855", @@ -1056,6 +1318,21 @@ ], "~syncedDetailsAt": 1749505607370 }, + { + "username": "janettelc", + "company": "Meta", + "position": "Software Engineer", + "name": "Janette Cheng", + "about": "Working on the GraphQL client and build infrastructure for mobile apps at Meta", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/f9/23098753/avatar.jpg.320x320px.jpg?9a8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708151 + }, { "username": "jared_cheney.7rad60v", "company": "Intuit", @@ -1076,15 +1353,30 @@ ], "~syncedDetailsAt": 1749505650884 }, + { + "username": "jasonkuhrt", + "company": "The Guild", + "position": "Mr.", + "name": "Jason Kuhrt", + "about": "I am a builder passionate about system design, developer experience, static typing, and functional programming. Educated in design theory, practice, and social responsibility, I fell into code via open source gateways like Wordpress, jQuery, Node.js, and GitHub. My love for open source continues today in TypeScript and GraphQL. In my personal life, close to my heart are the backpacking trips I take my two boys on yearly across the beautiful rugged Canadian wilderness.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/0a/23098756/avatar.jpg.320x320px.jpg?3a2", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708152 + }, { "username": "jeff.auriemma", "company": "Apollo GraphQL", "position": "Senior Engineering Manager", "name": "Jeff Auriemma", - "about": "Hi, I'm Jeff! I'm a manager serving the Apollo Client, Apollo iOS, and Apollo Kotlin engineers. I also serve as a member of the GraphQL Foundation's Governing Board. In my spare time I enjoy baking, coffee, making music, kayaking, and nature walks with my spouse and three children.", + "about": "Hi, I'm Jeff! I support the Apollo Client, Apollo iOS, Apollo Kotlin, and Apollo Server engineers at Apollo as a manager. Before going into software I was a trombonist and public school music teacher. In my free time I like to bake Chicago-style deep dish pizzas and French macarons.", "location": "Connecticut, USA", "url": "https://apollographql.com", - "avatar": "//avatars.sched.co/3/77/18743876/avatar.jpg.320x320px.jpg?a1e", + "avatar": "//avatars.sched.co/3/77/18743876/avatar.jpg.320x320px.jpg?d3d", "socialurls": [ { "service": "Twitter", @@ -1097,9 +1389,25 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749497439360 + "~syncedDetailsAt": 1749592033888 + }, + { + "username": "jeff737", + "company": "The Guild", + "position": "Software Engineer", + "name": "Jeff Dolle", + "about": "Jeff Dolle is a Software Engineer at The Guild who has been using GraphQL full-stack since 2016 and is currently working on the GraphQL Hive platform. He has extensive experience designing and implementing schemas in production software, serving over a billion requests a month.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/3/b5/23098759/avatar.jpg.320x320px.jpg?613", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708152 }, { "username": "jens63", @@ -1125,6 +1433,41 @@ ], "~syncedDetailsAt": 1749505650884 }, + { + "username": "jerel.miller", + "company": "Apollo GraphQL", + "position": "Principal Software Engineer", + "name": "Jerel Miller", + "about": "Jerel is a Colorado native with a brief stint in Portland Oregon. He loves to code and learn about all sorts of programming patterns. He is an avid Denver Broncos fan and loves to play the bass.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/6e/23098762/avatar.jpg.320x320px.jpg?2ea", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570708152 + }, + { + "username": "jesperrasmussen", + "company": "The LEGO Group", + "position": "Principal Engineer", + "name": "Jesper Rasmussen", + "about": "Jesper Rasmussen is a Principal Engineer at The LEGO Group with a passion for building great developer experiences. He’s been working with GraphQL since 2016 across several companies, leading transformation projects and helping teams get the most out of their APIs.\n \nOutside of work, Jesper enjoys hiking, mixing up cocktails, cooking, dialing in the perfect espresso—and always has some death metal playing in the background.", + "location": "Odense, Denmark", + "url": "", + "avatar": "//avatars.sched.co/4/43/5254118/avatar.jpg.320x320px.jpg?a7c", + "socialurls": [ + { + "service": "Facebook", + "url": "https://www.facebook.com/app_scoped_user_id/YXNpZADpBWEZAVZA1doQi1ZAanFBcnNlWGtJdlJtS3NsaUgtT3N0V3ZApVzhfNFdadG5lZAVkxRzI0b2ZAVVFZAidXYxcHYwakZAqOVB6VzU5S2VhWWdFaGZAiWFEzc2VXS2dTRThCaFZAnYkthY2toNk5MbgZDZD/" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, { "username": "jim.barton", "company": "Solo.io", @@ -1149,6 +1492,21 @@ ], "~syncedDetailsAt": 1749505650884 }, + { + "username": "joebirch", + "company": "Buffer", + "position": "Staff Engineer", + "name": "Joe Birch", + "about": "Hi, my names Joe. I’m an Android Engineer and Google Developer Expert for Android based in Brighton, UK working on GraphQL + Android at Buffer. I’m passionate about coding and love creating robust, polished and exciting projects for mobile, the web, TV, wearables and I’ll probably be toying with whatever the new thing is at the time you’re reading this.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/34/23098765/avatar.jpg.320x320px.jpg?897", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, { "username": "jordaneldredge", "company": "Meta", @@ -1169,9 +1527,39 @@ } ], "_years": [ - 2024 + 2024 + ], + "~syncedDetailsAt": 1749501888881 + }, + { + "username": "jordaneldredge1", + "company": "Meta", + "position": "Software Engineer at Meta", + "name": "Jordan Eldredge", + "about": "Jordan has spent the last eight years working at Meta. He currently works on Relay, a sophisticated GraphQL client for JavaScript that powers most of Meta's JavaScript applications.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/f6/21508644/avatar.jpg.320x320px.jpg?ad2", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, + { + "username": "juancarlosjr97", + "company": "RS Group", + "position": "Mr", + "name": "Juan Carlos Blanco Delgado", + "about": "Juan Carlos Blanco Delgado is a software engineer from Venezuela, now residing in the UK and working for RS Group. He is passionate about the Open Source community and holds certifications in AWS and Terraform HashiCorp. Juan Carlos enjoys climbing, cycling, running, snowboarding, swimming, listening to mushy songs, and watching and reading about films. Above all, he loves coding and creating cool stuff!", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/8/00/23098768/avatar.jpg.320x320px.jpg?e48", + "socialurls": [], + "_years": [ + 2025 ], - "~syncedDetailsAt": 1749501888881 + "~syncedDetailsAt": 1749570727785 }, { "username": "kamilkisiela", @@ -1181,7 +1569,7 @@ "about": "Working on GraphQL tooling since before I had a mustache. I'm proud of it (the tooling).", "location": "Warsaw, Poland", "url": "https://github.com/kamilkisiela", - "avatar": "//avatars.sched.co/2/7e/19082388/avatar.jpg.320x320px.jpg?d55", + "avatar": "//avatars.sched.co/2/7e/19082388/avatar.jpg.320x320px.jpg?42c", "socialurls": [ { "service": "Twitter", @@ -1198,9 +1586,10 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749497439360 + "~syncedDetailsAt": 1749592033888 }, { "username": "keerthan.ekbote", @@ -1347,7 +1736,7 @@ "about": "Laurin Quast is a developer that started exploring GraphQL, by leading API development at a start-up. Realizing that there are still many unsolved problems and challenges within the space, he started contributing to famous JavaScript libraries, such as GraphQL Code Generator and Tools. Diving deeper, the transition into becoming a full-time open-source developer at The Guild was inevitable. Currently, he is working on Hive helping teams scale GraphQL across teams and organizations.", "location": "", "url": "https://the-guild.dev/", - "avatar": "//avatars.sched.co/2/a6/18743819/avatar.jpg.320x320px.jpg?ed8", + "avatar": "//avatars.sched.co/2/a6/18743819/avatar.jpg.320x320px.jpg?705", "socialurls": [ { "service": "Twitter", @@ -1360,9 +1749,10 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749501892530 + "~syncedDetailsAt": 1749592065466 }, { "username": "ldebruijn", @@ -1398,7 +1788,7 @@ 2024, 2025 ], - "~syncedDetailsAt": 1749502251756 + "~syncedDetailsAt": 1749592065466 }, { "username": "lee_byron.25krdom6", @@ -1439,6 +1829,36 @@ ], "~syncedDetailsAt": 1749505650884 }, + { + "username": "lisamwatkins", + "company": "Meta", + "position": "Software Engineer", + "name": "Lisa Watkins", + "about": "Lisa works on the Mobile Sustainability team at Instagram. Her team's charter is to ensure the longterm health of the mobile developer experience at Instagram. Her main focus is transition Instagram from REST to GraphQL.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/15/23098774/avatar.jpg.320x320px.jpg?49f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, + { + "username": "loginsessionize", + "company": "Apollo", + "position": "Mobile Engineer", + "name": "Martin Bonnin", + "about": "Martin is a maintainer of Apollo Kotlin. He has been writing Android applications since Cupcake and fell in love with Kotlin in 2017. Martin loves naming things and the sound of his laptop fan compiling all these type-safe programs. When not busy rewriting all his bash scripts in Kotlin, Martin loves to hike the Pyrénées or play a good game of Hearthstone.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/ef/23098783/avatar.jpg.320x320px.jpg?7ff", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, { "username": "lyonwj1", "company": "Neo4j", @@ -1471,7 +1891,7 @@ "about": "I work on Meta's Mobile GraphQL team.", "location": "", "url": "", - "avatar": "//avatars.sched.co/c/1d/19314398/avatar.jpg.320x320px.jpg?f73", + "avatar": "//avatars.sched.co/c/1d/19314398/avatar.jpg.320x320px.jpg?b71", "socialurls": [ { "service": "Facebook", @@ -1483,9 +1903,55 @@ } ], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749501892530 + "~syncedDetailsAt": 1749592065466 + }, + { + "username": "mail1232", + "company": "Apollo GraphQL", + "position": "Senior Staff Engineer", + "name": "Lenz Weber-Tronic", + "about": "Lenz Weber-Tronic works as a Senior Staff Software Engineer at Apollo GraphQL, where he is part of the team maintaining the Apollo TypeScript Client. He is a maintainer of Redux Toolkit and if he’s not currently trying to summon elder gods with weird TypeScript incantations he can usually be found answering questions on Apollo and Redux usage or opening random PRs all over GitHub.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/fa/23098771/avatar.jpg.320x320px.jpg?314", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, + { + "username": "mansi.mittal", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Mansi Mittal", + "about": "Mansi Mittal is a Senior Software Engineer with 12 years of experience, including 6 years at Booking.com. She has designed and architected critical, high-scale systems and led the migration from REST + Protobuf to federated GraphQL for high-volume, business-critical services. Passionate about scalable architecture, she bridges product needs with elegant engineering solutions.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/1/45/23098777/avatar.jpg.320x320px.jpg?d75", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, + { + "username": "marco.reni", + "company": "Mediaset", + "position": "Architect", + "name": "Marco Reni", + "about": "Marco Reni is an Architect at Mediaset (MFE), the biggest broadcaster in Italy and one of the largest free broadcasters in Europe. He is in charge of all the frontend architectures and services. Over the years, he has taken responsibility of several high profile projects - including the new Voting Platform - leveraging his background as a Backend/DevOps Engineer. In his free time he likes to play the piano, play board games, eat ramen and take photos while traveling around the world.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/7/39/23098780/avatar.jpg.320x320px.jpg?6ae", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 }, { "username": "marion84", @@ -1514,17 +1980,18 @@ { "username": "martijn.walraven", "company": "Apollo", - "position": "Software Engineer at Apollo", + "position": "Software Engineer", "name": "Martijn Walraven", - "about": "Martijn Walraven lives in Amsterdam and has been with Apollo since the early days of our GraphQL journey. He is one of the co-creators of Apollo Federation. Outside of work, he enjoys volunteering at a primary school and is working towards a degree in gifted education.", + "about": "Martijn Walraven lives in Amsterdam and has been with Apollo since the early days of our GraphQL journey. He is one of the co-creators of Apollo Federation. Outside of work, he enjoys volunteering at a primary school and is working towards a degree in education.", "location": "", "url": "", - "avatar": "//avatars.sched.co/6/33/21066825/avatar.jpg.320x320px.jpg?23a", + "avatar": "//avatars.sched.co/6/33/21066825/avatar.jpg.320x320px.jpg?ac7", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749501892530 + "~syncedDetailsAt": 1749592065466 }, { "username": "marybriskin", @@ -1565,6 +2032,21 @@ ], "~syncedDetailsAt": 1749501892530 }, + { + "username": "matt_mahoney.28dhc1w9", + "company": "", + "position": "", + "name": "Matt Mahoney", + "about": "", + "location": "", + "url": "", + "avatar": "", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "matt1575", "company": "Apollo GraphQL", @@ -1580,6 +2062,26 @@ ], "~syncedDetailsAt": 1749501892530 }, + { + "username": "matteo.collina1", + "company": "Platformatic", + "position": "Co-Founder & CTO", + "name": "Matteo Collina", + "about": "Matteo co-founded Platformatic.dev and serves as its CTO, recognized as a leading Open Source author in JavaScript with 30B annual downloads. Previously, he was Chief Software Architect at NearForm and earned a Ph.D. in 2014. Matteo is on the Node.js Technical Steering Committee, focusing on streams and HTTP, and developed the fast logger Pino and the Fastify framework. He has spoken at over 60 conferences and co-authored \"Accelerating Server-Side Development with Fastify\" by Packt.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/56/11925534/avatar.jpg.320x320px.jpg?3fe", + "socialurls": [ + { + "service": "Twitter", + "url": "https://twitter.com/matteocollina" + } + ], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749570727785 + }, { "username": "mauricio.montalvo.guzman", "company": "Pinterest", @@ -1598,12 +2100,12 @@ { "username": "meenakshi.dhanani1", "company": "Postman", - "position": "Technical Enablement Architect", + "position": "Ms.", "name": "Meenakshi Dhanani", - "about": "Meenakshi works as a Technical Enablement Architect at Postman, an API platform with over 20 million users. Her team focuses on many API specifications, including GraphQL, gRPC, AsyncAPI, JSON Schema, and OpenAPI. Her current emphasis is on learning about and communicating best practices with GraphQL. Her Google Maps search history includes vegan restaurants and parks nearby.", + "about": "Meenakshi is a Technical Enablement Architect at Postman, helping internal teams and customers build better API practices and unlock the platform's full potential, which serves over 30 million users worldwide. With a background in full-stack development and Developer Relations, she led Postman’s GraphQL initiatives and is a voting member of the GraphQL Foundation Board. Outside of work, she’s a fitness enthusiast training to become a yoga instructor, striving for balance both on and off the mat.", "location": "India", "url": "", - "avatar": "//avatars.sched.co/4/8c/18777983/avatar.jpg.320x320px.jpg?237", + "avatar": "//avatars.sched.co/4/8c/18777983/avatar.jpg.320x320px.jpg?e4c", "socialurls": [ { "service": "Twitter", @@ -1615,9 +2117,10 @@ } ], "_years": [ - 2023 + 2023, + 2025 ], - "~syncedDetailsAt": 1749505650884 + "~syncedDetailsAt": 1749592065466 }, { "username": "mgiroux7", @@ -1648,10 +2151,10 @@ "company": "ChilliCream", "position": "Michael Staib", "name": "Michael Staib", - "about": "Michael is a member of the GraphQL technical steering committee, contributing to the GraphQL composite schema specification under the GraphQL Foundation. He is a Microsoft MVP and the author of the Hot Chocolate GraphQL Server for .NET. Michael frequently speaks at conferences and trains professionals in the .NET and GraphQL ecosystems, sharing his expertise and passion for these technologies.\n\nhttps://www.youtube.com/c/ChilliCream", + "about": "Michael is a member of the GraphQL technical steering committee, a Microsoft MVP, and the author of the Hot Chocolate project (https://github.com/ChilliCream/hotchocolate), a platform for building GraphQL servers and clients in .NET. This open-source project has been his main focus for the last couple of years.", "location": "Zurich", "url": "http://chillicream.com", - "avatar": "//avatars.sched.co/a/85/14900031/avatar.jpg.320x320px.jpg?df4", + "avatar": "//avatars.sched.co/a/85/14900031/avatar.jpg.320x320px.jpg?0a9", "socialurls": [ { "service": "Twitter", @@ -1664,9 +2167,25 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749501892530 + "~syncedDetailsAt": 1749592065466 + }, + { + "username": "michael.astle", + "company": "Xolvio", + "position": "CTO", + "name": "Mike Astle", + "about": "Mike is a practical software leader with an interest in theory, but a stronger interest in getting things done. He's been slinging ones and zeroes for 30 years now and has experience going from five person startups to thousand person enterprises. Mike is currently the CTO of Xolvio where he leads delivery of client projects using GraphQL and event sourcing every day. He has previously spoken at SXSW and GraphQL Summit and mixes a fair bit of humor into his informal public speaking style.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/eb/23098786/avatar.jpg.320x320px.jpg?eb8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749591475884 }, { "username": "michael.bleigh", @@ -1692,6 +2211,21 @@ ], "~syncedDetailsAt": 1749501892530 }, + { + "username": "minghe.huang", + "company": "Booking.com", + "position": "Senior Software Engineer", + "name": "Minghe Huang", + "about": "Minghe is a passionate software engineer with over a decade of experience spanning various technologies. With a deep interest in coding and scalable architectures, Minghe is currently focused on GraphQL federation and maintains the GraphQL federation platform at Booking.com.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/f2/23098789/avatar.jpg.320x320px.jpg?ff6", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749591475884 + }, { "username": "omribruchim", "company": "Stealth", @@ -1710,17 +2244,18 @@ { "username": "pascal.senn", "company": "ChilliCream", - "position": "Co-Founder of ChilliCream", + "position": "COO", "name": "Pascal Senn", "about": "I'm co-founder of ChilliCream, where we're passionate about advancing the GraphQL ecosystem. We develop and maintain open-source software, actively help and participate in the community, and create tools that help developers to get the most out of their GraphQL APIs.", "location": "", "url": "", - "avatar": "//avatars.sched.co/f/4e/21066839/avatar.jpg.320x320px.jpg?7e4", + "avatar": "//avatars.sched.co/f/4e/21066839/avatar.jpg.320x320px.jpg?efc", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502056388 + "~syncedDetailsAt": 1749592065466 }, { "username": "patrick.arminio", @@ -1888,36 +2423,68 @@ ], "~syncedDetailsAt": 1749502056389 }, + { + "username": "raymie2", + "company": "Airbnb", + "position": "Contractor, former Technical Fellow", + "name": "Raymie Stata", + "about": "Early in his career Raymie worked on Web Search and Big Data. He sold his desktop search startup to Yahoo!, where he rose to become the CTO. At Yahoo! he was heavily involved in the Hadoop ecosystem. He left Yahoo! to start a big-data-as-a-service company, which he sold to SAP in 2016. In 2019 he joined Airbnb as its first Technical Fellow, where he lead a program to re-engineer their tech stack. In 2024 he stepped down as a Technical Fellow to devote himself full-time to Viaduct.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/4/a1/23098792/avatar.jpg.320x320px.jpg?a85", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749591475884 + }, + { + "username": "rickbijkerk54", + "company": "Bol", + "position": "Software Engineer @ Bol", + "name": "Rick Bijkerk", + "about": "todo", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/d/6a/19320231/avatar.jpg.320x320px.jpg?4cd", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749591392603 + }, { "username": "robert.balicki", "company": "Pinterest", - "position": "Staff software engineer", + "position": "Staff Engineer", "name": "Robert Balicki", - "about": "Robert Balicki works as a staff software engineer at Pinterest. He used to have hair down to his shoulders and play in a rock band.", + "about": "Robert Balicki works as a software engineer at Jetty. He used to have hair down to his shoulders and play in a rock band.", "location": "", "url": "", - "avatar": "//avatars.sched.co/5/8b/18743858/avatar.jpg.320x320px.jpg?07e", + "avatar": "//avatars.sched.co/5/8b/18743858/avatar.jpg.320x320px.jpg?7d6", "socialurls": [], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502056389 + "~syncedDetailsAt": 1749592065466 }, { "username": "robrichard87", - "company": "1stdibs", + "company": "1stDibs", "position": "Senior Director, Front-End Engineering", "name": "Rob Richard", "about": "Rob is a front-end engineer at 1stDibs, an online marketplace for extraordinary design. He is also a member of the GraphQL Technical Steering committee, where he has been championing the @defer & @stream spec proposal.", "location": "", "url": "", - "avatar": "//avatars.sched.co/b/cb/21066852/avatar.jpg.320x320px.jpg?cd2", + "avatar": "//avatars.sched.co/b/cb/21066852/avatar.jpg.320x320px.jpg?6f4", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502056389 + "~syncedDetailsAt": 1749592065466 }, { "username": "ruben.cagnie", @@ -1942,12 +2509,13 @@ "about": "GraphQL client-side frameworks software engineer at Meta.", "location": "", "url": "", - "avatar": "//avatars.sched.co/d/94/21066857/avatar.jpg.320x320px.jpg?49c", + "avatar": "//avatars.sched.co/d/94/21066857/avatar.jpg.320x320px.jpg?4fd", "socialurls": [], "_years": [ - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502079623 + "~syncedDetailsAt": 1749592065466 }, { "username": "saihaj", @@ -1988,6 +2556,36 @@ ], "~syncedDetailsAt": 1749502079623 }, + { + "username": "sam_2f", + "company": "Expedia Group", + "position": "Principal Software Engineer", + "name": "Samuel Bernardo Vázquez Andalón", + "about": "Born and raised in Guadalajara, Jalisco, México, attended University of Guadalajara and working for Expedia Group since 2018.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/e/e5/23098795/avatar.jpg.320x320px.jpg?102", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749591392603 + }, + { + "username": "sanvertarmur", + "company": "Booking.com", + "position": "Senior Software Engineer 2", + "name": "Sanver Tarmur", + "about": "Sanver is a Senior Software Engineer II at Booking.com with 15 years of industry experience. In recent years, he has been leading the Federated GraphQL transformation at Booking.com, focusing on scaling, enhancing the security of the GraphQL platform, and improving the developer experience for internal Graph users.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/0/9e/23098798/avatar.jpg.320x320px.jpg?318", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "sasanders26", "company": "Highnote", @@ -2136,6 +2734,21 @@ ], "~syncedDetailsAt": 1749502079623 }, + { + "username": "shawsourav91", + "company": "Atlassian", + "position": "Principal Engineer", + "name": "Sourav Shaw", + "about": "Engineer with decade of experience in software. Worked across platform and product teams at Atlassian.\nCurrently working as an architect in Jira's Issue Domain at Atlassian.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/6/e0/23098801/avatar.jpg.320x320px.jpg?8c8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "siva27", "company": "Intuit", @@ -2171,10 +2784,10 @@ "company": "Netflix", "position": "Engineer", "name": "Stephen Spalding", - "about": "Stephen is a member of the Edge API team at Netflix and a member of the GraphQL TSC. His team develops and operates the Netflix API platform. This is the nexus point where hundreds of microservices are aggregated into a single API that delivers the Netflix experience for the hundreds of millions of Netflix devices worldwide.", + "about": "Stephen is a member of the Edge API team at Netflix and a GraphQL TSC emeritus. His team develops and operates the Netflix API platform. This is the nexus point where hundreds of microservices are aggregated into a single API that delivers the Netflix experience for the hundreds of millions of Netflix devices worldwide.", "location": "", "url": "http://stephenspalding.com", - "avatar": "//avatars.sched.co/8/08/18743825/avatar.jpg.320x320px.jpg?599", + "avatar": "//avatars.sched.co/8/08/18743825/avatar.jpg.320x320px.jpg?af4", "socialurls": [ { "service": "Twitter", @@ -2183,9 +2796,10 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502079623 + "~syncedDetailsAt": 1749592065466 }, { "username": "stefan239", @@ -2217,6 +2831,21 @@ ], "~syncedDetailsAt": 1749568381878 }, + { + "username": "stephenchambers", + "company": "Netflix", + "position": "N/A", + "name": "Stephen Chambers", + "about": "Stephen Chambers is a Senior Software Engineer on the API team at Netflix. With a background in distributed systems, he spent six years at Liberty Mutual Insurance and two years at Apple before joining Netflix. Brand new to GraphQL, Stephen is navigating this technology with fresh eyes. Outside of work, he enjoys lifting weights, playing live music, and traveling with his wife, Tiffany.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/ac/23098804/avatar.jpg.320x320px.jpg?4a8", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "suresh_muthu", "company": "Intuit", @@ -2333,6 +2962,21 @@ ], "~syncedDetailsAt": 1749568381879 }, + { + "username": "tom817", + "company": "Grafbase", + "position": "Engineer", + "name": "Tom Houlé", + "about": "Tom's professional life has gravitated towards GraphQL and Rust, schemas and databases. After authoring the first Rust GraphQL client library, recent years have taken him from the database schema management space at Prisma to GraphQL federation at Grafbase. In his free time, he enjoys long walks, pistachios and trying to teach his dog the international phonetic alphabet.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/2/e2/23098807/avatar.jpg.320x320px.jpg?cff", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "tristan119", "company": "Escape", @@ -2405,12 +3049,12 @@ { "username": "uri_goldshtein.23xujj9a", "company": "The Guild", - "position": "Founder", + "position": "CEO", "name": "Uri Goldshtein", "about": "The Guild, the largest open source group in the GraphQL ecosystem", "location": "", "url": "http://the-guild.dev", - "avatar": "//avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?9f1", + "avatar": "//avatars.sched.co/8/2b/14900013/avatar.jpg.320x320px.jpg?06d", "socialurls": [ { "service": "Twitter", @@ -2423,9 +3067,10 @@ ], "_years": [ 2023, - 2024 + 2024, + 2025 ], - "~syncedDetailsAt": 1749502251756 + "~syncedDetailsAt": 1749592065466 }, { "username": "vincent.desmares", @@ -2442,6 +3087,36 @@ ], "~syncedDetailsAt": 1749502251756 }, + { + "username": "vivekyadav.cse.2005", + "company": "Atlassian", + "position": "Modernizing a Million Lines of Code: Jira's Journey to GraphQL and Relay", + "name": "Vivek Yadav", + "about": "Masters from IIT Roorkee. Engineer with decade of experience in software previously Worked in Amazon & Uber. \nIn Atlassian Using GraphQL to handle JIRA's scale and optimising for better observability, safe rollouts and making JIRA more responsive.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/b1/23098813/avatar.jpg.320x320px.jpg?d11", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, + { + "username": "vmjohnson999", + "company": "The New York Times", + "position": "Associate Android Engineer", + "name": "Vanessa Johnson", + "about": "Vanessa Johnson is an Associate Android Engineer at The New York Times working on the Games Android app. She specializes in UI features and loves building mobile apps. She is passionate about accessibility and is also working on an iOS side project that will help people manage their digestive issues like Crohns and IBS. When she isn’t coding she is usually playing pickup basketball or watching a horror movie.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/54/23098810/avatar.jpg.320x320px.jpg?394", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "watson17", "company": "Apollo GraphQL", @@ -2457,6 +3132,21 @@ ], "~syncedDetailsAt": 1749502251756 }, + { + "username": "x65han", + "company": "Meta Inc.", + "position": "Software Engineer", + "name": "Xiao Han", + "about": "Software Engineer on Instagram Product Foundations", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/5/90/23098816/avatar.jpg.320x320px.jpg?d30", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, { "username": "yaacovcr", "company": "Open Source", @@ -2520,5 +3210,35 @@ 2023 ], "~syncedDetailsAt": 1749568381879 + }, + { + "username": "yehudar", + "company": "JFrog", + "position": "Application Security Researcher, JFrog", + "name": "Yehuda Rosenberg", + "about": "I'm an Application Security Researcher passionate about breaking assumptions in modern web technologies. From protocol quirks to real-world vulnerabilities, I explore how small oversights lead to big security issues. My work often blends offensive research with practical defense, aiming to make the internet a little safer and a lot more interesting.", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/f/a8/23098819/avatar.jpg.320x320px.jpg?d3f", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 + }, + { + "username": "zach.fetters", + "company": "Apollo GraphQL", + "position": "Staff Software Engineer", + "name": "Zach FettersMoore", + "about": "Engineer at Apollo GraphQL, working on the Apollo iOS Library", + "location": "", + "url": "", + "avatar": "//avatars.sched.co/c/02/23098822/avatar.jpg.320x320px.jpg?df2", + "socialurls": [], + "_years": [ + 2025 + ], + "~syncedDetailsAt": 1749580595155 } -] \ No newline at end of file +] diff --git a/scripts/sync-sched/sync.ts b/scripts/sync-sched/sync.ts index 4e673a04e3..ed38532793 100644 --- a/scripts/sync-sched/sync.ts +++ b/scripts/sync-sched/sync.ts @@ -181,6 +181,19 @@ async function updateSpeakerDetails( }) const toUpdate = byUpdateTime.slice(0, quota) + console.log(`Fetching additional details for ${toUpdate.length} speakers...`) + console.log( + toUpdate + .map(s => + [ + `- ${s.username.padEnd(32, " ")}`, + s["~syncedDetailsAt"] + ? `last synced at ${new Date(s["~syncedDetailsAt"]).toLocaleString()}` + : "without details yet", + ].join("\t"), + ) + .join("\n"), + ) const limit = pLimit(5) const updated = await Promise.all( @@ -193,15 +206,20 @@ async function updateSpeakerDetails( const location = locations.get(speaker.username) if (location) { const [key, index] = location + const current = + key === "changed" ? comparison[key][index].new : comparison[key][index] + + const newValue = mergeSpeaker(current, speaker) + const diff = objectDiff({ old: current, new: newValue }) + if (diff.trim()) { + console.log(diff) + } + newValue["~syncedDetailsAt"] = Date.now() + if (key === "changed") { - comparison[key][index].new = mergeSpeaker( - comparison[key][index].new, - speaker, - ) - comparison[key][index].new["~syncedDetailsAt"] = Date.now() + comparison[key][index].new = newValue } else { - comparison[key][index] = mergeSpeaker(comparison[key][index], speaker) - comparison[key][index]["~syncedDetailsAt"] = Date.now() + comparison[key][index] = newValue } } } @@ -212,7 +230,7 @@ async function updateSpeakerDetails( ) const nowUnchanged = comparison.changed .filter(change => deepStrictEqualWithoutInternals(change.old, change.new)) - .map(change => change.old) + .map(change => change.new) comparison.changed = actuallyChanged comparison.unchanged.push(...nowUnchanged) diff --git a/src/app/conf/2023/page.tsx b/src/app/conf/2023/page.tsx index 5f58405460..c4e160cc40 100644 --- a/src/app/conf/2023/page.tsx +++ b/src/app/conf/2023/page.tsx @@ -24,7 +24,7 @@ export default function ConfPage() { function Hero() { return ( -
+
diff --git a/src/app/conf/2023/sessions/[id]/_event_title.ts b/src/app/conf/2023/sessions/[id]/_event_title.ts index a0510613c2..a9b5a8b2ea 100644 --- a/src/app/conf/2023/sessions/[id]/_event_title.ts +++ b/src/app/conf/2023/sessions/[id]/_event_title.ts @@ -1,4 +1,4 @@ -import { ScheduleSession } from "../../../_components/schedule/session-list" +import { ScheduleSession } from "@/app/conf/_api/sched-types" export function getEventTitle( event: ScheduleSession, diff --git a/src/app/conf/2024/speakers/[id]/page.tsx b/src/app/conf/2024/speakers/[id]/page.tsx index 772484c6e7..1d70675439 100644 --- a/src/app/conf/2024/speakers/[id]/page.tsx +++ b/src/app/conf/2024/speakers/[id]/page.tsx @@ -18,7 +18,11 @@ type SpeakerProps = { params: { id: string } } export function generateMetadata({ params }: SpeakerProps): Metadata { const decodedId = decodeURIComponent(params.id) - const speaker = speakers.find(s => s.username === decodedId)! + const speaker = speakers.find(s => s.username === decodedId) + + if (!speaker) { + throw new Error(`Speaker "${decodedId}" not found for details page`) + } const keywords = [speaker.name, speaker.company, speaker.position].filter( Boolean, diff --git a/src/app/conf/2025/_data.ts b/src/app/conf/2025/_data.ts index 6a05ec29c5..dcd74199df 100644 --- a/src/app/conf/2025/_data.ts +++ b/src/app/conf/2025/_data.ts @@ -4,7 +4,6 @@ import { SchedSpeaker, ScheduleSession } from "@/app/conf/2023/types" import { readSpeakers } from "../_api/sched-data" export const schedule: ScheduleSession[] = require("../../../../scripts/sync-sched/schedule-2025.json") -export const speakers: SchedSpeaker[] = readSpeakers(2025) type SpeakerUsername = SchedSpeaker["username"] @@ -19,3 +18,37 @@ for (const session of schedule) { speakerSessions.get(speaker.username)!.push(session) } } + +export const speakers: SchedSpeaker[] = readSpeakers(2025).filter(speaker => + speakerSessions.has(speaker.username), +) + +export const previousEditionSessions = new Map< + SpeakerUsername, + ScheduleSession[] +>() + +{ + const schedule2023 = require("../../../../scripts/sync-sched/schedule-2023.json") + const schedule2024 = require("../../../../scripts/sync-sched/schedule-2024.json") + + for (const session of schedule2023) { + for (const speaker of session.speakers || []) { + if (!previousEditionSessions.has(speaker.username)) { + previousEditionSessions.set(speaker.username, []) + } + + previousEditionSessions.get(speaker.username)!.push(session) + } + } + + for (const session of schedule2024) { + for (const speaker of session.speakers || []) { + if (!previousEditionSessions.has(speaker.username)) { + previousEditionSessions.set(speaker.username, []) + } + + previousEditionSessions.get(speaker.username)!.push(session) + } + } +} diff --git a/src/app/conf/2025/_videos.ts b/src/app/conf/2025/_videos.ts index e8b9f74c8b..e2c1f16ab0 100644 --- a/src/app/conf/2025/_videos.ts +++ b/src/app/conf/2025/_videos.ts @@ -1,10 +1,4 @@ export const videos: { id: string title: string -}[] = [ - // temporary - { - id: "fA81OFu9BVY", - title: `Top 10 GraphQL Security Checks for Every Developer - Ankita Gupta, Ankush Jain - Akto.io`, - }, -] +}[] = [] diff --git a/src/app/conf/2025/components/become-a-sponsor/index.tsx b/src/app/conf/2025/components/become-a-sponsor/index.tsx index 09ed33dc7d..24f9142499 100644 --- a/src/app/conf/2025/components/become-a-sponsor/index.tsx +++ b/src/app/conf/2025/components/become-a-sponsor/index.tsx @@ -13,7 +13,7 @@ export function BecomeASponsor() {

Become a Sponsor

-

+

Connect with the global GraphQL community and showcase your brand to industry leaders and decision-makers.

@@ -75,10 +75,10 @@ function DefinitionListItem({ "flex border-b border-neu-300 last:border-b-0 max-sm:flex-col", )} > -
+
{term}
-
{definition}
+
{definition}
) } diff --git a/src/app/conf/2025/components/call-for-proposals.tsx b/src/app/conf/2025/components/call-for-proposals.tsx index a0fe219db6..7725b2001c 100644 --- a/src/app/conf/2025/components/call-for-proposals.tsx +++ b/src/app/conf/2025/components/call-for-proposals.tsx @@ -45,7 +45,7 @@ function DefinitionListItem({ definition: string }) { return ( -
+
{term}
@@ -112,6 +112,7 @@ function NotesTab() { Inclusive Speaker Orientation Course @@ -140,7 +141,7 @@ function NotesTab() { event. -

Preparing to Submit Your Proposal

+

Preparing to Submit Your Proposal

While it is not our intention to provide you with strict instructions on how to prepare your proposal, we hope you will take a moment to review @@ -161,7 +162,7 @@ function NotesTab() { letting you share your experiences, educate the community about an issue, or generate interest in a project.

-

How to Give a Great Talk

+

How to Give a Great Talk

We want to make sure submitters receive resources to help put together a great submission and if accepted, give the best presentation possible. @@ -171,12 +172,13 @@ function NotesTab() { href="https://youtu.be/2I5fYBLCfUA" target="_blank" className="typography-link dark:text-neu-50" + rel="noreferrer" > Getting Over Your Imposter Syndrome to Become a Conference Speaker .

-

+

Have More Questions? First Time Submitting? Don't Feel Intimidated

@@ -238,7 +240,7 @@ function ProcessTab() {

  • The new Subject Matter Experts initiative (SMEs)
  • The Program Committee
  • -

    The Technical Steering Committee

    +

    The Technical Steering Committee

    The TSC are a group of 11 individuals who are elected to serve a two year term to provide technical oversight of all GraphQL development @@ -252,7 +254,7 @@ function ProcessTab() {

  • Quality of Presentation
  • Importance
  • -

    Subject Matter Experts

    +

    Subject Matter Experts

    The SME initiative is new for 2025. This will be a panel of volunteers drawn from industry experts, working group members, security and @@ -266,7 +268,7 @@ function ProcessTab() {

  • Originality
  • Audience Engagement
  • -

    The Program Committee

    +

    The Program Committee

    The Program Committee is made up of representatives from the GraphQL Foundation board and interested members of the GraphQL community who @@ -276,7 +278,7 @@ function ProcessTab() { demographics, to ensure a varied and well-rounded representation of the GraphQL ecosystem.

    -

    +

    Have More Questions? First Time Submitting? Don't Feel Intimidated

    @@ -349,7 +351,7 @@ export function CallForProposals() { .

    -

    +

    Please be aware that the Linux Foundation uses Sessionize for CFP submissions. Sessionize is a cloud-based event content management software designed to be intuitive and user-friendly. If you need @@ -358,6 +360,7 @@ export function CallForProposals() { target="_blank" href="https://sessionize.com/playbook/submit-your-session-for-an-event" className="typography-link dark:text-neu-50" + rel="noreferrer" > how to submit your session {" "} @@ -443,7 +446,7 @@ function TabButton({ tabIndex={tabIndex} aria-selected={activeTab === tab} className={clsx( - "gql-focus-visible flex items-center justify-between px-3 py-4 typography-body-lg hover:bg-sec-light focus:outline-none max-lg:border-b max-lg:border-sec-dark max-lg:first:border-t lg:[--collapsible:1] lg:aria-selected:bg-sec-light", + "gql-focus-visible typography-body-lg flex items-center justify-between px-3 py-4 hover:bg-sec-light focus:outline-none max-lg:border-b max-lg:border-sec-dark max-lg:first:border-t lg:[--collapsible:1] lg:aria-selected:bg-sec-light", className, )} onFocus={() => { diff --git a/src/app/conf/2025/components/cta-card-section/index.tsx b/src/app/conf/2025/components/cta-card-section/index.tsx index 8dc44dc9c0..e690003db7 100644 --- a/src/app/conf/2025/components/cta-card-section/index.tsx +++ b/src/app/conf/2025/components/cta-card-section/index.tsx @@ -2,8 +2,9 @@ import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration" import logoMask from "./logo-mask.webp" -export interface CtaCardSectionProps extends React.HTMLAttributes { - title: string +export interface CtaCardSectionProps + extends Omit, "title"> { + title: React.ReactNode description: string children: React.ReactNode } @@ -23,10 +24,10 @@ export function CtaCardSection({ >

    -

    +

    {heading}

    -

    +

    {description}

    diff --git a/src/app/conf/2025/components/footer/index.tsx b/src/app/conf/2025/components/footer/index.tsx index dea6d2adb9..c2bd8fc3e1 100644 --- a/src/app/conf/2025/components/footer/index.tsx +++ b/src/app/conf/2025/components/footer/index.tsx @@ -21,11 +21,11 @@ export function Footer({ logo: ReactNode }) { return ( -