From ebc7cbd2231d9db147e95e226b0b82b9dc07aa5b Mon Sep 17 00:00:00 2001 From: Jory Burson Date: Fri, 16 Jan 2026 12:49:59 -0500 Subject: [PATCH 1/3] initial push of 2026 conf site --- src/app/conf/2026/_data.ts | 57 ++ src/app/conf/2026/_videos.ts | 388 +++++++++++++ .../assets/graphql-foundation-wordmark.svg | 113 ++++ .../2026/code-of-conduct/code-of-conduct.mdx | 53 ++ .../2026/code-of-conduct/opengraph-image.tsx | 10 + src/app/conf/2026/code-of-conduct/page.tsx | 99 ++++ .../become-a-sponsor/blur-blob.webp | Bin 0 -> 630866 bytes .../components/become-a-sponsor/index.tsx | 125 +++++ .../2026/components/call-for-proposals.tsx | 530 ++++++++++++++++++ .../components/cta-card-section/index.tsx | 66 +++ .../cta-card-section/logo-mask.webp | Bin 0 -> 295506 bytes .../2026/components/footer/blur-bean.webp | Bin 0 -> 615738 bytes src/app/conf/2026/components/footer/index.tsx | 152 +++++ .../components/format-speaker-position.tsx | 7 + .../gallery-strip/images/2023/1.webp | Bin 0 -> 104006 bytes .../gallery-strip/images/2023/10.webp | Bin 0 -> 61704 bytes .../gallery-strip/images/2023/11.webp | Bin 0 -> 94836 bytes .../gallery-strip/images/2023/12.webp | Bin 0 -> 105908 bytes .../gallery-strip/images/2023/13.webp | Bin 0 -> 56166 bytes .../gallery-strip/images/2023/14.webp | Bin 0 -> 103690 bytes .../gallery-strip/images/2023/2.webp | Bin 0 -> 60914 bytes .../gallery-strip/images/2023/3.webp | Bin 0 -> 67782 bytes .../gallery-strip/images/2023/4.webp | Bin 0 -> 77250 bytes .../gallery-strip/images/2023/5.webp | Bin 0 -> 84750 bytes .../gallery-strip/images/2023/6.webp | Bin 0 -> 54762 bytes .../gallery-strip/images/2023/7.webp | Bin 0 -> 119104 bytes .../gallery-strip/images/2023/8.webp | Bin 0 -> 62122 bytes .../gallery-strip/images/2023/9.webp | Bin 0 -> 96032 bytes .../gallery-strip/images/2024/1.webp | Bin 0 -> 48050 bytes .../gallery-strip/images/2024/11.webp | Bin 0 -> 51570 bytes .../gallery-strip/images/2024/12.webp | Bin 0 -> 62286 bytes .../gallery-strip/images/2024/13.webp | Bin 0 -> 49346 bytes .../gallery-strip/images/2024/2.webp | Bin 0 -> 65076 bytes .../gallery-strip/images/2024/3.webp | Bin 0 -> 78116 bytes .../gallery-strip/images/2024/4.webp | Bin 0 -> 57634 bytes .../gallery-strip/images/2024/6.webp | Bin 0 -> 42868 bytes .../gallery-strip/images/2024/7.webp | Bin 0 -> 41514 bytes .../gallery-strip/images/2024/8.webp | Bin 0 -> 42044 bytes .../gallery-strip/images/2024/9.webp | Bin 0 -> 50790 bytes .../components/gallery-strip/images/index.ts | 56 ++ .../2026/components/gallery-strip/index.tsx | 84 +++ .../components/get-your-ticket/blur-bean.webp | Bin 0 -> 5276550 bytes .../2026/components/get-your-ticket/index.tsx | 74 +++ .../get-your-ticket/ticket-period.tsx | 91 +++ .../get-your-ticket/ticket-periods.tsx | 55 ++ .../components/graphql-conf-logo-link.tsx | 52 ++ .../components/graphql-foundation-card.tsx | 20 + .../components/hero/blur-bean-cropped.webp | Bin 0 -> 914356 bytes .../conf/2026/components/hero/hero-image.tsx | 18 + .../conf/2026/components/hero/hero-photo.jpeg | Bin 0 -> 541125 bytes src/app/conf/2026/components/hero/index.tsx | 132 +++++ src/app/conf/2026/components/image-loaded.tsx | 42 ++ .../2026/components/marquee-rows/blur.webp | Bin 0 -> 134962 bytes .../2026/components/marquee-rows/index.tsx | 92 +++ src/app/conf/2026/components/navbar.tsx | 158 ++++++ .../conference-opengraph-image-header.tsx | 171 ++++++ .../og-images/generic-opengraph-image.tsx | 80 +++ .../og-images/graphql-logo-stripes.png | Bin 0 -> 193589 bytes .../normalize-protocol-relative-url.tsx | 6 + .../og-images/opengraph-image-footer.tsx | 34 ++ .../og-images/session-opengraph-image.tsx | 210 +++++++ .../og-images/simple-opengraph-image.tsx | 38 ++ .../og-images/speaker-opengraph-image.tsx | 176 ++++++ .../components/register-section/index.tsx | 90 +++ .../2026/components/register-today/index.tsx | 54 ++ .../components/register-today/speaker.webp | Bin 0 -> 138084 bytes src/app/conf/2026/components/session-tags.tsx | 42 ++ .../2026/components/speaker-card.module.css | 84 +++ src/app/conf/2026/components/speaker-card.tsx | 130 +++++ .../conf/2026/components/speaker-links.tsx | 58 ++ src/app/conf/2026/components/speaker-tags.tsx | 39 ++ src/app/conf/2026/components/sponsors.tsx | 120 ++++ .../2026/components/testimonials/index.tsx | 170 ++++++ .../2026/components/testimonials/mask.webp | Bin 0 -> 2236 bytes .../conf/2026/components/top-minds/index.tsx | 206 +++++++ src/app/conf/2026/components/venue/index.tsx | 153 +++++ .../2026/components/venue/location-photo.webp | Bin 0 -> 468486 bytes .../conf/2026/components/what-to-expect.tsx | 37 ++ src/app/conf/2026/faq.tsx | 242 ++++++++ src/app/conf/2026/layout.tsx | 81 +++ src/app/conf/2026/links.ts | 8 + src/app/conf/2026/opengraph-image.tsx | 10 + src/app/conf/2026/page.tsx | 100 ++++ src/app/conf/2026/resources/client-mdx.tsx | 30 + .../conf/2026/resources/opengraph-image.tsx | 10 + src/app/conf/2026/resources/page.tsx | 45 ++ src/app/conf/2026/resources/prose.css | 52 ++ src/app/conf/2026/resources/resources.mdx | 125 +++++ .../schedule/[id]/format-description.test.tsx | 56 ++ .../2026/schedule/[id]/format-description.tsx | 48 ++ .../2026/schedule/[id]/opengraph-image.tsx | 46 ++ src/app/conf/2026/schedule/[id]/page.tsx | 305 ++++++++++ .../conf/2026/schedule/[id]/session-video.tsx | 64 +++ .../2026/schedule/_components/back-link.tsx | 27 + .../2026/schedule/_components/filters.tsx | 255 +++++++++ .../_components/format-block-time.tsx | 15 + .../schedule/_components/schedule-list.tsx | 348 ++++++++++++ .../_components/schedule-session-card.tsx | 262 +++++++++ .../_components/use-current-time-marker.ts | 45 ++ .../conf/2026/schedule/opengraph-image.tsx | 10 + src/app/conf/2026/schedule/page.tsx | 70 +++ .../2026/speakers/[id]/long-session-card.tsx | 232 ++++++++ .../2026/speakers/[id]/opengraph-image.tsx | 46 ++ src/app/conf/2026/speakers/[id]/page.tsx | 228 ++++++++ .../conf/2026/speakers/opengraph-image.tsx | 10 + src/app/conf/2026/speakers/page.tsx | 64 +++ src/app/conf/2026/utils.ts | 62 ++ 107 files changed, 7268 insertions(+) create mode 100644 src/app/conf/2026/_data.ts create mode 100644 src/app/conf/2026/_videos.ts create mode 100644 src/app/conf/2026/assets/graphql-foundation-wordmark.svg create mode 100644 src/app/conf/2026/code-of-conduct/code-of-conduct.mdx create mode 100644 src/app/conf/2026/code-of-conduct/opengraph-image.tsx create mode 100644 src/app/conf/2026/code-of-conduct/page.tsx create mode 100644 src/app/conf/2026/components/become-a-sponsor/blur-blob.webp create mode 100644 src/app/conf/2026/components/become-a-sponsor/index.tsx create mode 100644 src/app/conf/2026/components/call-for-proposals.tsx create mode 100644 src/app/conf/2026/components/cta-card-section/index.tsx create mode 100644 src/app/conf/2026/components/cta-card-section/logo-mask.webp create mode 100644 src/app/conf/2026/components/footer/blur-bean.webp create mode 100644 src/app/conf/2026/components/footer/index.tsx create mode 100644 src/app/conf/2026/components/format-speaker-position.tsx create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/1.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/10.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/11.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/12.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/13.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/14.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/2.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/3.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/4.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/5.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/6.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/7.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/8.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2023/9.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/1.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/11.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/12.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/13.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/2.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/3.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/4.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/6.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/7.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/8.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/2024/9.webp create mode 100644 src/app/conf/2026/components/gallery-strip/images/index.ts create mode 100644 src/app/conf/2026/components/gallery-strip/index.tsx create mode 100644 src/app/conf/2026/components/get-your-ticket/blur-bean.webp create mode 100644 src/app/conf/2026/components/get-your-ticket/index.tsx create mode 100644 src/app/conf/2026/components/get-your-ticket/ticket-period.tsx create mode 100644 src/app/conf/2026/components/get-your-ticket/ticket-periods.tsx create mode 100644 src/app/conf/2026/components/graphql-conf-logo-link.tsx create mode 100644 src/app/conf/2026/components/graphql-foundation-card.tsx create mode 100644 src/app/conf/2026/components/hero/blur-bean-cropped.webp create mode 100644 src/app/conf/2026/components/hero/hero-image.tsx create mode 100644 src/app/conf/2026/components/hero/hero-photo.jpeg create mode 100644 src/app/conf/2026/components/hero/index.tsx create mode 100644 src/app/conf/2026/components/image-loaded.tsx create mode 100644 src/app/conf/2026/components/marquee-rows/blur.webp create mode 100644 src/app/conf/2026/components/marquee-rows/index.tsx create mode 100644 src/app/conf/2026/components/navbar.tsx create mode 100644 src/app/conf/2026/components/og-images/conference-opengraph-image-header.tsx create mode 100644 src/app/conf/2026/components/og-images/generic-opengraph-image.tsx create mode 100644 src/app/conf/2026/components/og-images/graphql-logo-stripes.png create mode 100644 src/app/conf/2026/components/og-images/normalize-protocol-relative-url.tsx create mode 100644 src/app/conf/2026/components/og-images/opengraph-image-footer.tsx create mode 100644 src/app/conf/2026/components/og-images/session-opengraph-image.tsx create mode 100644 src/app/conf/2026/components/og-images/simple-opengraph-image.tsx create mode 100644 src/app/conf/2026/components/og-images/speaker-opengraph-image.tsx create mode 100644 src/app/conf/2026/components/register-section/index.tsx create mode 100644 src/app/conf/2026/components/register-today/index.tsx create mode 100644 src/app/conf/2026/components/register-today/speaker.webp create mode 100644 src/app/conf/2026/components/session-tags.tsx create mode 100644 src/app/conf/2026/components/speaker-card.module.css create mode 100644 src/app/conf/2026/components/speaker-card.tsx create mode 100644 src/app/conf/2026/components/speaker-links.tsx create mode 100644 src/app/conf/2026/components/speaker-tags.tsx create mode 100644 src/app/conf/2026/components/sponsors.tsx create mode 100644 src/app/conf/2026/components/testimonials/index.tsx create mode 100644 src/app/conf/2026/components/testimonials/mask.webp create mode 100644 src/app/conf/2026/components/top-minds/index.tsx create mode 100644 src/app/conf/2026/components/venue/index.tsx create mode 100644 src/app/conf/2026/components/venue/location-photo.webp create mode 100644 src/app/conf/2026/components/what-to-expect.tsx create mode 100644 src/app/conf/2026/faq.tsx create mode 100644 src/app/conf/2026/layout.tsx create mode 100644 src/app/conf/2026/links.ts create mode 100644 src/app/conf/2026/opengraph-image.tsx create mode 100644 src/app/conf/2026/page.tsx create mode 100644 src/app/conf/2026/resources/client-mdx.tsx create mode 100644 src/app/conf/2026/resources/opengraph-image.tsx create mode 100644 src/app/conf/2026/resources/page.tsx create mode 100644 src/app/conf/2026/resources/prose.css create mode 100644 src/app/conf/2026/resources/resources.mdx create mode 100644 src/app/conf/2026/schedule/[id]/format-description.test.tsx create mode 100644 src/app/conf/2026/schedule/[id]/format-description.tsx create mode 100644 src/app/conf/2026/schedule/[id]/opengraph-image.tsx create mode 100644 src/app/conf/2026/schedule/[id]/page.tsx create mode 100644 src/app/conf/2026/schedule/[id]/session-video.tsx create mode 100644 src/app/conf/2026/schedule/_components/back-link.tsx create mode 100644 src/app/conf/2026/schedule/_components/filters.tsx create mode 100644 src/app/conf/2026/schedule/_components/format-block-time.tsx create mode 100644 src/app/conf/2026/schedule/_components/schedule-list.tsx create mode 100644 src/app/conf/2026/schedule/_components/schedule-session-card.tsx create mode 100644 src/app/conf/2026/schedule/_components/use-current-time-marker.ts create mode 100644 src/app/conf/2026/schedule/opengraph-image.tsx create mode 100644 src/app/conf/2026/schedule/page.tsx create mode 100644 src/app/conf/2026/speakers/[id]/long-session-card.tsx create mode 100644 src/app/conf/2026/speakers/[id]/opengraph-image.tsx create mode 100644 src/app/conf/2026/speakers/[id]/page.tsx create mode 100644 src/app/conf/2026/speakers/opengraph-image.tsx create mode 100644 src/app/conf/2026/speakers/page.tsx create mode 100644 src/app/conf/2026/utils.ts diff --git a/src/app/conf/2026/_data.ts b/src/app/conf/2026/_data.ts new file mode 100644 index 0000000000..66ded603c2 --- /dev/null +++ b/src/app/conf/2026/_data.ts @@ -0,0 +1,57 @@ +import "server-only" + +import { SchedSpeaker, ScheduleSession } from "@/app/conf/2023/types" +import { readSpeakers } from "../_api/sched-data" + +const speakersData = require("../../../../scripts/sync-sched/speakers.json") +const equalitySets: string[][] = speakersData.equal || [] + +export const schedule: ScheduleSession[] = require("../../../../scripts/sync-sched/schedule-2025.json") + +type SpeakerUsername = SchedSpeaker["username"] + +export const speakerSessions = new Map() + +for (const session of schedule) { + for (const speaker of session.speakers || []) { + if (!speakerSessions.has(speaker.username)) { + speakerSessions.set(speaker.username, []) + } + + 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") + + collectSessionsFromPreviousYears(schedule2023) + collectSessionsFromPreviousYears(schedule2024) +} + +function collectSessionsFromPreviousYears(schedule: ScheduleSession[]) { + for (const session of schedule) { + for (const speaker of session.speakers || []) { + const duplicates = equalitySets.find(set => + set.includes(speaker.username), + ) + + for (const username of duplicates || [speaker.username]) { + if (!previousEditionSessions.has(username)) { + previousEditionSessions.set(username, []) + } + previousEditionSessions.get(username)!.push(session) + } + } + } +} diff --git a/src/app/conf/2026/_videos.ts b/src/app/conf/2026/_videos.ts new file mode 100644 index 0000000000..8f4fe7b87a --- /dev/null +++ b/src/app/conf/2026/_videos.ts @@ -0,0 +1,388 @@ +/** + * This was populated with data captured via: + * + * https://developers.google.com/youtube/v3/docs/playlistItems/list + * + * with: + * + * - part: snippet + * - maxResults: 50 + * - playlistId: UUIVbABX6aSk5hy5UPAhQdmQ + * + * And then also adding `pageToken` for the second request to get the second + * page. + * + * Note that the playlistId is the ID of the "Uploads" playlist for the + * "GraphQLFoundationTalks" channel. + * + * Since the videos are unlisted it needed to be authenticated with the + * https://www.googleapis.com/auth/youtube.readonly scope. This is also + * why we couldn't use the generate-videos-mappings.py script. + * + * Then we simply mapped over the results: + * + * ```js + * for (const item of data.items) { + * const id = item.snippet.resourceId.videoId; + * const title = item.snippet.title + * videos.push({ id, title }) + * } + * ``` + */ +export const videos: { + id: string + title: string +}[] = [ + { + id: "-ZpCOOf_fYE", + title: "Relay Migration API at Pinterest - Mauricio Montalvo, Pinterest", + }, + { + id: "Orgyp3xOqwY", + title: + "LinkedIn's Code-First Approach To Federated GraphQL With gRPC - Ethan Shen & Spencer Kwok, LinkedIn", + }, + { + id: "UiTHTDNE5GQ", + title: + "Breaking the Monolith: Our Journey From Proto To Federated GraphQL at Scale - Mansi Mittal", + }, + { + id: "LBUSHL31MpI", + title: + "Deep Dive Into a GraphQL Federation Gateway, From Query Planning To the Execution - Benjamin Rabier", + }, + { + id: "tHXSmuoTcFg", + title: + "Rebuilding Buffer's Public API - Amanda Marochko & Joe Birch, Buffer", + }, + { + id: "hz0bGBaEKNQ", + title: "Local Data Consistency With GraphQL - Sabrina Wasserman, Meta", + }, + { + id: "afKv3qzLpvc", + title: "Hacking the Federation Query Planner - Mark Larah, Yelp", + }, + { + id: "PcbHYunr-gc", + title: + "LLMs + GraphQL + MCP: A Blueprint for Scalable AI Tooling - Erik Wrede & Thore Koritzius", + }, + { + id: "DoD7KJpiIkM", + title: "Proven Schema Designs and Best-practices - Jeff Dolle, The Guild", + }, + { + id: "3_se3lJn-0o", + title: + "Lightning Talk: Efficient Semantic Comparison of GraphQL Queries - Derek Kuc, Apollo GraphQL", + }, + { + id: "grfAL6RYBPE", + title: + 'Lightning Talk: "Please Migrate Away From Field X To Field Y Before Z" - A Story on... Rick Bijkerk', + }, + { + id: "rKxC4EJYGKo", + title: "The Two GraphQLs - Andrei Bocan & Andreas Marek, Atlassian", + }, + { + id: "g76iuFsi2C0", + title: + "Smarter Caching With Events: Targeted Invalidation in Federated Graphs - Juan Carlos Blanco Delgado", + }, + { + id: "nmBGLw_vZo8", + title: + "Safely Roll Out Strict Error Handling in Your GraphQL Codebase - Itamar Kestenbaum, Meta", + }, + { + id: "bL2JCd1lo80", + title: "From Data Loaders To Batch Resolvers - Aileen Chen, Airbnb", + }, + { + id: "AGVEV53fVEo", + title: + "One API Definition To Rule Them All: Generating GraphQL Schemas From TypeSpec - Fiona Huang", + }, + { + id: "ttmp_zkHH_0", + title: + "Lightning Talk: What If GraphQL Knew Accessibility? - Vanessa Johnson, The New York Times", + }, + { + id: "HK_TvL5jr0k", + title: + "Lightning Talk: Hello Graffle! A Modular Type Safe GraphQL Client - Jason Kuhrt, The Guild", + }, + { + id: "DcoI9HusjP0", + title: + "Keynote: Closing Remarks - Lee Byron, Co-Creator of GraphQL & Director, GraphQL Foundation", + }, + { + id: "LZQbu6wQfLs", + title: + "Keynote: What Is the GraphQL Foundation? - Jeff Auriemma, Senior Engineering Manager, Apollo GraphQL", + }, + { + id: "niizRUy-2Yk", + title: + "“One Schema To Rule Them All”: Simplifying 10+ Mediaset Apps With One Single GraphQL S... Marco Reni", + }, + { + id: "AIdqMIHR098", + title: + "Instagram’s REST To GraphQL Migrat... Xiao Han, Chi Chan, Anirudh Padmarao, Lisa Watkins & Curtis Li", + }, + { + id: "PUMPLX1pcGc", + title: + "Reintroducing Apollo Client: V4 and Beyond - Lenz Weber-Tronic, Apollo GraphQL", + }, + { + id: "3GWZ9yiskFk", + title: + "GraphQL in a World of Full-stack, Rich Clients: The Next Evolution - Robert Balicki, Pinterest", + }, + { + id: "uGlA_vN3P2g", + title: + "Lightning Talk: GraphQL Caching Lightning Talk - Emily Goodwin, Independent", + }, + { + id: "QsDfSSKPq9g", + title: + "Lightning Talk: Next-Generation GraphQL Cache Management in Your Android and iOS Apps - Benoit Lubek", + }, + { + id: "BY6Dd-eygq4", + title: + "Grats: Bringing Implementation-First GraphQL to TypeScript - Jordan Eldredge, Meta", + }, + { + id: "1sbK2t9JJGo", + title: + "From Hobby Project To Industry Standard: Lessons From 10 Years of Grap... Donna Zhou & Andreas Marek", + }, + { + id: "NUYMJbQc7Vs", + title: + 'Workshop: Social Media App "Y" with GraphQL, Relay, and React Server Components... Saihajpreet Singh', + }, + { + id: "zw15cuj5gww", + title: + "Avoiding the Monolith Trap: Lessons from Airbnb’s Multi-Tenant GraphQL Platform - Adam Miskiewicz", + }, + { + id: "94Nz2B6ETD8", + title: "Compose Your Mobile App With GraphQL - Martin Bonnin, Apollo", + }, + { + id: "cRTYf59rYMU", + title: + "GraphQL Isn't Just for Enterprises: The New King of Fullstack Typescript Application... Alec Aivazis", + }, + { + id: "H-FyKa4VaOY", + title: + "Breaking and Building Boundaries: Securing Federated GraphQL - Yehuda Rosenberg, JFrog", + }, + { + id: "O3PudaSzRh4", + title: + "Unlocking Federation Security at Scale in Booking.com - Sanver Tarmur & Minghe Huang, Booking.com", + }, + { + id: "NH6unhX6BZQ", + title: + "Streamlining Data Collection and Entity Management for Amazon's Buyer Abuse Preven... Adam Cervantes", + }, + { + id: "y_Ekm3dF3qI", + title: "@async: Defer Even More! - Matt Mahoney, Meta", + }, + { + id: "WTSY3mgXKiQ", + title: "Performant GraphQL at Scale - Andreas Marek, Atlassian", + }, + { + id: "IlAfS5oMiHM", + title: + "Imagining GraphQL 2.0: Choices in a Hypothetic... Kewei Qu, Curtis Li, Benjie Gillam & Martin Bonnin", + }, + { + id: "zUVm45MKrS8", + title: "Lower Latency With Streaming GraphQL - Rob Richard, 1stDibs", + }, + { + id: "Ggmsij69xNY", + title: "The State of GraphQL Open Telemetry - Pascal Senn, ChilliCream", + }, + { + id: "XKeGtImv4Ew", + title: + "The State of GraphQL Federation - Michael Staib, ChilliCream & Martijn Walraven, Apollo", + }, + { + id: "4rALfQ-SBrM", + title: + "Namespacing Is the Next Frontier of GraphQL Federation - Martijn Walraven, Apollo", + }, + { + id: "odwQUAkmW44", + title: + "Fixing GraphQL's Biggest Mistake in 512 Bytes - Benjie Gillam, Graphile", + }, + { + id: "c2Jgh3GD_Jo", + title: "GraphQL All Hands Meeting", + }, + { + id: "eLz-TADWm0Q", + title: "Workshop: Composite Schemas in Action - Michael Staib, Chillicream", + }, + { + id: "1RNzqXBNSzM", + title: + "Workshop: Unleash the Power of Federation with Hive Gateway - Denis Badurina & Arda Tanrıkulu", + }, + { + id: "lFrm-nR-TXs", + title: + "Workshop: Beyond GraphQL Federation: How We Use Composite Schemas and... Benjamin Rabier & Tom Houlé", + }, + { + id: "jJLRnjtQZDQ", + title: + "Workshop: Apollo Router & MCP: A Modern Agentic Development Approach - Michael Watson", + }, + { + id: "hX70dcYeIrA", + title: + "Building a Kotlin Federated GraphQL Gateway and Executor - Samuel Bernardo Vázquez Andalón", + }, + { + id: "2LsaClmcw7s", + title: + "Building an Open-Source Federation Query Planner & Router - Dotan Simha & Kamil Kisiela, The Guild", + }, + { + id: "hZQZrXk8dUE", + title: + "Lightning Talk: Authorization in Federated GraphQL - Tom Houlé, Grafbase", + }, + { + id: "smqavgkzwlI", + title: + "Lightning Talk: The Federated GraphQL Subscriptions Zoo - Tom Houlé, Grafbase", + }, + { + id: "1p2OAsYdUV0", + title: "Event Sourcing + GraphQL = ♥️ - Mike Astle, Xolvio", + }, + { + id: "gUs0Zj28geM", + title: + "Composing Your UI With GraphQL: Building Federated Component Systems That Sca... Gabriel Cura-Castro", + }, + { + id: "euaUo-vJBKc", + title: + "From Docs To Conversation & Action - Daniel Hai & Dipro Bhowmik, monday.com", + }, + { + id: "1fwiLhSW-2Y", + title: + "Sponsored Session: Building the Ideal GraphQL Server Workflow Featuring GraphQL Code... Eddy Nguyen", + }, + { + id: "pL8DhC5iJCM", + title: + "Lightning Talk: See the Graph in GraphQL: Graph Visualization in Action - Ivan Goncharov, KeenEthics", + }, + { + id: "LgXtJymMp3U", + title: + "Lightning Talk: Offset Pagination Is Dead! Meet Relative Cursors - Michael Staib, ChilliCream", + }, + { + id: "vVLbh0n27m0", + title: + "What’s Missing in Your Graph? Using AI to Uncover and Close Gaps - Christian Ernst, Booking.com", + }, + { + id: "FINsHIb0p0g", + title: "Death, Taxes, and Deprecation - Stephen Spalding, Netflix", + }, + { + id: "yInL1aPZjvI", + title: "The Big Ideas in Relay - Jordan Eldredge, Meta", + }, + { + id: "kA55fNCyNJk", + title: + "From Private To Public: Evolving a GraphQL API for the Outside World - Laurin Quast, The Guild", + }, + { + id: "jlpH9nz_0tw", + title: + "GraphQL Performance Issues at Netflix Scale - Stephen Chambers, Netflix", + }, + { + id: "fsoWxaWqcrA", + title: "Rethinking GraphQL Execution - Raymie Stata, Airbnb", + }, + { + id: "sNWe4wH67cE", + title: + "GraphQL Subscriptions Are Stateful; We Made Them Stateless - Matteo Collina, Platformatic", + }, + { + id: "gMCh8jRVMiQ", + title: + "How To Use Fragments (They're Not for Re-use!) - Janette Cheng, Meta", + }, + { + id: "Ot6O100VzQs", + title: + "Panel: APIs for AIs - Kewei Qu, Fredrik Björk, Boris Besemer, Michael Watson & Stephen Spalding", + }, + { + id: "zmKFUDemcJ8", + title: + "Sponsored Session: Schema Design Patterns: Leveraging Existing REST APIs for Rapid... Michael Watson", + }, + { + id: "u7C1bmB_TYg", + title: + "Keynote: How GraphQL is Redefining API Orchestration for the AI Era - Matt DeBergalis", + }, + { + id: "wM-wGpDxNb0", + title: + "Keynote: GraphQL at Meta - Jordan Eldredge, Software Engineer, Meta", + }, + { + id: "hQAuXJd15zM", + title: + "Keynote: Reimagining Developer Experience for AI-Native Development - Sarah Sanders", + }, + { + id: "IveEY_j9T8k", + title: + "Keynote: Community Update 2025: Growing in the Open - Benjie Gillam, Jem Gillam & Uri Goldshtein", + }, + { + id: "-pO67dMaB-U", + title: + "Keynote: Opening Remarks - Lee Byron, Co-Creator of GraphQL & Director, GraphQL Foundation", + }, + { + id: "UA9AQWJqWfc", + title: "Keynote: Welcome Remarks - Sarah Sanders, Technical Writer, Docker", + }, +] diff --git a/src/app/conf/2026/assets/graphql-foundation-wordmark.svg b/src/app/conf/2026/assets/graphql-foundation-wordmark.svg new file mode 100644 index 0000000000..8ecff1b893 --- /dev/null +++ b/src/app/conf/2026/assets/graphql-foundation-wordmark.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/conf/2026/code-of-conduct/code-of-conduct.mdx b/src/app/conf/2026/code-of-conduct/code-of-conduct.mdx new file mode 100644 index 0000000000..5909350faa --- /dev/null +++ b/src/app/conf/2026/code-of-conduct/code-of-conduct.mdx @@ -0,0 +1,53 @@ +The Linux Foundation and its project communities are dedicated to providing a harassment-free experience for participants at all of our events, whether they are held in person or virtually. Linux Foundation events are working conferences intended for professional networking and collaboration within the open source community. They exist to encourage the open exchange of ideas and expression and require an environment that recognizes the inherent worth of every person and group. While at Linux Foundation events or related ancillary or social events, any participants, including members, speakers, attendees, volunteers, sponsors, exhibitors, booth staff and anyone else, must not engage in harassment in any form. + +This Code of Conduct may be revised at any time by The Linux Foundation and the terms are non-negotiable. Your registration for or attendance at any Linux Foundation event, whether it's held in person or virtually, indicates your agreement to abide by this policy and its terms. + + +## Expected Behavior + +All event participants, whether they are attending an in-person event or a virtual event, are expected to behave in accordance with professional standards, with both this Code of Conduct as well as their respective employer's policies governing appropriate workplace behavior and applicable laws. + + +## Unacceptable Behavior + +Harassment will not be tolerated in any form, whether in person or virtually, including, but not limited to, harassment based on gender, gender identity and expression, sexual orientation, disability, physical appearance, body size, race, age, religion or any other status protected by laws in which the conference or program is being held. Harassment includes the use of abusive, offensive or degrading language, intimidation, stalking, harassing photography or recording, inappropriate physical contact, sexual imagery and unwelcome sexual advances or requests for sexual favors. Any report of harassment at one of our events, whether in person or virtual, will be addressed immediately. Participants asked to stop any harassing behavior are expected to comply immediately. Anyone who witnesses or is subjected to unacceptable behavior should notify a conference organizer at once. + +Individuals who participate (or plan to participate) in Linux Foundation events, whether its an in-person event or a virtual event, should conduct themselves at all times in a manner that comports with both the letter and spirit of this policy prohibiting harassment and abusive behavior, whether before, during or after the event. This includes statements made in social media postings, on-line publications, text messages, and all other forms of electronic communication. + +Speakers should not use sexual language, images, or any language or images that would constitute harassment as defined above in their talks. Exhibitor booths serve as a platform for presenting businesses and/or projects and should maintain a professional and inclusive presence; therefore, the use of sexualized images, activities, materials, or attire, including costumes and uniforms that contribute to a sexualized environment, is strictly prohibited. Additionally, booths must not be utilized for political campaigning or promoting political causes, including the display or engagement in activities or materials that support such endeavors. + + +## Consequences of Unacceptable Behavior + +If a participant engages in harassing behavior, whether in person or virtually, the conference organizers may take any action they deem appropriate depending on the circumstances, ranging from issuance of a warning to the offending individual to expulsion from the conference with no refund. The Linux Foundation reserves the right to exclude any participant found to be engaging in harassing behavior from participating in any further Linux Foundation events, trainings or other activities. + +If a participant (or individual wishing to participate in a Linux Foundation event, in-person and/or virtual), through postings on social media or other online publications or another form of electronic communication, engages in conduct that violates this policy, whether before, during or after a Linux Foundation event, The Linux Foundation may take appropriate corrective action, which could include imposing a temporary or permanent ban on an individual's participation in future Linux Foundation events. + + +## What To Do If You Witness or Are Subject To Unacceptable Behavior + +If you are being harassed, notice that someone else is being harassed, or have any other concerns relating to harassment, please contact a member of the conference staff immediately. You are also encouraged to contact Angela Brown, Senior VP & General Manager of Events, at [angela@linuxfoundation.org](mailto:angela@linuxfoundation.org). + + +## Incident Response + +Our staff has taken incident response training and responds to harassment reports quickly and thoroughly. As referenced above, if a participant engages in harassing behavior, whether in-person or virtually, the conference organizers may take any action they deem appropriate, ranging from issuance of a warning to the offending individual to expulsion from the conference with no refund, depending on the circumstances. The Linux Foundation reserves the right to exclude any participant found to be engaging in harassing behavior from participating in any further Linux Foundation events, trainings or other activities. + +Conference staff will also provide support to victims, including, but not limited to: +- Providing an Escort +- Contacting Hotel/Venue Security or Local Law Enforcement +- Briefing Key Event Staff For Response/Victim Assistance +- And otherwise assisting those experiencing harassment to ensure that they feel safe for the duration of the conference. + + +## Health and Safety Requirements + +It is necessary for all attendees to cooperate and protect one another. For this reason, The Linux Foundation's events may have health and safety requirements (the "Health and Safety Requirements"). The specific requirements may vary from event to event, and will be communicated in writing prior to and during the event. + +If an attendee fails to comply with any of the Health and Safety Requirements, The Linux Foundation may (but is not obligated to) take appropriate corrective action, which could include immediate removal from the event and venue without a refund, and/or imposing a temporary or permanent ban on an individual's participation in future Linux Foundation events. + + +## Pre-Event Concerns + +If you are planning to attend an upcoming event, whether in-person or virtually and have concerns regarding another individual who may be present, please contact Angela Brown ([angela@linuxfoundation.org](mailto:angela@linuxfoundation.org)). Precautions will be taken to ensure your comfort and safety, including, but not limited to providing an escort, prepping onsite event staff, keeping victim and harasser from attending the same talks/social events and providing onsite contact cell phone numbers for immediate contact. + diff --git a/src/app/conf/2026/code-of-conduct/opengraph-image.tsx b/src/app/conf/2026/code-of-conduct/opengraph-image.tsx new file mode 100644 index 0000000000..84f732fc7c --- /dev/null +++ b/src/app/conf/2026/code-of-conduct/opengraph-image.tsx @@ -0,0 +1,10 @@ +import { SimpleOpengraphImage } from "../components/og-images/simple-opengraph-image" +export { + generateStaticParams, + contentType, + size, +} from "../components/og-images/simple-opengraph-image" + +export default SimpleOpengraphImage.bind(null, { + pageTitle: "Code of Conduct", +}) diff --git a/src/app/conf/2026/code-of-conduct/page.tsx b/src/app/conf/2026/code-of-conduct/page.tsx new file mode 100644 index 0000000000..0bfddd32c2 --- /dev/null +++ b/src/app/conf/2026/code-of-conduct/page.tsx @@ -0,0 +1,99 @@ +import type { Metadata } from "next" +import clsx from "clsx" + +import { Anchor } from "@/app/conf/_design-system/anchor" +import { ServerComponentMarkdown } from "@/app/conf/_components/server-component-markdown" +import { Button } from "@/app/conf/_design-system/button" + +import { NavbarPlaceholder } from "../components/navbar" +import { Hero, HeroStripes } from "../components/hero" +import "../resources/prose.css" + +import markdown from "./code-of-conduct.mdx?raw" + +export const metadata: Metadata = { + title: "Code of Conduct | GraphQLConf 2026", +} + +const components = { + a: (props: React.AnchorHTMLAttributes) => { + return ( + + ) + }, + ul: (props: React.HTMLAttributes) => { + return