Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/app/day/2026/[city]/talks/[id]/opengraph-image.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { findDayTalk, getDayTalkParams } from "../../../day-events"
import { TalkOpengraphImage } from "../../../components/og-images/talk-opengraph-image"
export {
contentType,
size,
} from "../../../components/og-images/talk-opengraph-image"

export const dynamicParams = false

export function generateStaticParams() {
return getDayTalkParams()
}

export default function Image({
params,
}: {
params: { city: string; id: string }
}) {
const talk = findDayTalk(params.city, params.id)
if (!talk) {
throw new Error(`Talk not found: ${params.city}/${params.id}`)
}
return TalkOpengraphImage(talk)
}
101 changes: 101 additions & 0 deletions src/app/day/2026/[city]/talks/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { Metadata } from "next"
import { notFound } from "next/navigation"

import { formatDescription } from "@/app/conf/2026/schedule/[id]/format-description"

import { findDayTalk, getDayTalkParams } from "../../../day-events"
import { NavbarPlaceholder } from "../../../components/navbar"
import { BackLink } from "../../../components/schedule/back-link"
import {
Hr,
SessionHeader,
SessionSpeakers,
} from "../../../components/event-schedule-section"

type TalkProps = { params: { city: string; id: string } }

export const dynamicParams = false

export function generateStaticParams() {
return getDayTalkParams()
}

export function generateMetadata({ params }: TalkProps): Metadata {
const talk = findDayTalk(params.city, params.id)
if (!talk) notFound()

const { event, session } = talk
const speakers = session.speakers.map(s => s.name).join(", ")
const description = session.description
.replace(/<[^>]+>/g, " ")
.replace(/&[lr]dquo;/g, '"')
.replace(/&amp;/g, "&")
.replace(/\s+/g, " ")
.trim()

return {
title: session.title,
description: speakers ? `${speakers}: ${description}` : description,
keywords: [
event.city,
...session.tags,
...session.speakers.map(s => s.name),
],
}
}

export default function TalkPage({ params }: TalkProps) {
const talk = findDayTalk(params.city, params.id)
if (!talk) notFound()

const { event, session } = talk

return (
<>
<NavbarPlaceholder className="top-0 bg-neu-100 before:bg-white/30 dark:bg-neu-50/50 dark:before:bg-blk/40" />
<main className="gql-all-anchors-focusable overflow-hidden border-b border-neu-200 bg-neu-50 dark:border-neu-100 dark:bg-neu-50/25">
<div className="gql-container">
<div className="gql-section !py-0 max-xs:px-0">
<article className="border-neu-200 pt-8 dark:border-neu-100 xs:border-x 2xl:pt-16">
<div className="px-2 sm:px-3">
<BackLink
href={`/day/2026/${params.city}/#schedule`}
label={`GraphQL Day ${event.city} schedule`}
/>
</div>
<SessionHeader
session={session}
heading={
<h1 className="typography-h2 mb-6 mt-8">{session.title}</h1>
}
timezone={event.timezone}
tagColors={event.tagColors}
className="px-2 pb-8 sm:px-3 lg:pb-12"
/>
{session.description && (
<>
<Hr />
<div
className="typography-body-lg px-2 py-8 sm:px-3 lg:py-12 [&>p+p]:mt-4 [&_a]:break-words"
dangerouslySetInnerHTML={{
__html: formatDescription(session.description),
}}
/>
</>
)}
{session.speakers.length > 0 && (
<>
<Hr />
<SessionSpeakers
speakers={session.speakers}
className="-mx-px -mb-px"
/>
</>
)}
</article>
</div>
</div>
</main>
</>
)
}
7 changes: 2 additions & 5 deletions src/app/day/2026/amsterdam/opengraph-image.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { SimpleOpengraphImage } from "../components/og-images/simple-opengraph-image"
import { dayEvents } from "../day-events"
export {
generateStaticParams,
contentType,
size,
} from "../components/og-images/simple-opengraph-image"

export default SimpleOpengraphImage.bind(null, {
pageTitle: "Amsterdam",
date: "Jun 9-10, 2026",
location: "Tolhuistuin, Amsterdam",
})
export default SimpleOpengraphImage.bind(null, dayEvents.amsterdam)
1 change: 1 addition & 0 deletions src/app/day/2026/amsterdam/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export default function AmsterdamPage() {
<div className="gql-container gql-conf-navbar-strip text-neu-900 before:bg-white/40 before:dark:bg-blk/30">
<WhyAttendSection />
<EventScheduleSection
city="amsterdam"
sessions={amsterdamSessions}
timezone={AMSTERDAM_TIMEZONE}
timezoneLabel={AMSTERDAM_TIMEZONE_LABEL}
Expand Down
14 changes: 7 additions & 7 deletions src/app/day/2026/amsterdam/schedule-data.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import ivanJancicAvatar from "./speakers/ivan-jancic.webp"
import christianErnstAvatar from "./speakers/christian-ernst.webp"
import jensNeuseAvatar from "./speakers/jens-neuse.webp"
import martinBonninAvatar from "./speakers/martin-bonnin.webp"
import michaelStaibAvatar from "./speakers/michael-staib.webp"
import thoreKoritziusAvatar from "./speakers/thore-koritzius.webp"
import pascalSennAvatar from "./speakers/pascal-senn.webp"
import ivanJancicAvatar from "./speakers/ivan-jancic.jpg"
import christianErnstAvatar from "./speakers/christian-ernst.jpg"
import jensNeuseAvatar from "./speakers/jens-neuse.jpg"
import martinBonninAvatar from "./speakers/martin-bonnin.jpg"
import michaelStaibAvatar from "./speakers/michael-staib.jpg"
import thoreKoritziusAvatar from "./speakers/thore-koritzius.jpg"
import pascalSennAvatar from "./speakers/pascal-senn.jpg"

import type { EventSession } from "../components/event-schedule-section"

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/app/day/2026/amsterdam/speakers/ivan-jancic.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/app/day/2026/amsterdam/speakers/jens-neuse.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/app/day/2026/amsterdam/speakers/pascal-senn.webp
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
7 changes: 2 additions & 5 deletions src/app/day/2026/bengaluru/opengraph-image.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { SimpleOpengraphImage } from "../components/og-images/simple-opengraph-image"
import { dayEvents } from "../day-events"
export {
generateStaticParams,
contentType,
size,
} from "../components/og-images/simple-opengraph-image"

export default SimpleOpengraphImage.bind(null, {
pageTitle: "Bengaluru",
date: "Aug 19-20, 2026",
location: "Conrad Bengaluru, India",
})
export default SimpleOpengraphImage.bind(null, dayEvents.bengaluru)
1 change: 1 addition & 0 deletions src/app/day/2026/bengaluru/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export default function BengaluruPage() {
<div className="gql-container gql-conf-navbar-strip text-neu-900 before:bg-white/40 before:dark:bg-blk/30">
<WhyAttendSection />
<EventScheduleSection
city="bengaluru"
sessions={bengaluruSessions}
timezone={BENGALURU_TIMEZONE}
timezoneLabel={BENGALURU_TIMEZONE_LABEL}
Expand Down
18 changes: 14 additions & 4 deletions src/app/day/2026/bengaluru/schedule-data.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import michaelStaibAvatar from "../amsterdam/speakers/michael-staib.webp"
import michaelStaibAvatar from "../amsterdam/speakers/michael-staib.jpg"
import santhoshJoseAvatar from "./speakers/santhoshJose.jpg"
import riginOommenAvatar from "./speakers/riginOommen.jpg"
import yogeshNikamAvatar from "./speakers/yogeshNikam.jpg"
import nithinKumarAvatar from "./speakers/nithinKumar.jpg"
import shriyaChauhanAvatar from "./speakers/shriyaChauhan.jpg"
import vyshnaviDeviAvatar from "./speakers/vyshnaviDevi.jpg"
import chandaRajKumarAvatar from "./speakers/chandaRajKumar.jpg"
import akshayShajuAvatar from "./speakers/akshayShaju.webp"
import akhilMuralidharanAvatar from "./speakers/akhilMuralidharan.webp"
import akshayShajuAvatar from "./speakers/akshayShaju.jpg"
import akhilMuralidharanAvatar from "./speakers/akhilMuralidharan.jpg"
import dinoyRajAvatar from "./speakers/dinoyRaj.jpg"
import nachiketZadapAvatar from "./speakers/nachiketZadap.jpg"
import mahimaMalhotraAvatar from "./speakers/mahimaMalhotra.jpg"
Expand All @@ -32,9 +32,10 @@ export const tagColors: Record<string, string> = {
}

// UUID is omitted for this manually maintained schedule.
export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
export const bengaluruSessions: EventSession[] = [
{
id: 5001,
uuid: "1dcb246e-ccdd-43a3-a06b-8de9ff705d6a",
title:
"Closing the Loop: How GraphQL Gives Coding Agents Eyes on What Actually Matters",
start: "2026-08-19T11:00:00+05:30",
Expand Down Expand Up @@ -64,6 +65,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5002,
uuid: "e270991e-889d-48ff-9cbd-3bc7662dcff6",
title: "REST in Peace? GraphQL vs REST in the Age of Agentic AI",
start: "2026-08-19T11:30:00+05:30",
end: "2026-08-19T11:55:00+05:30",
Expand All @@ -90,6 +92,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5003,
uuid: "2c99072b-f5f7-4696-a29b-9be0b4bb92bc",
title:
"Zero-to-Federation in 60 Seconds: How a GraphQL Middleware Replaced 500+ Legacy APIs and Saved 3 Years of Migration",
start: "2026-08-19T12:00:00+05:30",
Expand Down Expand Up @@ -117,6 +120,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5004,
uuid: "508b7b4f-245a-4163-9948-b3fe3a9521a3",
title: "A Mock Is a Promise: Making GraphQL Mocks Enforceable",
start: "2026-08-19T12:30:00+05:30",
end: "2026-08-19T12:55:00+05:30",
Expand All @@ -139,6 +143,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5005,
uuid: "68f425cf-bb8d-403e-a269-c793246b83b2",
title: "Human in the Loop: Governing API Evolution in the Age of Agents",
start: "2026-08-19T14:00:00+05:30",
end: "2026-08-19T14:25:00+05:30",
Expand Down Expand Up @@ -166,6 +171,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5006,
uuid: "3cac57d2-207b-45db-aec7-071ebcb9b23d",
title:
"Just Ask: Building a Natural Language GraphQL Agent from the Graph You Already Have (the Easy Way)",
start: "2026-08-19T14:30:00+05:30",
Expand All @@ -192,6 +198,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5007,
uuid: "cddc951c-bb4f-49c5-bae6-93f522e931da",
title:
"Evolving GraphQL: Designing APIs That Deliver Insights with Intelligent Resolvers",
start: "2026-08-19T15:00:00+05:30",
Expand Down Expand Up @@ -231,6 +238,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5008,
uuid: "bc314ed6-bba9-466a-bc8c-058fb819dbd8",
title:
"Ask, Don't Fetch: Why GraphQL + MCP Is the Native Language of AI Agents",
start: "2026-08-19T16:00:00+05:30",
Expand Down Expand Up @@ -267,6 +275,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5009,
uuid: "b8cb6419-a6f7-4b6f-8acb-e929377d6855",
title:
"Streaming the Graph: Architecting Flow-Based Progressive Hydration in Android",
start: "2026-08-19T16:30:00+05:30",
Expand Down Expand Up @@ -295,6 +304,7 @@ export const bengaluruSessions: Omit<EventSession, "uuid">[] = [
},
{
id: 5010,
uuid: "5edfd37c-5ba1-4817-9105-e88bf871f83a",
title:
"Functional Testing of GraphQL APIs: Simple Checks That Catch Real Bugs",
start: "2026-08-19T17:00:00+05:30",
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/app/day/2026/bengaluru/speakers/akshayShaju.webp
Binary file not shown.
Loading
Loading