diff --git a/scripts/get-github-info/github-stats.json b/scripts/get-github-info/github-stats.json index 575c2e84fa..9f6b835af8 100644 --- a/scripts/get-github-info/github-stats.json +++ b/scripts/get-github-info/github-stats.json @@ -1,15 +1,15 @@ { "altair-graphql/altair": { "hasCommitsInLast3Months": false, - "stars": 5361, + "stars": 5365, "formattedStars": "5k", "license": "MIT License", "lastRelease": "2025-10-28T22:43:22Z", - "formattedLastRelease": "2 weeks ago" + "formattedLastRelease": "1 month ago" }, "apache/apisix": { "hasCommitsInLast3Months": false, - "stars": 15866, + "stars": 15907, "formattedStars": "16k", "license": "Apache License 2.0", "lastRelease": "2025-10-16T07:54:57Z", @@ -17,23 +17,23 @@ }, "apollographql/apollo-studio-community": { "hasCommitsInLast3Months": false, - "stars": 260, - "formattedStars": "260", + "stars": 261, + "formattedStars": "261", "license": "Unknown", "lastRelease": "", "formattedLastRelease": "" }, "ChilliCream/hotchocolate": { "hasCommitsInLast3Months": false, - "stars": 5621, + "stars": 5637, "formattedStars": "6k", "license": "MIT License", - "lastRelease": "2025-11-18T21:41:46Z", - "formattedLastRelease": "5 minutes ago" + "lastRelease": "2025-11-26T11:12:44Z", + "formattedLastRelease": "3 days ago" }, "dgraph-io/dgraph": { "hasCommitsInLast3Months": false, - "stars": 21350, + "stars": 21367, "formattedStars": "21k", "license": "Apache License 2.0", "lastRelease": "2025-10-07T20:50:36Z", @@ -41,7 +41,7 @@ }, "yahoo/elide": { "hasCommitsInLast3Months": false, - "stars": 1019, + "stars": 1020, "formattedStars": "1k", "license": "Other", "lastRelease": "2025-09-01T03:57:54Z", @@ -49,15 +49,15 @@ }, "graphapi-io/resources": { "hasCommitsInLast3Months": false, - "stars": 3, - "formattedStars": "3", + "stars": 4, + "formattedStars": "4", "license": "MIT License", "lastRelease": "", "formattedLastRelease": "" }, "hasura/graphql-engine": { "hasCommitsInLast3Months": false, - "stars": 31815, + "stars": 31827, "formattedStars": "32k", "license": "Apache License 2.0", "lastRelease": "2025-10-14T15:20:38Z", @@ -65,23 +65,23 @@ }, "graphql-hive/platform": { "hasCommitsInLast3Months": false, - "stars": 469, - "formattedStars": "469", + "stars": 471, + "formattedStars": "471", "license": "MIT License", - "lastRelease": "2025-11-18T10:07:16Z", - "formattedLastRelease": "11 hours ago" + "lastRelease": "2025-11-25T15:15:47Z", + "formattedLastRelease": "3 days ago" }, "Kong/insomnia": { "hasCommitsInLast3Months": false, - "stars": 37563, + "stars": 37611, "formattedStars": "38k", "license": "Apache License 2.0", - "lastRelease": "2025-11-14T09:22:34Z", - "formattedLastRelease": "4 days ago" + "lastRelease": "2025-11-21T17:29:45Z", + "formattedLastRelease": "1 week ago" }, "postmanlabs/postman-app-support": { "hasCommitsInLast3Months": false, - "stars": 5973, + "stars": 5979, "formattedStars": "6k", "license": "Unknown", "lastRelease": "", @@ -89,31 +89,31 @@ }, "stepzen-dev/examples": { "hasCommitsInLast3Months": false, - "stars": 46, - "formattedStars": "46", + "stars": 47, + "formattedStars": "47", "license": "MIT License", "lastRelease": "", "formattedLastRelease": "" }, "TykTechnologies/tyk": { "hasCommitsInLast3Months": false, - "stars": 10484, - "formattedStars": "10k", + "stars": 10515, + "formattedStars": "11k", "license": "Other", - "lastRelease": "2025-10-24T18:32:20Z", - "formattedLastRelease": "3 weeks ago" + "lastRelease": "2025-11-28T16:32:34Z", + "formattedLastRelease": "19 hours ago" }, "twinlogix/typetta": { "hasCommitsInLast3Months": false, - "stars": 114, - "formattedStars": "114", + "stars": 115, + "formattedStars": "115", "license": "Apache License 2.0", "lastRelease": "2023-10-16T07:50:50Z", "formattedLastRelease": "2 years ago" }, "webiny/webiny-js": { "hasCommitsInLast3Months": false, - "stars": 7890, + "stars": 7894, "formattedStars": "8k", "license": "Other", "lastRelease": "2025-09-16T08:29:00Z", @@ -121,28 +121,60 @@ }, "ballerina-platform/module-ballerina-graphql": { "hasCommitsInLast3Months": false, - "stars": 139, - "formattedStars": "139", + "stars": 138, + "formattedStars": "138", "license": "Apache License 2.0", "lastRelease": "2025-11-06T10:54:08Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "3 weeks ago" + }, + "oliyh/re-graph": { + "hasCommitsInLast3Months": false, + "stars": 464, + "formattedStars": "464", + "license": "Unknown", + "lastRelease": "2022-07-20T09:24:02Z", + "formattedLastRelease": "3 years ago" }, "microsoft/cppgraphqlgen": { "hasCommitsInLast3Months": false, - "stars": 344, - "formattedStars": "344", + "stars": 343, + "formattedStars": "343", "license": "MIT License", "lastRelease": "2024-12-10T17:25:31Z", "formattedLastRelease": "11 months ago" }, "graphql/libgraphqlparser": { "hasCommitsInLast3Months": false, - "stars": 1101, + "stars": 1102, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2017-10-16T21:47:42Z", "formattedLastRelease": "8 years ago" }, + "alumbra/alumbra": { + "hasCommitsInLast3Months": false, + "stars": 148, + "formattedStars": "148", + "license": "MIT License", + "lastRelease": "2017-06-12T12:14:25Z", + "formattedLastRelease": "8 years ago" + }, + "tendant/graphql-clj": { + "hasCommitsInLast3Months": false, + "stars": 285, + "formattedStars": "285", + "license": "Eclipse Public License 1.0", + "lastRelease": "", + "formattedLastRelease": "" + }, + "walmartlabs/lacinia": { + "hasCommitsInLast3Months": false, + "stars": 1843, + "formattedStars": "2k", + "license": "Other", + "lastRelease": "", + "formattedLastRelease": "" + }, "graphql-dotnet/graphql-client": { "hasCommitsInLast3Months": false, "stars": 644, @@ -165,7 +197,7 @@ "formattedStars": "8", "license": "MIT License", "lastRelease": "2025-11-14T07:39:17Z", - "formattedLastRelease": "4 days ago" + "formattedLastRelease": "2 weeks ago" }, "sahb1239/SAHB.GraphQLClient": { "hasCommitsInLast3Months": false, @@ -177,27 +209,27 @@ }, "byme8/ZeroQL": { "hasCommitsInLast3Months": false, - "stars": 312, - "formattedStars": "312", + "stars": 313, + "formattedStars": "313", "license": "MIT License", "lastRelease": "2025-10-14T11:58:44Z", "formattedLastRelease": "1 month ago" }, "EntityGraphQL/EntityGraphQL": { "hasCommitsInLast3Months": false, - "stars": 448, - "formattedStars": "448", + "stars": 449, + "formattedStars": "449", "license": "MIT License", "lastRelease": "2025-09-16T00:35:14Z", "formattedLastRelease": "2 months ago" }, "graphql-dotnet/graphql-dotnet": { "hasCommitsInLast3Months": false, - "stars": 5977, + "stars": 5975, "formattedStars": "6k", "license": "MIT License", "lastRelease": "2025-11-17T17:57:35Z", - "formattedLastRelease": "1 day ago" + "formattedLastRelease": "1 week ago" }, "chkimes/graphql-net": { "hasCommitsInLast3Months": false, @@ -215,38 +247,6 @@ "lastRelease": "", "formattedLastRelease": "" }, - "oliyh/re-graph": { - "hasCommitsInLast3Months": false, - "stars": 466, - "formattedStars": "466", - "license": "Unknown", - "lastRelease": "2022-07-20T09:24:02Z", - "formattedLastRelease": "3 years ago" - }, - "alumbra/alumbra": { - "hasCommitsInLast3Months": false, - "stars": 148, - "formattedStars": "148", - "license": "MIT License", - "lastRelease": "2017-06-12T12:14:25Z", - "formattedLastRelease": "8 years ago" - }, - "tendant/graphql-clj": { - "hasCommitsInLast3Months": false, - "stars": 285, - "formattedStars": "285", - "license": "Eclipse Public License 1.0", - "lastRelease": "", - "formattedLastRelease": "" - }, - "walmartlabs/lacinia": { - "hasCommitsInLast3Months": false, - "stars": 1844, - "formattedStars": "2k", - "license": "Other", - "lastRelease": "", - "formattedLastRelease": "" - }, "burner/graphqld": { "hasCommitsInLast3Months": false, "stars": 35, @@ -273,10 +273,10 @@ }, "absinthe-graphql/absinthe": { "hasCommitsInLast3Months": false, - "stars": 4369, + "stars": 4374, "formattedStars": "4k", "license": "Other", - "lastRelease": "2025-11-06T13:26:50Z", + "lastRelease": "2025-11-21T15:08:24Z", "formattedLastRelease": "1 week ago" }, "graphql-elixir/graphql": { @@ -313,15 +313,15 @@ }, "zino-app/graphql-flutter": { "hasCommitsInLast3Months": false, - "stars": 3269, + "stars": 3270, "formattedStars": "3k", "license": "MIT License", "lastRelease": "2025-10-21T16:42:55Z", - "formattedLastRelease": "4 weeks ago" + "formattedLastRelease": "1 month ago" }, "Khan/genqlient": { "hasCommitsInLast3Months": false, - "stars": 1265, + "stars": 1266, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-05-18T19:09:08Z", @@ -329,15 +329,15 @@ }, "hasura/go-graphql-client": { "hasCommitsInLast3Months": false, - "stars": 455, - "formattedStars": "455", + "stars": 459, + "formattedStars": "459", "license": "MIT License", "lastRelease": "2025-11-05T06:45:53Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "3 weeks ago" }, "shurcooL/graphql": { "hasCommitsInLast3Months": false, - "stars": 727, + "stars": 728, "formattedStars": "1k", "license": "MIT License", "lastRelease": "", @@ -345,7 +345,7 @@ }, "machinebox/graphql": { "hasCommitsInLast3Months": false, - "stars": 960, + "stars": 961, "formattedStars": "1k", "license": "Apache License 2.0", "lastRelease": "2018-05-31T14:28:32Z", @@ -353,11 +353,11 @@ }, "99designs/gqlgen": { "hasCommitsInLast3Months": false, - "stars": 10583, + "stars": 10593, "formattedStars": "11k", "license": "MIT License", - "lastRelease": "2025-11-11T02:05:44Z", - "formattedLastRelease": "1 week ago" + "lastRelease": "2025-11-24T16:56:20Z", + "formattedLastRelease": "4 days ago" }, "andrewwphillips/eggql": { "hasCommitsInLast3Months": false, @@ -377,7 +377,7 @@ }, "graph-gophers/graphql-go": { "hasCommitsInLast3Months": false, - "stars": 4739, + "stars": 4741, "formattedStars": "5k", "license": "BSD 2-Clause \"Simplified\" License", "lastRelease": "2025-09-09T11:37:07Z", @@ -385,7 +385,7 @@ }, "graphql-go/graphql": { "hasCommitsInLast3Months": false, - "stars": 10129, + "stars": 10132, "formattedStars": "10k", "license": "MIT License", "lastRelease": "2023-04-10T18:20:23Z", @@ -412,16 +412,16 @@ "stars": 790, "formattedStars": "1k", "license": "MIT License", - "lastRelease": "2025-11-17T08:37:55Z", - "formattedLastRelease": "1 day ago" + "lastRelease": "2025-11-21T21:18:20Z", + "formattedLastRelease": "1 week ago" }, "dosco/graphjin": { "hasCommitsInLast3Months": false, - "stars": 3002, + "stars": 3011, "formattedStars": "3k", "license": "Apache License 2.0", "lastRelease": "2025-11-05T07:51:12Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "3 weeks ago" }, "grails/gorm-graphql": { "hasCommitsInLast3Months": false, @@ -463,117 +463,21 @@ "lastRelease": "2021-01-11T11:19:38Z", "formattedLastRelease": "4 years ago" }, - "apollographql/apollo-kotlin": { - "hasCommitsInLast3Months": false, - "stars": 3927, - "formattedStars": "4k", - "license": "MIT License", - "lastRelease": "2025-11-13T17:33:51Z", - "formattedLastRelease": "5 days ago" - }, - "ExpediaGroup/graphql-kotlin": { - "hasCommitsInLast3Months": false, - "stars": 1795, - "formattedStars": "2k", - "license": "Apache License 2.0", - "lastRelease": "2025-06-16T17:02:18Z", - "formattedLastRelease": "5 months ago" - }, - "americanexpress/nodes": { - "hasCommitsInLast3Months": false, - "stars": 307, - "formattedStars": "307", - "license": "Apache License 2.0", - "lastRelease": "2019-07-13T22:47:01Z", - "formattedLastRelease": "6 years ago" - }, - "graphql-calculator/graphql-calculator": { - "hasCommitsInLast3Months": false, - "stars": 112, - "formattedStars": "112", - "license": "Apache License 2.0", - "lastRelease": "2021-09-03T01:56:25Z", - "formattedLastRelease": "4 years ago" - }, - "graphql-java-kickstart/graphql-spring-boot": { - "hasCommitsInLast3Months": false, - "stars": 1513, - "formattedStars": "2k", - "license": "MIT License", - "lastRelease": "2023-12-07T11:07:47Z", - "formattedLastRelease": "1 year ago" - }, - "graphql-java/graphql-java": { - "hasCommitsInLast3Months": false, - "stars": 6226, - "formattedStars": "6k", - "license": "MIT License", - "lastRelease": "2025-11-10T01:21:35Z", - "formattedLastRelease": "1 week ago" - }, - "babyfish-ct/jimmer": { - "hasCommitsInLast3Months": false, - "stars": 1552, - "formattedStars": "2k", - "license": "Apache License 2.0", - "lastRelease": "2025-11-17T08:58:28Z", - "formattedLastRelease": "1 day ago" - }, - "aPureBase/KGraphQL": { - "hasCommitsInLast3Months": false, - "stars": 308, - "formattedStars": "308", - "license": "MIT License", - "lastRelease": "2023-01-27T10:09:55Z", - "formattedLastRelease": "2 years ago" - }, - "eclipse/microprofile-graphql": { - "hasCommitsInLast3Months": false, - "stars": 101, - "formattedStars": "101", - "license": "Apache License 2.0", - "lastRelease": "2022-03-21T18:26:51Z", - "formattedLastRelease": "3 years ago" - }, - "netflix/dgs-framework": { - "hasCommitsInLast3Months": false, - "stars": 3275, - "formattedStars": "3k", - "license": "Apache License 2.0", - "lastRelease": "2025-11-08T16:22:51Z", - "formattedLastRelease": "1 week ago" - }, - "spring-projects/spring-graphql": { - "hasCommitsInLast3Months": false, - "stars": 1578, - "formattedStars": "2k", - "license": "Apache License 2.0", - "lastRelease": "2025-11-18T10:05:26Z", - "formattedLastRelease": "11 hours ago" - }, - "graphql-java-generator/graphql-gradle-plugin-project": { - "hasCommitsInLast3Months": false, - "stars": 57, - "formattedStars": "57", - "license": "MIT License", - "lastRelease": "", - "formattedLastRelease": "" - }, "apollographql/apollo-client": { "hasCommitsInLast3Months": false, - "stars": 19672, + "stars": 19673, "formattedStars": "20k", "license": "MIT License", - "lastRelease": "2025-11-17T21:21:55Z", - "formattedLastRelease": "1 day ago" + "lastRelease": "2025-11-19T01:20:25Z", + "formattedLastRelease": "1 week ago" }, "aws-amplify/amplify-js": { "hasCommitsInLast3Months": false, - "stars": 9565, + "stars": 9567, "formattedStars": "10k", "license": "Apache License 2.0", "lastRelease": "2025-11-06T13:36:19Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "3 weeks ago" }, "Houfeng/gq-loader": { "hasCommitsInLast3Months": false, @@ -585,11 +489,11 @@ }, "gqty-dev/gqty": { "hasCommitsInLast3Months": false, - "stars": 1031, + "stars": 1030, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-10-26T19:29:38Z", - "formattedLastRelease": "3 weeks ago" + "formattedLastRelease": "1 month ago" }, "grafoojs/grafoo": { "hasCommitsInLast3Months": false, @@ -609,7 +513,7 @@ }, "nearform/graphql-hooks": { "hasCommitsInLast3Months": false, - "stars": 1888, + "stars": 1889, "formattedStars": "2k", "license": "Other", "lastRelease": "2025-01-08T18:45:52Z", @@ -625,11 +529,11 @@ }, "jasonkuhrt/graphql-request": { "hasCommitsInLast3Months": false, - "stars": 6075, + "stars": 6081, "formattedStars": "6k", "license": "MIT License", - "lastRelease": "2020-05-29T13:00:56Z", - "formattedLastRelease": "5 years ago" + "lastRelease": "2025-11-25T16:55:56Z", + "formattedLastRelease": "3 days ago" }, "enisdenjo/graphql-sse": { "hasCommitsInLast3Months": false, @@ -637,7 +541,7 @@ "formattedStars": "435", "license": "MIT License", "lastRelease": "2025-10-22T16:19:40Z", - "formattedLastRelease": "3 weeks ago" + "formattedLastRelease": "1 month ago" }, "babyfish-ct/graphql-ts-client": { "hasCommitsInLast3Months": false, @@ -649,7 +553,7 @@ }, "enisdenjo/graphql-ws": { "hasCommitsInLast3Months": false, - "stars": 1842, + "stars": 1843, "formattedStars": "2k", "license": "MIT License", "lastRelease": "2025-07-14T12:15:37Z", @@ -681,7 +585,7 @@ }, "facebook/relay": { "hasCommitsInLast3Months": false, - "stars": 18887, + "stars": 18893, "formattedStars": "19k", "license": "MIT License", "lastRelease": "2025-08-06T23:45:00Z", @@ -689,56 +593,56 @@ }, "FormidableLabs/urql": { "hasCommitsInLast3Months": false, - "stars": 8893, + "stars": 8900, "formattedStars": "9k", "license": "MIT License", "lastRelease": "2025-08-29T08:06:41Z", - "formattedLastRelease": "2 months ago" + "formattedLastRelease": "3 months ago" }, "apollographql/apollo-server": { "hasCommitsInLast3Months": false, - "stars": 13924, + "stars": 13926, "formattedStars": "14k", "license": "MIT License", - "lastRelease": "2025-10-28T15:47:16Z", - "formattedLastRelease": "3 weeks ago" + "lastRelease": "2025-11-21T23:19:03Z", + "formattedLastRelease": "1 week ago" }, "graphql/graphql-js": { "hasCommitsInLast3Months": false, - "stars": 20270, + "stars": 20279, "formattedStars": "20k", "license": "MIT License", "lastRelease": "2025-11-01T14:18:53Z", - "formattedLastRelease": "2 weeks ago" + "formattedLastRelease": "3 weeks ago" }, "dotansimha/graphql-yoga": { "hasCommitsInLast3Months": false, - "stars": 8452, + "stars": 8455, "formattedStars": "8k", "license": "MIT License", - "lastRelease": "2025-11-07T02:09:51Z", - "formattedLastRelease": "1 week ago" + "lastRelease": "2025-11-28T11:05:21Z", + "formattedLastRelease": "1 day ago" }, "mercurius-js/mercurius": { "hasCommitsInLast3Months": false, - "stars": 2456, + "stars": 2462, "formattedStars": "2k", "license": "MIT License", "lastRelease": "2025-11-13T14:12:18Z", - "formattedLastRelease": "5 days ago" + "formattedLastRelease": "2 weeks ago" }, "getcronit/pylon": { "hasCommitsInLast3Months": false, - "stars": 343, - "formattedStars": "343", + "stars": 345, + "formattedStars": "345", "license": "Apache License 2.0", "lastRelease": "2025-10-01T08:35:15Z", "formattedLastRelease": "1 month ago" }, "networkimprov/brangr": { "hasCommitsInLast3Months": false, - "stars": 5, - "formattedStars": "5", + "stars": 6, + "formattedStars": "6", "license": "Mozilla Public License 2.0", "lastRelease": "2023-06-02T09:20:18Z", "formattedLastRelease": "2 years ago" @@ -749,15 +653,15 @@ "formattedStars": "3k", "license": "ISC License", "lastRelease": "2025-11-10T01:29:18Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "2 weeks ago" }, "graphql/graphiql": { "hasCommitsInLast3Months": false, - "stars": 16706, + "stars": 16715, "formattedStars": "17k", "license": "MIT License", "lastRelease": "2025-11-01T22:30:04Z", - "formattedLastRelease": "2 weeks ago" + "formattedLastRelease": "3 weeks ago" }, "Urigo/graphql-cli": { "hasCommitsInLast3Months": false, @@ -769,35 +673,35 @@ }, "dotansimha/graphql-code-generator": { "hasCommitsInLast3Months": false, - "stars": 11175, + "stars": 11179, "formattedStars": "11k", "license": "MIT License", - "lastRelease": "2025-11-13T15:19:33Z", - "formattedLastRelease": "5 days ago" + "lastRelease": "2025-11-29T04:07:19Z", + "formattedLastRelease": "7 hours ago" }, "kamilkisiela/graphql-config": { "hasCommitsInLast3Months": false, - "stars": 1194, + "stars": 1195, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-04-28T15:15:29Z", - "formattedLastRelease": "6 months ago" + "formattedLastRelease": "7 months ago" }, "dimaMachina/graphql-eslint/": { "hasCommitsInLast3Months": false, - "stars": 830, + "stars": 831, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-03-26T14:11:23Z", - "formattedLastRelease": "7 months ago" + "formattedLastRelease": "8 months ago" }, "kamilkisiela/graphql-inspector": { "hasCommitsInLast3Months": false, - "stars": 1727, + "stars": 1725, "formattedStars": "2k", "license": "MIT License", "lastRelease": "2025-11-15T02:42:13Z", - "formattedLastRelease": "3 days ago" + "formattedLastRelease": "2 weeks ago" }, "graphql/graphql-language-service": { "hasCommitsInLast3Months": false, @@ -809,18 +713,18 @@ }, "n1ru4l/graphql-live-query": { "hasCommitsInLast3Months": false, - "stars": 439, - "formattedStars": "439", + "stars": 440, + "formattedStars": "440", "license": "MIT License", "lastRelease": "2022-07-29T09:27:53Z", "formattedLastRelease": "3 years ago" }, "Urigo/graphql-mesh": { "hasCommitsInLast3Months": false, - "stars": 3459, + "stars": 3463, "formattedStars": "3k", "license": "MIT License", - "lastRelease": "2025-11-07T23:26:14Z", + "lastRelease": "2025-11-19T12:12:00Z", "formattedLastRelease": "1 week ago" }, "maticzav/graphql-middleware": { @@ -833,15 +737,15 @@ }, "Urigo/graphql-modules": { "hasCommitsInLast3Months": false, - "stars": 1328, + "stars": 1326, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-02-19T10:43:37Z", - "formattedLastRelease": "8 months ago" + "formattedLastRelease": "9 months ago" }, "Urigo/graphql-scalars": { "hasCommitsInLast3Months": false, - "stars": 1925, + "stars": 1927, "formattedStars": "2k", "license": "MIT License", "lastRelease": "2025-10-14T23:00:24Z", @@ -849,19 +753,19 @@ }, "maticzav/graphql-shield": { "hasCommitsInLast3Months": false, - "stars": 3573, + "stars": 3574, "formattedStars": "4k", "license": "MIT License", "lastRelease": "2022-11-22T19:08:37Z", - "formattedLastRelease": "2 years ago" + "formattedLastRelease": "3 years ago" }, "ardatan/graphql-tools": { "hasCommitsInLast3Months": false, - "stars": 5420, + "stars": 5418, "formattedStars": "5k", "license": "MIT License", - "lastRelease": "2025-11-12T10:07:43Z", - "formattedLastRelease": "6 days ago" + "lastRelease": "2025-11-28T10:05:14Z", + "formattedLastRelease": "1 day ago" }, "anvilco/graphql-introspection-tools": { "hasCommitsInLast3Months": false, @@ -873,7 +777,7 @@ }, "graphile/postgraphile": { "hasCommitsInLast3Months": false, - "stars": 12852, + "stars": 12858, "formattedStars": "13k", "license": "Other", "lastRelease": "2023-10-05T16:27:00Z", @@ -889,7 +793,7 @@ }, "anvilco/spectaql": { "hasCommitsInLast3Months": false, - "stars": 1203, + "stars": 1205, "formattedStars": "1k", "license": "MIT License", "lastRelease": "", @@ -929,7 +833,7 @@ }, "api-platform/api-platform": { "hasCommitsInLast3Months": false, - "stars": 9045, + "stars": 9054, "formattedStars": "9k", "license": "MIT License", "lastRelease": "2025-03-11T16:15:41Z", @@ -940,8 +844,8 @@ "stars": 376, "formattedStars": "376", "license": "GNU General Public License v2.0", - "lastRelease": "2025-10-17T15:10:13Z", - "formattedLastRelease": "1 month ago" + "lastRelease": "2025-11-26T08:29:30Z", + "formattedLastRelease": "3 days ago" }, "infinityloop-dev/graphpinator": { "hasCommitsInLast3Months": false, @@ -949,7 +853,7 @@ "formattedStars": "45", "license": "MIT License", "lastRelease": "2025-06-26T12:08:01Z", - "formattedLastRelease": "4 months ago" + "formattedLastRelease": "5 months ago" }, "jerowork/graphql-attribute-schema": { "hasCommitsInLast3Months": false, @@ -961,11 +865,11 @@ }, "webonyx/graphql-php": { "hasCommitsInLast3Months": false, - "stars": 4700, + "stars": 4702, "formattedStars": "5k", "license": "MIT License", - "lastRelease": "2025-10-25T09:34:10Z", - "formattedLastRelease": "3 weeks ago" + "lastRelease": "2025-11-20T11:51:16Z", + "formattedLastRelease": "1 week ago" }, "ivome/graphql-relay-php": { "hasCommitsInLast3Months": false, @@ -977,15 +881,15 @@ }, "overblog/GraphQLBundle": { "hasCommitsInLast3Months": false, - "stars": 791, + "stars": 792, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-10-31T08:00:22Z", - "formattedLastRelease": "2 weeks ago" + "formattedLastRelease": "4 weeks ago" }, "thecodingmachine/graphqlite": { "hasCommitsInLast3Months": false, - "stars": 564, + "stars": 565, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-09-04T16:39:26Z", @@ -993,7 +897,7 @@ }, "nuwave/lighthouse": { "hasCommitsInLast3Months": false, - "stars": 3462, + "stars": 3465, "formattedStars": "3k", "license": "MIT License", "lastRelease": "2025-09-11T08:07:50Z", @@ -1017,7 +921,7 @@ }, "leocavalcante/siler": { "hasCommitsInLast3Months": false, - "stars": 1114, + "stars": 1113, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2021-01-27T19:41:57Z", @@ -1028,20 +932,20 @@ "stars": 3759, "formattedStars": "4k", "license": "GNU General Public License v3.0", - "lastRelease": "2025-10-30T16:56:08Z", - "formattedLastRelease": "2 weeks ago" + "lastRelease": "2025-11-24T22:39:55Z", + "formattedLastRelease": "4 days ago" }, "mirumee/ariadne-codegen": { "hasCommitsInLast3Months": false, - "stars": 361, - "formattedStars": "361", + "stars": 368, + "formattedStars": "368", "license": "BSD 3-Clause \"New\" or \"Revised\" License", "lastRelease": "2025-10-13T06:38:02Z", "formattedLastRelease": "1 month ago" }, "graphql-python/gql": { "hasCommitsInLast3Months": false, - "stars": 1649, + "stars": 1653, "formattedStars": "2k", "license": "MIT License", "lastRelease": "2025-09-05T14:22:54Z", @@ -1057,8 +961,8 @@ }, "prisma-labs/python-graphql-client": { "hasCommitsInLast3Months": false, - "stars": 157, - "formattedStars": "157", + "stars": 156, + "formattedStars": "156", "license": "MIT License", "lastRelease": "", "formattedLastRelease": "" @@ -1089,7 +993,7 @@ }, "mirumee/ariadne": { "hasCommitsInLast3Months": false, - "stars": 2307, + "stars": 2309, "formattedStars": "2k", "license": "BSD 3-Clause \"New\" or \"Revised\" License", "lastRelease": "2025-04-18T08:27:47Z", @@ -1113,7 +1017,7 @@ }, "graphql-python/graphene": { "hasCommitsInLast3Months": false, - "stars": 8238, + "stars": 8239, "formattedStars": "8k", "license": "MIT License", "lastRelease": "2024-11-09T20:43:58Z", @@ -1121,11 +1025,11 @@ }, "strawberry-graphql/strawberry": { "hasCommitsInLast3Months": false, - "stars": 4467, - "formattedStars": "4k", + "stars": 4569, + "formattedStars": "5k", "license": "MIT License", - "lastRelease": "2025-11-18T18:05:57Z", - "formattedLastRelease": "3 hours ago" + "lastRelease": "2025-11-22T13:00:06Z", + "formattedLastRelease": "6 days ago" }, "tartiflette/tartiflette": { "hasCommitsInLast3Months": false, @@ -1135,6 +1039,102 @@ "lastRelease": "2021-11-15T11:05:03Z", "formattedLastRelease": "4 years ago" }, + "apollographql/apollo-kotlin": { + "hasCommitsInLast3Months": false, + "stars": 3929, + "formattedStars": "4k", + "license": "MIT License", + "lastRelease": "2025-11-13T17:33:51Z", + "formattedLastRelease": "2 weeks ago" + }, + "ExpediaGroup/graphql-kotlin": { + "hasCommitsInLast3Months": false, + "stars": 1795, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-06-16T17:02:18Z", + "formattedLastRelease": "5 months ago" + }, + "americanexpress/nodes": { + "hasCommitsInLast3Months": false, + "stars": 307, + "formattedStars": "307", + "license": "Apache License 2.0", + "lastRelease": "2019-07-13T22:47:01Z", + "formattedLastRelease": "6 years ago" + }, + "graphql-calculator/graphql-calculator": { + "hasCommitsInLast3Months": false, + "stars": 112, + "formattedStars": "112", + "license": "Apache License 2.0", + "lastRelease": "2021-09-03T01:56:25Z", + "formattedLastRelease": "4 years ago" + }, + "graphql-java-kickstart/graphql-spring-boot": { + "hasCommitsInLast3Months": false, + "stars": 1513, + "formattedStars": "2k", + "license": "MIT License", + "lastRelease": "2023-12-07T11:07:47Z", + "formattedLastRelease": "1 year ago" + }, + "graphql-java/graphql-java": { + "hasCommitsInLast3Months": false, + "stars": 6226, + "formattedStars": "6k", + "license": "MIT License", + "lastRelease": "2025-11-10T01:21:35Z", + "formattedLastRelease": "2 weeks ago" + }, + "babyfish-ct/jimmer": { + "hasCommitsInLast3Months": false, + "stars": 1565, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-11-26T13:05:27Z", + "formattedLastRelease": "2 days ago" + }, + "aPureBase/KGraphQL": { + "hasCommitsInLast3Months": false, + "stars": 308, + "formattedStars": "308", + "license": "MIT License", + "lastRelease": "2023-01-27T10:09:55Z", + "formattedLastRelease": "2 years ago" + }, + "eclipse/microprofile-graphql": { + "hasCommitsInLast3Months": false, + "stars": 101, + "formattedStars": "101", + "license": "Apache License 2.0", + "lastRelease": "2022-03-21T18:26:51Z", + "formattedLastRelease": "3 years ago" + }, + "netflix/dgs-framework": { + "hasCommitsInLast3Months": false, + "stars": 3280, + "formattedStars": "3k", + "license": "Apache License 2.0", + "lastRelease": "2025-11-24T21:04:55Z", + "formattedLastRelease": "4 days ago" + }, + "spring-projects/spring-graphql": { + "hasCommitsInLast3Months": false, + "stars": 1578, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-11-18T10:05:26Z", + "formattedLastRelease": "1 week ago" + }, + "graphql-java-generator/graphql-gradle-plugin-project": { + "hasCommitsInLast3Months": false, + "stars": 57, + "formattedStars": "57", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, "ropensci/ghql": { "hasCommitsInLast3Months": false, "stars": 149, @@ -1149,7 +1149,7 @@ "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-09-24T22:20:23Z", - "formattedLastRelease": "1 month ago" + "formattedLastRelease": "2 months ago" }, "rmosolgo/graphql-ruby": { "hasCommitsInLast3Months": false, @@ -1165,15 +1165,15 @@ "formattedStars": "187", "license": "MIT License", "lastRelease": "2025-08-25T17:53:38Z", - "formattedLastRelease": "2 months ago" + "formattedLastRelease": "3 months ago" }, "obmarg/cynic": { "hasCommitsInLast3Months": false, - "stars": 440, - "formattedStars": "440", + "stars": 442, + "formattedStars": "442", "license": "Mozilla Public License 2.0", "lastRelease": "2025-08-19T19:37:22Z", - "formattedLastRelease": "2 months ago" + "formattedLastRelease": "3 months ago" }, "arthurkhlghatyan/gql-client-rs": { "hasCommitsInLast3Months": false, @@ -1183,17 +1183,9 @@ "lastRelease": "2025-06-07T14:31:10Z", "formattedLastRelease": "5 months ago" }, - "ghostdogpr/caliban": { - "hasCommitsInLast3Months": false, - "stars": 975, - "formattedStars": "1k", - "license": "Apache License 2.0", - "lastRelease": "2025-07-14T00:24:20Z", - "formattedLastRelease": "4 months ago" - }, "async-graphql/async-graphql": { "hasCommitsInLast3Months": false, - "stars": 3588, + "stars": 3594, "formattedStars": "4k", "license": "Apache License 2.0", "lastRelease": "", @@ -1207,13 +1199,13 @@ "lastRelease": "2025-09-08T23:23:40Z", "formattedLastRelease": "2 months ago" }, - "apollographql/router": { + "ghostdogpr/caliban": { "hasCommitsInLast3Months": false, - "stars": 938, + "stars": 976, "formattedStars": "1k", - "license": "Other", - "lastRelease": "2025-11-11T14:49:10Z", - "formattedLastRelease": "1 week ago" + "license": "Apache License 2.0", + "lastRelease": "2025-07-14T00:24:20Z", + "formattedLastRelease": "4 months ago" }, "sangria-graphql/sangria": { "hasCommitsInLast3Months": false, @@ -1221,71 +1213,15 @@ "formattedStars": "2k", "license": "Apache License 2.0", "lastRelease": "2025-10-20T11:40:30Z", - "formattedLastRelease": "4 weeks ago" - }, - "eerimoq/gqt": { - "hasCommitsInLast3Months": false, - "stars": 470, - "formattedStars": "470", - "license": "MIT License", - "lastRelease": "", - "formattedLastRelease": "" - }, - "Escape-Technologies/graphql-armor": { - "hasCommitsInLast3Months": false, - "stars": 553, - "formattedStars": "1k", - "license": "MIT License", - "lastRelease": "2025-08-22T13:32:40Z", - "formattedLastRelease": "2 months ago" - }, - "ldebruijn/graphql-protect": { - "hasCommitsInLast3Months": false, - "stars": 34, - "formattedStars": "34", - "license": "MIT License", - "lastRelease": "2025-09-09T20:03:39Z", - "formattedLastRelease": "2 months ago" - }, - "graphql-hive/gateway": { - "hasCommitsInLast3Months": false, - "stars": 68, - "formattedStars": "68", - "license": "MIT License", - "lastRelease": "2025-11-11T14:50:09Z", - "formattedLastRelease": "1 week ago" - }, - "microcks/microcks": { - "hasCommitsInLast3Months": false, - "stars": 1746, - "formattedStars": "2k", - "license": "Apache License 2.0", - "lastRelease": "2025-10-25T15:08:00Z", - "formattedLastRelease": "3 weeks ago" - }, - "glideapps/quicktype": { - "hasCommitsInLast3Months": false, - "stars": 13438, - "formattedStars": "13k", - "license": "Apache License 2.0", - "lastRelease": "", - "formattedLastRelease": "" - }, - "schemathesis/schemathesis": { - "hasCommitsInLast3Months": false, - "stars": 2852, - "formattedStars": "3k", - "license": "MIT License", - "lastRelease": "2025-11-18T17:07:09Z", - "formattedLastRelease": "4 hours ago" + "formattedLastRelease": "1 month ago" }, "apollographql/apollo-ios": { "hasCommitsInLast3Months": false, - "stars": 4008, + "stars": 4011, "formattedStars": "4k", "license": "MIT License", "lastRelease": "2025-11-05T23:30:57Z", - "formattedLastRelease": "1 week ago" + "formattedLastRelease": "3 weeks ago" }, "nerdsupremacist/Graphaello": { "hasCommitsInLast3Months": false, @@ -1305,7 +1241,7 @@ }, "maticzav/swift-graphql": { "hasCommitsInLast3Months": false, - "stars": 621, + "stars": 622, "formattedStars": "1k", "license": "MIT License", "lastRelease": "2024-05-06T20:00:06Z", @@ -1317,7 +1253,7 @@ "formattedStars": "1k", "license": "MIT License", "lastRelease": "2025-08-21T19:30:20Z", - "formattedLastRelease": "2 months ago" + "formattedLastRelease": "3 months ago" }, "nerdsupremacist/GraphZahl": { "hasCommitsInLast3Months": false, @@ -1327,12 +1263,76 @@ "lastRelease": "2021-05-17T12:51:10Z", "formattedLastRelease": "4 years ago" }, + "apollographql/router": { + "hasCommitsInLast3Months": false, + "stars": 939, + "formattedStars": "1k", + "license": "Other", + "lastRelease": "2025-11-28T17:47:44Z", + "formattedLastRelease": "18 hours ago" + }, + "Escape-Technologies/graphql-armor": { + "hasCommitsInLast3Months": false, + "stars": 558, + "formattedStars": "1k", + "license": "MIT License", + "lastRelease": "2025-08-22T13:32:40Z", + "formattedLastRelease": "3 months ago" + }, + "eerimoq/gqt": { + "hasCommitsInLast3Months": false, + "stars": 470, + "formattedStars": "470", + "license": "MIT License", + "lastRelease": "", + "formattedLastRelease": "" + }, + "ldebruijn/graphql-protect": { + "hasCommitsInLast3Months": false, + "stars": 34, + "formattedStars": "34", + "license": "MIT License", + "lastRelease": "2025-11-25T14:27:46Z", + "formattedLastRelease": "3 days ago" + }, + "graphql-hive/gateway": { + "hasCommitsInLast3Months": false, + "stars": 69, + "formattedStars": "69", + "license": "MIT License", + "lastRelease": "2025-11-24T15:40:17Z", + "formattedLastRelease": "4 days ago" + }, + "microcks/microcks": { + "hasCommitsInLast3Months": false, + "stars": 1754, + "formattedStars": "2k", + "license": "Apache License 2.0", + "lastRelease": "2025-10-25T15:08:00Z", + "formattedLastRelease": "1 month ago" + }, + "schemathesis/schemathesis": { + "hasCommitsInLast3Months": false, + "stars": 2871, + "formattedStars": "3k", + "license": "MIT License", + "lastRelease": "2025-11-28T16:13:29Z", + "formattedLastRelease": "19 hours ago" + }, + "glideapps/quicktype": { + "hasCommitsInLast3Months": false, + "stars": 13464, + "formattedStars": "13k", + "license": "Apache License 2.0", + "lastRelease": "", + "formattedLastRelease": "" + }, "wundergraph/cosmo": { "hasCommitsInLast3Months": false, - "stars": 1115, + "stars": 1120, "formattedStars": "1k", "license": "Apache License 2.0", - "lastRelease": "2025-11-17T21:18:03Z", + "lastRelease": "2025-11-27T13:47:56Z", "formattedLastRelease": "1 day ago" } } \ No newline at end of file diff --git a/scripts/get-github-info/last-success.isodate b/scripts/get-github-info/last-success.isodate index 27b775b3c9..817c2fe4de 100644 --- a/scripts/get-github-info/last-success.isodate +++ b/scripts/get-github-info/last-success.isodate @@ -1 +1 @@ -2025-11-18T21:48:50.765Z \ No newline at end of file +2025-11-29T12:04:08.519Z \ No newline at end of file diff --git a/scripts/sync-working-groups/working-group-events.ndjson b/scripts/sync-working-groups/working-group-events.ndjson index cfbbde9d70..012d82306e 100644 --- a/scripts/sync-working-groups/working-group-events.ndjson +++ b/scripts/sync-working-groups/working-group-events.ndjson @@ -31,3 +31,7 @@ {"kind":"calendar#event","etag":"\"3516415120288286\"","id":"h9erafl4rc1jjor9i6akokm5ec_20251218T160000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=aDllcmFmbDRyYzFqam9yOWk2YWtva201ZWNfMjAyNTEyMThUMTYwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2023-12-08T21:32:03.000Z","updated":"2025-09-18T14:59:20.144Z","summary":"GraphQL Governing Board Meeting","creator":{"email":"jburson@linuxfoundation.org"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-18T11:00:00-05:00","end":"2025-12-18T12:00:00-05:00","recurringEventId":"h9erafl4rc1jjor9i6akokm5ec","originalStartTime":{"dateTime":"2025-12-18T11:00:00-05:00","timeZone":"America/New_York"},"iCalUID":"h9erafl4rc1jjor9i6akokm5ec@google.com","sequence":3,"eventType":"default"} {"kind":"calendar#event","etag":"\"3462003372886000\"","id":"kkc5tt01ovrjv8fki1lo31g5hj_20251218T170000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=a2tjNXR0MDFvdnJqdjhma2kxbG8zMWc1aGpfMjAyNTEyMThUMTcwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2024-01-12T09:55:37.000Z","updated":"2024-11-07T17:48:06.443Z","summary":"Composite schemas WG - Weekly 3","description":"The weekly \"secondary\" meeting of the composite schemas WG: https://github.com/graphql/composite-schemas-wg

Meeting password is \"composite\"

Live notes are at https://docs.google.com/document/d/1hJO6U7daYvcNcQ3FBKnh3v4R256ers6M8IGyqRpY_kE/edit?usp=sharing","location":"https://zoom.us/j/91078840351","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-18T12:00:00-05:00","end":"2025-12-18T13:00:00-05:00","recurringEventId":"kkc5tt01ovrjv8fki1lo31g5hj","originalStartTime":{"dateTime":"2025-12-18T12:00:00-05:00","timeZone":"Europe/Berlin"},"iCalUID":"kkc5tt01ovrjv8fki1lo31g5hj@google.com","sequence":1,"eventType":"default"} {"kind":"calendar#event","etag":"\"3500694996844990\"","id":"2ffd8o32sh77kd3mtccrtg887n_20251218T183000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=MmZmZDhvMzJzaDc3a2QzbXRjY3J0Zzg4N25fMjAyNTEyMThUMTgzMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2025-05-01T19:23:48.000Z","updated":"2025-06-19T15:38:18.422Z","summary":"GraphQL WG - Secondary (EU)","description":"Zoom password: graphqlwg","location":"https://zoom.us/j/593263740","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-18T13:30:00-05:00","end":"2025-12-18T15:00:00-05:00","recurringEventId":"2ffd8o32sh77kd3mtccrtg887n","originalStartTime":{"dateTime":"2025-12-18T13:30:00-05:00","timeZone":"America/Los_Angeles"},"iCalUID":"2ffd8o32sh77kd3mtccrtg887n@google.com","sequence":0,"eventType":"default"} +{"kind":"calendar#event","etag":"\"3517067971709790\"","id":"f7cvs5ala9jtt147l3mik2mlvl_20251222T160000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=ZjdjdnM1YWxhOWp0dDE0N2wzbWlrMm1sdmxfMjAyNTEyMjJUMTYwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2024-01-29T15:14:17.000Z","updated":"2025-09-22T09:39:45.854Z","summary":"Conference & Community Committee Meeting - Fortnightly Recurring","description":"\nYou have been invited to a recurring meeting for GraphQL Foundation\n\nWeekly Sync and Coordination Meeting for Conference Committee participants. Notes Document: https://docs.google.com/document/d/19-alP5jywnXzgN_1zYLBTRWh-4CaXzGakEZdTBFwNAc/edit\n\nWays to join meeting:\n\n1. Join from PC, Mac, iPad, or Android\n\nhttps://zoom-lfx.platform.linuxfoundation.org/meeting/96286151238?password=ff267735-efbd-4be4-a89c-b927b596190a\n\n2. Join via audio\n\nOne tap mobile:\nUS: +12532158782,,96286151238# or +13462487799,,96286151238\n\nOr dial:\nUS: +1 253 215 8782 or +1 346 248 7799 or +1 669 900 6833 or +1 301 715 8592 or +1 312 626 6799 or +1 646 374 8656 or 877 369 0926 (Toll Free) or 855 880 1246 (Toll Free)\nCanada: +1 647 374 4685 or +1 647 558 0588 or +1 778 907 2071 or +1 204 272 7920 or +1 438 809 7799 or +1 587 328 1099 or 855 703 8985 (Toll Free)\n\nMeeting ID: 96286151238\n\nMeeting Passcode: 986182\n\n\nInternational numbers: https://zoom.us/u/alwnPIaVT\n","location":"https://zoom-lfx.platform.linuxfoundation.org/meeting/96286151238?password=ff267735-efbd-4be4-a89c-b927b596190a","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-22T11:00:00-05:00","end":"2025-12-22T12:00:00-05:00","recurringEventId":"f7cvs5ala9jtt147l3mik2mlvl","originalStartTime":{"dateTime":"2025-12-22T11:00:00-05:00","timeZone":"America/New_York"},"iCalUID":"f7cvs5ala9jtt147l3mik2mlvl@google.com","sequence":2,"guestsCanInviteOthers":false,"eventType":"default"} +{"kind":"calendar#event","etag":"\"3524923598591262\"","id":"s9agipg1r702pfngano7pol2h5_20251225T170000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=czlhZ2lwZzFyNzAycGZuZ2Fubzdwb2wyaDVfMjAyNTEyMjVUMTcwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2024-01-12T09:56:07.000Z","updated":"2025-11-06T20:43:19.295Z","summary":"Composite schemas WG - Weekly 4","description":"The weekly "secondary" meeting of the composite schemas WG: https://github.com/graphql/composite-schemas-wg

Meeting password is "composite"

Live notes are at https://docs.google.com/document/d/1hJO6U7daYvcNcQ3FBKnh3v4R256ers6M8IGyqRpY_kE/edit?usp=sharing","location":"https://zoom.us/j/91078840351","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-25T12:00:00-05:00","end":"2025-12-25T13:00:00-05:00","recurringEventId":"s9agipg1r702pfngano7pol2h5","originalStartTime":{"dateTime":"2025-12-25T12:00:00-05:00","timeZone":"Europe/Berlin"},"iCalUID":"s9agipg1r702pfngano7pol2h5@google.com","sequence":1,"eventType":"default"} +{"kind":"calendar#event","etag":"\"3524923550687710\"","id":"4igp67o2j2nkso49c1d6nbv040_20251225T180000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=NGlncDY3bzJqMm5rc280OWMxZDZuYnYwNDBfMjAyNTEyMjVUMTgwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2025-04-15T10:29:33.000Z","updated":"2025-11-06T20:42:55.343Z","summary":"GraphQL OTel WG","description":"Zoom password: otel
 
https://github.com/graphql/otel-wg","location":"https://zoom.us/j/93594710848?pwd=meEB8rd5g69r5DF8zFaL8VIWO2Il1v.1","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-25T13:00:00-05:00","end":"2025-12-25T14:00:00-05:00","recurringEventId":"4igp67o2j2nkso49c1d6nbv040","originalStartTime":{"dateTime":"2025-12-25T13:00:00-05:00","timeZone":"America/Los_Angeles"},"iCalUID":"4igp67o2j2nkso49c1d6nbv040@google.com","sequence":0,"eventType":"default"} +{"kind":"calendar#event","etag":"\"3524923616454910\"","id":"pag44b4o3k87r90laj5vf5t67v_20251225T190000Z","status":"confirmed","htmlLink":"https://www.google.com/calendar/event?eid=cGFnNDRiNG8zazg3cjkwbGFqNXZmNXQ2N3ZfMjAyNTEyMjVUMTkwMDAwWiBsaW51eGZvdW5kYXRpb24ub3JnX2lrNzl0OXV1ajJwMzJpM3IyMDNkZ3Y1bW84QGc","created":"2023-12-04T10:48:14.000Z","updated":"2025-11-06T20:43:28.227Z","summary":"GraphQL-over-HTTP WG","description":"Zoom password: httpwg","location":"https://zoom.us/j/92781382543","creator":{"email":"benjie@graphile.com"},"organizer":{"email":"linuxfoundation.org_ik79t9uuj2p32i3r203dgv5mo8@group.calendar.google.com","displayName":"GraphQL Foundation - Public","self":true},"start":"2025-12-25T14:00:00-05:00","end":"2025-12-25T15:00:00-05:00","recurringEventId":"pag44b4o3k87r90laj5vf5t67v","originalStartTime":{"dateTime":"2025-12-25T14:00:00-05:00","timeZone":"America/Los_Angeles"},"iCalUID":"pag44b4o3k87r90laj5vf5t67v@google.com","sequence":3,"eventType":"default"} diff --git a/src/_design-system/eyebrow.tsx b/src/_design-system/eyebrow.tsx new file mode 100644 index 0000000000..8367fb1d26 --- /dev/null +++ b/src/_design-system/eyebrow.tsx @@ -0,0 +1,30 @@ +import { clsx } from "clsx" + +import { ChevronRight } from "@/app/conf/_design-system/pixelarticons/chevron-right" + +export interface EyebrowProps extends React.HTMLAttributes { + children: React.ReactNode + className?: string + as?: "p" | "span" | "h2" | "h3" | "h4" | "h5" | "h6" +} + +export function Eyebrow({ + children, + className, + as = "span", + ...rest +}: EyebrowProps) { + const Root = as + return ( + + + {children} + + ) +} diff --git a/src/_design-system/mdx-components/get-mdx-headings.tsx b/src/_design-system/mdx-components/get-mdx-headings.tsx index a162126a90..0f5eb88bde 100644 --- a/src/_design-system/mdx-components/get-mdx-headings.tsx +++ b/src/_design-system/mdx-components/get-mdx-headings.tsx @@ -30,7 +30,9 @@ const createHeading = ( id, className, ...props - }: React.ComponentPropsWithoutRef<"h2">): React.ReactElement { + }: React.ComponentPropsWithoutRef<"h2"> & { + size?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" + }): React.ReactElement { // Nextra tracks anchors in context const setActiveAnchor = useSetActiveAnchor() const slugs = useSlugs() @@ -61,7 +63,7 @@ const createHeading = ( className === "sr-only" ? // can be added by footnotes "sr-only" - : clsx(headingClasses[Tag], "text-neu-900", className) + : clsx(headingClasses[props.size || Tag], "text-neu-900", className) } {...props} > diff --git a/src/app/(main)/community/events/benefits-section.tsx b/src/app/(main)/community/events/benefits-section.tsx index bb0d333bd9..1a2f9997de 100644 --- a/src/app/(main)/community/events/benefits-section.tsx +++ b/src/app/(main)/community/events/benefits-section.tsx @@ -5,9 +5,9 @@ import EyeIcon from "@/app/conf/_design-system/pixelarticons/eye.svg?svgr" import { BenefitCard } from "./benefit-card" -export function BenefitsSection() { +export function BenefitsSection({ id }: { id?: string }) { return ( -
+

Benefits of getting involved diff --git a/src/app/(main)/community/events/events-blur-bean.webp b/src/app/(main)/community/events/events-blur-bean.webp new file mode 100644 index 0000000000..679526360c Binary files /dev/null and b/src/app/(main)/community/events/events-blur-bean.webp differ diff --git a/src/app/(main)/community/events/get-your-meetup-noticed-section.tsx b/src/app/(main)/community/events/get-your-meetup-noticed-section.tsx index be2b784624..b897330feb 100644 --- a/src/app/(main)/community/events/get-your-meetup-noticed-section.tsx +++ b/src/app/(main)/community/events/get-your-meetup-noticed-section.tsx @@ -2,9 +2,9 @@ import Mailbox from "./mailbox.svg?svgr" import { Button } from "@/app/conf/_design-system/button" import { DISCORD_CHANNEL_LINK, DISCORD_SERVER_LINK } from "./links" -export function GetYourMeetupNoticedSection() { +export function GetYourMeetupNoticedSection({ id }: { id?: string }) { return ( -
+

@@ -41,7 +41,7 @@ export function GetYourMeetupNoticedSection() { Go to Discord

-
+
diff --git a/src/app/(main)/community/events/page.tsx b/src/app/(main)/community/events/page.tsx index c7d0d8e745..efd83a1580 100644 --- a/src/app/(main)/community/events/page.tsx +++ b/src/app/(main)/community/events/page.tsx @@ -2,6 +2,9 @@ import dynamic from "next/dynamic" import { Breadcrumbs } from "@/_design-system/breadcrumbs" import { Button } from "@/app/conf/_design-system/button" +import { NavbarFixed } from "@/components/navbar/navbar-fixed" +import { TocHero, TocHeroContents } from "@/components/toc-hero" +import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration" import { MeetupsMap } from "./meetups-map" import { EventsList } from "./events-list" @@ -10,6 +13,7 @@ import { GetYourMeetupNoticedSection } from "./get-your-meetup-noticed-section" import { BringGraphQLToYourCommunity } from "./bring-graphql-to-your-community" import { getAllEvents } from "./get-all-events" import { SubscribeToRssLink } from "./subscribe-to-rss-link" +import blurBean from "./events-blur-bean.webp" const ISSUE_TEMPLATE_LINK = "https://github.com/graphql/community-wg/issues/new?assignees=&labels=event&template=event-submission.yml" @@ -26,85 +30,132 @@ export default async function EventsPage() { const { upcomingEvents, pastEvents } = await getAllEvents() return ( -
-

Events & Meetups

- -
- + + } + > + -
+ +
+
+ +
- {upcomingEvents.length > 0 && ( -
-
-
-

Upcoming events

-

- See what’s coming up across the GraphQL ecosystem. -

-
- +
+ + + + - - - - - -
- )} +
+ )} - + -
-

Meetups

-

- Find and join local GraphQL meetups happening around the world. Select - a city to explore upcoming events. -

+
+

Meetups

+

+ Find and join local GraphQL meetups happening around the world. + Select a city to explore upcoming events. +

+ + +
- -
+
+

Past events & meetups

+

+ A look back at how the GraphQL community connects and grows + together. +

+ +
-
-

Past events & meetups

-

- A look back at how the GraphQL community connects and grows together. +

Event gallery

+

+ A look back at what’s been happening.

- -
+ -

Event gallery

-

- A look back at what’s been happening. -

- + + +

+ + ) +} - - +function Stripes() { + return ( +
+
) } diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index e848d35314..b2da8e0b93 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -8,6 +8,7 @@ import stripesMask from "@/components/404-page/image.webp" import { Button } from "./conf/_design-system/button" import MainLayout from "./(main)/layout" +import { NavbarFixed } from "@/components/navbar/navbar-fixed" export default function NotFoundPage() { const pathname = usePathname() @@ -29,7 +30,7 @@ export default function NotFoundPage() { return ( - +
diff --git a/src/components/faq-aggregator/decorations/best-practices.svg b/src/components/faq-aggregator/decorations/best-practices.svg new file mode 100644 index 0000000000..ead38a4597 --- /dev/null +++ b/src/components/faq-aggregator/decorations/best-practices.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/faq-aggregator/decorations/frontend.svg b/src/components/faq-aggregator/decorations/frontend.svg new file mode 100644 index 0000000000..5b1be09991 --- /dev/null +++ b/src/components/faq-aggregator/decorations/frontend.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/faq-aggregator/decorations/general.svg b/src/components/faq-aggregator/decorations/general.svg new file mode 100644 index 0000000000..5285544d76 --- /dev/null +++ b/src/components/faq-aggregator/decorations/general.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/src/components/faq-aggregator/decorations/getting-started.svg b/src/components/faq-aggregator/decorations/getting-started.svg new file mode 100644 index 0000000000..853ff0bb18 --- /dev/null +++ b/src/components/faq-aggregator/decorations/getting-started.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/faq-aggregator/decorations/specification.svg b/src/components/faq-aggregator/decorations/specification.svg new file mode 100644 index 0000000000..586bf85db4 --- /dev/null +++ b/src/components/faq-aggregator/decorations/specification.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/faq-aggregator/index.tsx b/src/components/faq-aggregator/index.tsx new file mode 100644 index 0000000000..84509b9e5d --- /dev/null +++ b/src/components/faq-aggregator/index.tsx @@ -0,0 +1,111 @@ +"use client" + +import { getMdxHeadings } from "@/_design-system/mdx-components/get-mdx-headings" +import { type ReactNode, useRef, useLayoutEffect, useState } from "react" +import ArrowDown from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr" +import BestPracticesIcon from "./decorations/best-practices.svg?svgr" +import FrontendIcon from "./decorations/frontend.svg?svgr" +import GeneralIcon from "./decorations/general.svg?svgr" +import GettingStartedIcon from "./decorations/getting-started.svg?svgr" +import SpecificationIcon from "./decorations/specification.svg?svgr" + +function slugify(text: string): string { + return String(text) + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/(^-|-$)/g, "") +} + +const mdxHeadings = getMdxHeadings() + +const iconMap: Record = { + "getting-started": GettingStartedIcon, + "best-practices": BestPracticesIcon, + frontend: FrontendIcon, + general: GeneralIcon, + specification: SpecificationIcon, +} + +function FaqH1({ id, children }: { id?: string; children?: ReactNode }) { + const slug = id ?? slugify(String(children)) + const Icon = iconMap[slug] ?? GeneralIcon + + return ( +
+
+ +
+ + {children} + +
+ ) +} + +function FaqH2({ id, children }: { id?: string; children?: ReactNode }) { + const slug = id ?? slugify(String(children)) + return ( +
+ +

+ {children} +

+ +
+
+ ) +} + +export function FaqAggregator({ children }: { children: ReactNode }) { + const containerRef = useRef(null) + const [, forceUpdate] = useState(0) + + useLayoutEffect(() => { + const container = containerRef.current + if (!container) return + + const details = container.querySelectorAll("details") + details.forEach(detail => { + const answerContent: Node[] = [] + let sibling = detail.nextSibling + + while (sibling) { + const next = sibling.nextSibling + if (sibling instanceof Element) { + if ( + sibling.tagName === "DETAILS" || + (sibling as HTMLElement).dataset?.heading + ) + break + answerContent.push(sibling) + } else if ( + sibling.nodeType === Node.TEXT_NODE && + sibling.textContent?.trim() + ) { + answerContent.push(sibling) + } + sibling = next + } + + if (answerContent.length > 0) { + answerContent.forEach(node => detail.appendChild(node)) + } + }) + + forceUpdate(n => n + 1) + }, []) + + return
{children}
+} + +export const faqMdxComponents = { + h1: FaqH1, + h2: FaqH2, +} diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx index 68482b5143..b23a0a6814 100644 --- a/src/components/footer/index.tsx +++ b/src/components/footer/index.tsx @@ -68,7 +68,7 @@ const FOOTER_SECTIONS: FooterSection[] = [ route: "/community/resources/official-channels", }, { - title: "Events & Meetups", + title: "Events", route: "/community/events", }, { diff --git a/src/components/index-page/index.tsx b/src/components/index-page/index.tsx index 1de9f96c7b..dbdb379a78 100644 --- a/src/components/index-page/index.tsx +++ b/src/components/index-page/index.tsx @@ -12,6 +12,7 @@ import { JoinTheCommunity } from "./join-the-community" import { DataColocation } from "./data-colocation" import { WhatIsGraphQL } from "./what-is-graphql" import { UseCases } from "./use-cases" +import { NavbarFixed } from "../navbar/navbar-fixed" export function IndexPage() { return ( @@ -35,7 +36,7 @@ export function IndexPage() { - +
) } diff --git a/src/components/learn-aggregator/assets/books.svg b/src/components/learn-aggregator/assets/books.svg new file mode 100644 index 0000000000..08ba62271a --- /dev/null +++ b/src/components/learn-aggregator/assets/books.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/checkbox.svg b/src/components/learn-aggregator/assets/checkbox.svg new file mode 100644 index 0000000000..432abbaee5 --- /dev/null +++ b/src/components/learn-aggregator/assets/checkbox.svg @@ -0,0 +1,16 @@ + + + + diff --git a/src/components/learn-aggregator/assets/circuit.svg b/src/components/learn-aggregator/assets/circuit.svg new file mode 100644 index 0000000000..2324822e55 --- /dev/null +++ b/src/components/learn-aggregator/assets/circuit.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/cog-double.svg b/src/components/learn-aggregator/assets/cog-double.svg new file mode 100644 index 0000000000..0e8f272a77 --- /dev/null +++ b/src/components/learn-aggregator/assets/cog-double.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/computer.svg b/src/components/learn-aggregator/assets/computer.svg new file mode 100644 index 0000000000..2ea9a797c6 --- /dev/null +++ b/src/components/learn-aggregator/assets/computer.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/construction.svg b/src/components/learn-aggregator/assets/construction.svg new file mode 100644 index 0000000000..a3a332693e --- /dev/null +++ b/src/components/learn-aggregator/assets/construction.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/dna.svg b/src/components/learn-aggregator/assets/dna.svg new file mode 100644 index 0000000000..bdf4234af5 --- /dev/null +++ b/src/components/learn-aggregator/assets/dna.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/globe.svg b/src/components/learn-aggregator/assets/globe.svg new file mode 100644 index 0000000000..731792c5a9 --- /dev/null +++ b/src/components/learn-aggregator/assets/globe.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/hierarchy.svg b/src/components/learn-aggregator/assets/hierarchy.svg new file mode 100644 index 0000000000..ed0bcc4767 --- /dev/null +++ b/src/components/learn-aggregator/assets/hierarchy.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/key.svg b/src/components/learn-aggregator/assets/key.svg new file mode 100644 index 0000000000..74eb5cb72a --- /dev/null +++ b/src/components/learn-aggregator/assets/key.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/layer.svg b/src/components/learn-aggregator/assets/layer.svg new file mode 100644 index 0000000000..2730903094 --- /dev/null +++ b/src/components/learn-aggregator/assets/layer.svg @@ -0,0 +1,24 @@ + + + + + + diff --git a/src/components/learn-aggregator/assets/nav-left-circle.svg b/src/components/learn-aggregator/assets/nav-left-circle.svg new file mode 100644 index 0000000000..395b0b562e --- /dev/null +++ b/src/components/learn-aggregator/assets/nav-left-circle.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/note.svg b/src/components/learn-aggregator/assets/note.svg new file mode 100644 index 0000000000..90b81e393d --- /dev/null +++ b/src/components/learn-aggregator/assets/note.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/product-check.svg b/src/components/learn-aggregator/assets/product-check.svg new file mode 100644 index 0000000000..b5ffbd2670 --- /dev/null +++ b/src/components/learn-aggregator/assets/product-check.svg @@ -0,0 +1,16 @@ + + + + diff --git a/src/components/learn-aggregator/assets/safe.svg b/src/components/learn-aggregator/assets/safe.svg new file mode 100644 index 0000000000..093727d0de --- /dev/null +++ b/src/components/learn-aggregator/assets/safe.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/search.svg b/src/components/learn-aggregator/assets/search.svg new file mode 100644 index 0000000000..3f824bc454 --- /dev/null +++ b/src/components/learn-aggregator/assets/search.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/src/components/learn-aggregator/assets/share.svg b/src/components/learn-aggregator/assets/share.svg new file mode 100644 index 0000000000..af002cf99c --- /dev/null +++ b/src/components/learn-aggregator/assets/share.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/solve.svg b/src/components/learn-aggregator/assets/solve.svg new file mode 100644 index 0000000000..0705b3eba7 --- /dev/null +++ b/src/components/learn-aggregator/assets/solve.svg @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/learn-aggregator/assets/startup.svg b/src/components/learn-aggregator/assets/startup.svg new file mode 100644 index 0000000000..2fa142a43b --- /dev/null +++ b/src/components/learn-aggregator/assets/startup.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/src/components/learn-aggregator/assets/sync-square.svg b/src/components/learn-aggregator/assets/sync-square.svg new file mode 100644 index 0000000000..d6d9b7b34b --- /dev/null +++ b/src/components/learn-aggregator/assets/sync-square.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/src/components/learn-aggregator/assets/zoom-page.svg b/src/components/learn-aggregator/assets/zoom-page.svg new file mode 100644 index 0000000000..81e62c9a4f --- /dev/null +++ b/src/components/learn-aggregator/assets/zoom-page.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/src/components/learn-aggregator/common-questions.tsx b/src/components/learn-aggregator/common-questions.tsx new file mode 100644 index 0000000000..d3013c7de9 --- /dev/null +++ b/src/components/learn-aggregator/common-questions.tsx @@ -0,0 +1,55 @@ +import { clsx } from "clsx" + +import { Eyebrow } from "@/_design-system/eyebrow" +import ArrowDownIcon from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr" +import { Anchor } from "@/app/conf/_design-system/anchor" + +export function CommonQuestionsSection( + props: React.HTMLAttributes, +) { + return ( +
+ FAQ +

Common questions

+

+ Find answers to the most common questions about GraphQL — from getting + started to advanced use cases. This also covers frontend concerns and + info about the official specification. +

+
    + + + + + + +
+
+ ) +} + +function CommonQuestionsItem({ title, href }: { title: string; href: string }) { + return ( +
  • + + {title} + + +
  • + ) +} diff --git a/src/components/learn-aggregator/index.tsx b/src/components/learn-aggregator/index.tsx new file mode 100644 index 0000000000..e2f6417f2b --- /dev/null +++ b/src/components/learn-aggregator/index.tsx @@ -0,0 +1,183 @@ +import { ReactNode, useState } from "react" +import { clsx } from "clsx" + +import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration" +import ArrowDownIcon from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr" + +import { Eyebrow } from "@/_design-system/eyebrow" + +import blurBean from "./learn-blur-bean.webp" +import { Button } from "@/app/conf/_design-system/button" + +export interface TeaserSectionProps + extends React.HTMLAttributes { + eyebrow: string + title: string + description: string + cta: ReactNode + items: Array<{ + title: string + description: string + href: string + icon: string + section: "getting-started" | "best-practices" + }> + firstIconsEager?: boolean +} +export function TeaserSection({ + eyebrow, + title, + description, + cta, + items, + firstIconsEager, + className, + ...rest +}: TeaserSectionProps) { + const [showingMore, showMore] = useState(false) + + return ( +
    +
    +
    + {eyebrow} +

    {title}

    +

    + {description} +

    + {cta} +
    +
    +
    +
      + {items.map((item, index) => { + return ( + + } + /> + ) + })} +
    + {!showingMore && ( + + )} +
    +
    + ) +} + +interface TeaserSectionListItemProps + extends React.HTMLAttributes { + number: number + title: string + description: string + icon: ReactNode + section: "getting-started" | "best-practices" + href: string +} +function TeaserSectionListItem({ + number, + title, + description, + icon, + section, + href, + className, + ...rest +}: TeaserSectionListItemProps) { + return ( +
  • + + + {icon} + + + + + {/* TODO: Are we really sure these are Lessons? */} + Lesson {number} + + + {title} + + + +

    + {description} +

    + + + + +
    +
  • + ) +} + +export function LearnHeroStripes() { + return ( +
    + +
    + ) +} diff --git a/src/components/learn-aggregator/learn-blur-bean.webp b/src/components/learn-aggregator/learn-blur-bean.webp new file mode 100644 index 0000000000..65b680af5b Binary files /dev/null and b/src/components/learn-aggregator/learn-blur-bean.webp differ diff --git a/src/components/learn-aggregator/learn-pages.tsx b/src/components/learn-aggregator/learn-pages.tsx new file mode 100644 index 0000000000..36fb291e90 --- /dev/null +++ b/src/components/learn-aggregator/learn-pages.tsx @@ -0,0 +1,174 @@ +import meta from "../../pages/learn/_meta" + +type LearnPagePath = Exclude + +interface LearnPageItem { + title: string + description: string + icon: string + section: "getting-started" | "best-practices" + href: string +} + +const _items: Record< + LearnPagePath, + Omit | null +> = { + introduction: { + description: + "Get a high-level overview of GraphQL and how it enables flexible, versionless APIs powered by a strong type system.", + icon: new URL("./assets/computer.svg", import.meta.url).href, + section: "getting-started", + }, + schema: { + description: + "Learn how GraphQL’s schema language defines the shape of your data using types.", + icon: new URL("./assets/hierarchy.svg", import.meta.url).href, + section: "getting-started", + }, + queries: { + description: + "Understand how to structure GraphQL queries to request exactly the data you need — including fields, variables and fragments.", + icon: new URL("./assets/search.svg", import.meta.url).href, + section: "getting-started", + }, + mutations: { + description: + "Explore how to modify data with mutations, including how to update and remove records through your schema.", + icon: new URL("./assets/dna.svg", import.meta.url).href, + section: "getting-started", + }, + subscriptions: { + description: + "Discover how GraphQL supports real-time data with subscriptions and how to use them effectively at scale.", + icon: new URL("./assets/sync-square.svg", import.meta.url).href, + section: "getting-started", + }, + validation: { + description: + "See how GraphQL ensures query correctness through validation rules and how common errors are detected early.", + icon: new URL("./assets/checkbox.svg", import.meta.url).href, + section: "getting-started", + }, + execution: { + description: + "Learn how resolvers power GraphQL execution and how the server processes and returns data for each query.", + icon: new URL("./assets/cog-double.svg", import.meta.url).href, + section: "getting-started", + }, + response: { + description: + "Explore how GraphQL structures its responses, including data, errors and extensions for custom metadata.", + icon: new URL("./assets/nav-left-circle.svg", import.meta.url).href, + section: "getting-started", + }, + introspection: { + description: + "Use introspection to explore the schema itself — a powerful way to inspect types and fields dynamically.", + icon: new URL("./assets/zoom-page.svg", import.meta.url).href, + section: "getting-started", + }, + // --- + "best-practices": null, + "thinking-in-graphs": { + description: + "Learn how to shift your mindset from RESTful endpoints to graph-based thinking, aligning your schema with business logic and legacy systems.", + icon: new URL("./assets/share.svg", import.meta.url).href, + section: "best-practices", + }, + "serving-over-http": { + description: + "Explore how GraphQL operates over HTTP, including methods, headers, status codes and API endpoint design.", + icon: new URL("./assets/globe.svg", import.meta.url).href, + section: "best-practices", + }, + "file-uploads": { + description: + "Handle file uploads in GraphQL by wrapping them as mutations. Learn the recommended approach for integrating file handling into your API.", + icon: new URL("./assets/note.svg", import.meta.url).href, + section: "best-practices", + }, + authorization: { + description: + "Understand how to secure your GraphQL APIs with type- and field-level authorization patterns.", + icon: new URL("./assets/key.svg", import.meta.url).href, + section: "best-practices", + }, + pagination: { + description: + "Discover different pagination strategies in GraphQL, from simple slicing to fully connected edges and nodes.", + icon: new URL("./assets/layer.svg", import.meta.url).href, + section: "best-practices", + }, + "schema-design": { + description: + "Learn how to design clear, adaptable schemas — including versioning and thoughtful use of nullability.", + icon: new URL("./assets/solve.svg", import.meta.url).href, + section: "best-practices", + }, + "global-object-identification": { + description: + "Use globally unique IDs and the Node interface to enable caching, refetching, and efficient schema traversal.", + icon: new URL("./assets/product-check.svg", import.meta.url).href, + section: "best-practices", + }, + caching: { + description: + "Explore caching techniques and ID strategies that make client-side performance and object reuse more effective.", + icon: new URL("./assets/books.svg", import.meta.url).href, + section: "best-practices", + }, + performance: { + description: + "Get practical tips for improving GraphQL performance — from preventing N+1 problems to monitoring and compression.", + icon: new URL("./assets/startup.svg", import.meta.url).href, + section: "best-practices", + }, + security: { + description: + "Protect your GraphQL API with best practices for query limits, input validation, introspection control and more.", + icon: new URL("./assets/safe.svg", import.meta.url).href, + section: "best-practices", + }, + federation: { + description: + "Learn how GraphQL federation enables modular, scalable APIs by composing services into a unified schema.", + icon: new URL("./assets/circuit.svg", import.meta.url).href, + section: "best-practices", + }, + "debug-errors": { + description: + "Learn about common 'graphql-http' errors and how to debug them.", + icon: new URL("./assets/construction.svg", import.meta.url).href, + section: "best-practices", + }, +} + +const learnPages = _items as Record + +const pagesBySection: Record = { + "getting-started": [], + "best-practices": [], +} + +for (const path in learnPages) { + const page = learnPages[path as LearnPagePath] + if (page === null) continue + const metaEntry = meta[path as keyof typeof meta] + + if (typeof metaEntry === "string") { + page.title = + metaEntry || + path.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase()) + } else if (typeof metaEntry === "object" && "title" in metaEntry) { + page.title = metaEntry.title + } else { + page.title = path.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase()) + } + + page.href = `/learn/${path}` + + pagesBySection[page.section].push(page) +} + +export { learnPages, pagesBySection } diff --git a/src/components/learn-aggregator/looking-for-more.tsx b/src/components/learn-aggregator/looking-for-more.tsx new file mode 100644 index 0000000000..95c719ad66 --- /dev/null +++ b/src/components/learn-aggregator/looking-for-more.tsx @@ -0,0 +1,37 @@ +import { clsx } from "clsx" +import ArrowDownIcon from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr" + +export function LookingForMore(props: React.HTMLAttributes) { + return ( +
    +
    +
    +

    Looking for more?

    +

    + Learning is just the beginning. Discover tools and other resources — + or connect with the GraphQL community around the world. +

    +
    + +
    +
    + ) +} diff --git a/src/components/learn-aggregator/training-courses.tsx b/src/components/learn-aggregator/training-courses.tsx new file mode 100644 index 0000000000..7c9e4d2ced --- /dev/null +++ b/src/components/learn-aggregator/training-courses.tsx @@ -0,0 +1,130 @@ +import { clsx } from "clsx" + +import { Eyebrow } from "@/_design-system/eyebrow" +import { GraphQLLogo } from "@/app/conf/2025/components/graphql-conf-logo-link" +import ArrowDownIcon from "@/app/conf/_design-system/pixelarticons/arrow-down.svg?svgr" +import ApolloLogo from "@/icons/apollo.svg?svgr" + +export function TrainingCoursesSection( + props: React.HTMLAttributes, +) { + return ( +
    +
    + Tutorials +

    Training Courses

    +

    + Get started or level up your GraphQL skills with these trusted + tutorials. +

    +
      +
    • + } + href="https://www.graphql-js.org/docs/" + /> +
    • +
    • + } + href="https://www.apollographql.com/tutorials/" + /> +
    • +
    • + } + href="https://the-guild.dev/graphql/yoga-server/tutorial/basic" + /> +
    • +
    • + } + href="https://hasura.io/learn/" + /> +
    • +
    +
    +
    + ) +} + +interface TrainingCoursesCardProps + extends React.LinkHTMLAttributes { + title: string + description: string + icon: React.ReactNode +} +function TrainingCoursesCard({ + title, + description, + icon, + href, + ...props +}: TrainingCoursesCardProps) { + return ( + +

    + {title} +

    +

    + {description} +

    + + {icon} + + + + +
    + ) +} + +function YogaLogo() { + return ( + + + + + + ) +} + +function HasuraLogo() { + return ( + + + + ) +} diff --git a/src/components/navbar/navbar-fixed.tsx b/src/components/navbar/navbar-fixed.tsx new file mode 100644 index 0000000000..b7407bc4ac --- /dev/null +++ b/src/components/navbar/navbar-fixed.tsx @@ -0,0 +1,3 @@ +export function NavbarFixed() { + return +} diff --git a/src/components/nextra-mdx-wrapper.tsx b/src/components/nextra-mdx-wrapper.tsx index 83dde0bfa4..4dc9b4fc2f 100644 --- a/src/components/nextra-mdx-wrapper.tsx +++ b/src/components/nextra-mdx-wrapper.tsx @@ -36,6 +36,10 @@ export function NextraMdxWrapper({ directories, } = config.normalizePagesResult + if (themeContext.toc && typeof themeContext.toc === "object") { + toc = themeContext.toc + } + const tocEl = activeType === "page" || !themeContext.toc || diff --git a/src/components/sidebar/index.tsx b/src/components/sidebar/index.tsx index 2d4733bf0c..2db9ecc0b4 100644 --- a/src/components/sidebar/index.tsx +++ b/src/components/sidebar/index.tsx @@ -249,7 +249,7 @@ function File({ item: PageItem | Item anchors: Heading[] onFocus: FocusEventHandler -}): ReactElement { +}) { const route = useFSRoute() // It is possible that the item doesn't have any route - for example an external link. @@ -261,6 +261,10 @@ function File({ const activeAnchor = useActiveAnchor() as ActiveAnchor | null const { setMenu } = useMenu() + if (item.type === "hidden") { + return null + } + if (item.type === "separator") { return } diff --git a/src/components/table-of-contents.tsx b/src/components/table-of-contents.tsx index 602ecd0924..84c3460434 100644 --- a/src/components/table-of-contents.tsx +++ b/src/components/table-of-contents.tsx @@ -86,7 +86,7 @@ export function TableOfContents({ }[depth], "block", activeAnchor[id]?.isActive - ? "text-pri-base contrast-more:!text-pri-base" + ? "text-pri-base contrast-more:!text-pri-base dark:text-pri-light" : "", )} > @@ -101,7 +101,8 @@ export function TableOfContents({ {hasMetaInfo && (
    + {decoration} +
    +

    {heading}

    +

    {text}

    + {children} +
    +
    + ) +} diff --git a/src/components/toc-hero/toc-hero-contents.tsx b/src/components/toc-hero/toc-hero-contents.tsx new file mode 100644 index 0000000000..f621002191 --- /dev/null +++ b/src/components/toc-hero/toc-hero-contents.tsx @@ -0,0 +1,56 @@ +import { clsx } from "clsx" + +import { ChevronRight } from "@/app/conf/_design-system/pixelarticons/chevron-right" + +export interface TocHeroContentsProps + extends React.HTMLAttributes { + sections: (string | { name: string; href: string })[] +} + +export function TocHeroContents({ + sections, + className, + ...rest +}: TocHeroContentsProps) { + return ( +
    +

    + What will you find here? +

    +
      + {sections.map((section, i) => { + const { name, href } = + typeof section === "string" + ? { + name: section, + href: `#${section.toLowerCase().replace(/ /g, "-")}`, + } + : section + + return ( +
    • + + + {name} + +
    • + ) + })} +
    +
    + ) +} diff --git a/src/nextra-theme-docs.css b/src/nextra-theme-docs.css index 9b3d03e932..5f8993280a 100644 --- a/src/nextra-theme-docs.css +++ b/src/nextra-theme-docs.css @@ -1585,7 +1585,7 @@ pre } :target > .subheading-anchor:is(html[class~="dark"] *):after { --tw-text-opacity: 1; - color: rgb(115 115 115 / var(--tw-text-opacity, 1)); + color: rgb(110 117 87 / var(--tw-text-opacity, 1)); } .subheading-anchor:after { --tw-content: "#"; diff --git a/src/pages/_meta.tsx b/src/pages/_meta.tsx index 0fb3920a60..115fb056f2 100644 --- a/src/pages/_meta.tsx +++ b/src/pages/_meta.tsx @@ -22,7 +22,7 @@ export default { href: "/community/resources/official-channels", }, events: { - title: "Events & Meetups", + title: "Events", type: "page", href: "/community/events", }, diff --git a/src/pages/faq/_meta.ts b/src/pages/faq/_meta.ts index db8b2a9b62..532f762bb3 100644 --- a/src/pages/faq/_meta.ts +++ b/src/pages/faq/_meta.ts @@ -1,8 +1,19 @@ export default { index: { - title: "Overview", + title: "FAQ", + type: "hidden", theme: { - toc: false, + sidebar: false, + timestamp: false, + breadcrumb: false, + toc: [ + { value: "Getting Started", id: "getting-started", depth: 2 }, + { value: "General", id: "general", depth: 2 }, + { value: "Best Practices", id: "best-practices", depth: 2 }, + { value: "Specification", id: "specification", depth: 2 }, + { value: "Frontend", id: "frontend", depth: 2 }, + { value: "Foundation", id: "foundation", depth: 2 }, + ], }, }, "getting-started": "", diff --git a/src/pages/faq/index.mdx b/src/pages/faq/index.mdx index 2a0a6574ef..0882acaec0 100644 --- a/src/pages/faq/index.mdx +++ b/src/pages/faq/index.mdx @@ -1,14 +1,23 @@ -import { Cards } from 'nextra/components' -import metaFile from './_meta' - -# Frequently Asked Questions (FAQ) - - - {Object.entries(metaFile).slice(1).map(([key]) => ( - word[0].toUpperCase() + word.slice(1)).join(' ')} - href={`/faq/${key}`} arrow - /> - ))} - +--- +title: FAQ +--- + +import { FaqAggregator, faqMdxComponents } from "@/components/faq-aggregator" + +import GettingStarted from "./getting-started.mdx" +import General from "./general.mdx" +import BestPractices from "./best-practices.mdx" +import Specification from "./specification.mdx" +import Frontend from "./frontend.mdx" +import Foundation from "./foundation.mdx" + +

    Frequently Asked Questions

    + + + + + + + + + diff --git a/src/pages/learn/_meta.ts b/src/pages/learn/_meta.ts index 00f65b80e6..29048f6fac 100644 --- a/src/pages/learn/_meta.ts +++ b/src/pages/learn/_meta.ts @@ -3,7 +3,16 @@ export default { type: "separator", title: "Learn", }, - index: "Introduction", + index: { + /** + * The Learn aggregator is hidden from the Sidebar. + */ + type: "hidden", + theme: { + layout: "raw", + }, + }, + introduction: "Introduction", schema: "Schemas and Types", queries: "", mutations: "", @@ -28,9 +37,5 @@ export default { performance: "", security: "", federation: "", - "-- 3": { - type: "separator", - title: "GraphQL over HTTP", - }, "debug-errors": "Common GraphQL over HTTP Errors", } diff --git a/src/pages/learn/index.mdx b/src/pages/learn/index.mdx index 2a2003033c..b2187f13d2 100644 --- a/src/pages/learn/index.mdx +++ b/src/pages/learn/index.mdx @@ -1,105 +1,70 @@ -import { Callout } from "nextra/components" - -# Introduction to GraphQL - -

    Learn about GraphQL, how it works, and how to use it

    - -GraphQL is a query language for your API, and a server-side runtime for executing queries using a type system you define for your data. The [GraphQL specification](https://spec.graphql.org/) was open-sourced in 2015 and has since been implemented in a variety of programming languages. GraphQL isn't tied to any specific database or storage engine—it is backed by your existing code and data. - -If you're already familiar with GraphQL and would like to read documentation on how to build a GraphQL service, then there are libraries to help you implement GraphQL in [many different languages](/community/tools-and-libraries/?tags=server). There are also many libraries available that allow [client applications to query existing GraphQL APIs](/community/tools-and-libraries/?tags=client). - -## Describe your API with a type system - -A GraphQL service is created by [defining types and their fields](/learn/schema/), and then writing a function for each field to [provide the required data](/learn/execution/). For example, a GraphQL service that tells you the name of a logged-in user might look like this: - -```graphql -type Query { - me: User -} - -type User { - name: String -} -``` - -Along with functions for each field on each type: - -```js -// Resolver for the `me` field on the `Query` type -function resolveQueryMe(_parent, _args, context, _info) { - return context.request.auth.user; -} - -// Resolver for the `name` field on the `User` type -function resolveUserName(user, _args, context, _info) { - return context.db.getUserFullName(user.id); -} -``` - -In the example above, the function that provides data for the `me` field on the `Query` type uses information about the authenticated user who made the request, while the `name` field on the `User` type is populated by using that user's ID to fetch their full name from a database. - -## Query exactly what you need - -After a GraphQL service is running (typically at a URL on a web service), it can receive [GraphQL queries](/learn/queries/) to validate and execute from clients. The service first checks a query to ensure it only refers to the types and fields defined for the API and then runs the provided functions to produce a result. - -For example, the query: - -```graphql -{ - me { - name +--- +title: Learn +--- + +import { Button } from '@/app/conf/_design-system/button'; + +import { NavbarFixed } from '../../components/navbar/navbar-fixed' +import { TocHero, TocHeroContents } from '../../components/toc-hero'; +import { TeaserSection, LearnHeroStripes } from '../../components/learn-aggregator' +import { pagesBySection } from '../../components/learn-aggregator/learn-pages' +import { CommonQuestionsSection } from '../../components/learn-aggregator/common-questions' +import { TrainingCoursesSection } from '../../components/learn-aggregator/training-courses' +import { LookingForMore } from "../../components/learn-aggregator/looking-for-more" + + + + Get hands-on with the fundamentals of GraphQL. Start with the basics and see how it compares to other technologies. +
    {" "} + Then move on to best practices for designing better APIs. + } -} -``` - -Could produce the following JSON result: - -```json -{ - "data": { - "me": { - "name": "Luke Skywalker" - } + decoration={} +> + + +
    + + + Start learning + } -} -``` - -With even a simple query, we can see some of the key features that make GraphQL so powerful. The client can make queries to the API that mirror the structure of the data that they need and then receive just that data in the expected shape with a single request—and without having to worry about which underlying data sources provided it. - -## Evolve your API without versioning - -Client requirements change over time and GraphQL allows your API to evolve in response to those needs and without the overhead of managing different API versions. For example, if a new feature calls for more specific name values to be available, then the `User` type could be updated as follows: - -```graphql -type User { - fullName: String - nickname: String - name: String @deprecated(reason: "Use `fullName`.") -} -``` - -Client tooling will encourage developers to use the new fields and remove usage of the deprecated `name` field. The field can be removed once it is determined it is no longer used; in the meantime GraphQL will continue to provide its data as expected. - -## Try it out! - -The best way to learn GraphQL is to start writing queries. The query editors used throughout this guide are **interactive**, so try adding an `id` and `appearsIn` fields to the `hero` object to see an updated result: - -```graphql -# { "graphiql": true } -{ - hero { - name - # add additional fields here! + firstIconsEager + items={pagesBySection["getting-started"]} +/> + + + Explore all best practices + } -} -``` - - -The examples in this guide are based on [a modified version of the SWAPI GraphQL schema](https://github.com/graphql/graphql.github.io/blob/source/src/components/interactive-code-block/swapi-schema.tsx). Because these queries are designed for illustrative purposes, they will not run on the full version of the SWAPI GraphQL API due to differences between the two schemas. [You can try the full version of the API here.](https://graphql.org/swapi-graphql/) - + items={pagesBySection["best-practices"]} +/> -## Next steps + -Now that you know some key GraphQL concepts, you're ready to learn about all of the different aspects of its [type system](/learn/schema/). + -For an in-depth learning experience with practical tutorials, see [the available training courses](/community/resources/training-courses). + diff --git a/src/pages/learn/introduction.mdx b/src/pages/learn/introduction.mdx new file mode 100644 index 0000000000..2a2003033c --- /dev/null +++ b/src/pages/learn/introduction.mdx @@ -0,0 +1,105 @@ +import { Callout } from "nextra/components" + +# Introduction to GraphQL + +

    Learn about GraphQL, how it works, and how to use it

    + +GraphQL is a query language for your API, and a server-side runtime for executing queries using a type system you define for your data. The [GraphQL specification](https://spec.graphql.org/) was open-sourced in 2015 and has since been implemented in a variety of programming languages. GraphQL isn't tied to any specific database or storage engine—it is backed by your existing code and data. + +If you're already familiar with GraphQL and would like to read documentation on how to build a GraphQL service, then there are libraries to help you implement GraphQL in [many different languages](/community/tools-and-libraries/?tags=server). There are also many libraries available that allow [client applications to query existing GraphQL APIs](/community/tools-and-libraries/?tags=client). + +## Describe your API with a type system + +A GraphQL service is created by [defining types and their fields](/learn/schema/), and then writing a function for each field to [provide the required data](/learn/execution/). For example, a GraphQL service that tells you the name of a logged-in user might look like this: + +```graphql +type Query { + me: User +} + +type User { + name: String +} +``` + +Along with functions for each field on each type: + +```js +// Resolver for the `me` field on the `Query` type +function resolveQueryMe(_parent, _args, context, _info) { + return context.request.auth.user; +} + +// Resolver for the `name` field on the `User` type +function resolveUserName(user, _args, context, _info) { + return context.db.getUserFullName(user.id); +} +``` + +In the example above, the function that provides data for the `me` field on the `Query` type uses information about the authenticated user who made the request, while the `name` field on the `User` type is populated by using that user's ID to fetch their full name from a database. + +## Query exactly what you need + +After a GraphQL service is running (typically at a URL on a web service), it can receive [GraphQL queries](/learn/queries/) to validate and execute from clients. The service first checks a query to ensure it only refers to the types and fields defined for the API and then runs the provided functions to produce a result. + +For example, the query: + +```graphql +{ + me { + name + } +} +``` + +Could produce the following JSON result: + +```json +{ + "data": { + "me": { + "name": "Luke Skywalker" + } + } +} +``` + +With even a simple query, we can see some of the key features that make GraphQL so powerful. The client can make queries to the API that mirror the structure of the data that they need and then receive just that data in the expected shape with a single request—and without having to worry about which underlying data sources provided it. + +## Evolve your API without versioning + +Client requirements change over time and GraphQL allows your API to evolve in response to those needs and without the overhead of managing different API versions. For example, if a new feature calls for more specific name values to be available, then the `User` type could be updated as follows: + +```graphql +type User { + fullName: String + nickname: String + name: String @deprecated(reason: "Use `fullName`.") +} +``` + +Client tooling will encourage developers to use the new fields and remove usage of the deprecated `name` field. The field can be removed once it is determined it is no longer used; in the meantime GraphQL will continue to provide its data as expected. + +## Try it out! + +The best way to learn GraphQL is to start writing queries. The query editors used throughout this guide are **interactive**, so try adding an `id` and `appearsIn` fields to the `hero` object to see an updated result: + +```graphql +# { "graphiql": true } +{ + hero { + name + # add additional fields here! + } +} +``` + + +The examples in this guide are based on [a modified version of the SWAPI GraphQL schema](https://github.com/graphql/graphql.github.io/blob/source/src/components/interactive-code-block/swapi-schema.tsx). Because these queries are designed for illustrative purposes, they will not run on the full version of the SWAPI GraphQL API due to differences between the two schemas. [You can try the full version of the API here.](https://graphql.org/swapi-graphql/) + + +## Next steps + +Now that you know some key GraphQL concepts, you're ready to learn about all of the different aspects of its [type system](/learn/schema/). + +For an in-depth learning experience with practical tutorials, see [the available training courses](/community/resources/training-courses). diff --git a/test/e2e/graphql-interactive.spec.ts b/test/e2e/graphql-interactive.spec.ts index fe6c26a16b..ed5a503d83 100644 --- a/test/e2e/graphql-interactive.spec.ts +++ b/test/e2e/graphql-interactive.spec.ts @@ -65,7 +65,7 @@ test.describe("Learn", () => { test("adds appearsIn field to hero query and gets correct response", async ({ page, }) => { - await page.goto("/learn") + await page.goto("/learn/introduction") await page.waitForSelector(".cm-editor", { timeout: 10000 }) const heroEditor = await findEditorByContent(page, "hero") diff --git a/vercel.json b/vercel.json index ebc5d887e0..244e7c6f2c 100644 --- a/vercel.json +++ b/vercel.json @@ -602,7 +602,7 @@ }, { "source": "/docs", - "destination": "/learn", + "destination": "/learn/introduction/", "permanent": true }, {