Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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
7 changes: 7 additions & 0 deletions src/app/conf/_design-system/social-icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import {
LinkedInFilledIcon,
InstagramIcon,
GlobeIcon,
GitHubIcon,
} from "@/icons"

export type SocialIconType =
| "twitter"
| "linkedin"
| "facebook"
| "instagram"
| "github"
| "website"

export const SocialIconType = {
Expand All @@ -22,6 +24,7 @@ export const SocialIconType = {
all: [
"linkedin",
"twitter",
"github",
"instagram",
"facebook",
"website",
Expand All @@ -42,6 +45,8 @@ export const SocialIcon = ({ type, ...rest }: SocialIconProps) => {
return <FacebookIcon {...rest} />
case "instagram":
return <InstagramIcon {...rest} />
case "github":
return <GitHubIcon {...rest} />
case "website":
return <GlobeIcon {...rest} />
default:
Expand All @@ -59,6 +64,8 @@ export function urlForUser(type: SocialIconType, handleOrWebsite: string) {
return `https://www.instagram.com/${handleOrWebsite}`
case "facebook":
return `https://www.facebook.com/${handleOrWebsite}`
case "github":
return `https://github.com/${handleOrWebsite}`
case "website":
return handleOrWebsite
default:
Expand Down
41 changes: 13 additions & 28 deletions src/app/day/2026/singapore/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,14 @@ import { Button } from "@/app/conf/_design-system/button"
import { Hero, HeroDateAndLocation } from "../components/hero"
import { AboutSection } from "../components/about-section"
import { WhyAttendSection } from "../components/why-attend-section"
import {
BecomeASpeakerSection,
CfpButton,
} from "../components/become-a-speaker"
import { EventPartnersSection } from "../components/event-partners"
import { CtaCardSection } from "../components/cta-card-section"
import { MarqueeRows } from "@/app/conf/2026/components/marquee-rows"
import { PastSpeakersSection } from "../components/past-speakers"
import { NavbarPlaceholder } from "../components/navbar"
import { GallerySection } from "../../gallery-section"
import { ScheduleSection } from "./schedule-section"

const TICKET_LINK =
"https://portal.joinfost.io/event/future-of-software-technologies-singapore-2026/9521470b-6661-4c85-8594-b74d9d7cf2e3/graphql-day-at-fost-singapore"
const SCHEDULE_ANCHOR = "#schedule"

const MARQUEE_ITEMS = [
["SINGAPORE", "APRIL 2026", "GRAPHQL DAY", "FOST", "COMMUNITY", "APIs"],
Expand Down Expand Up @@ -46,10 +41,12 @@ export default function SingaporePage() {
location="Singapore"
/>
<div className="flex flex-wrap items-center gap-x-4 gap-y-2 max-sm:*:flex-1">
<Button href={TICKET_LINK} className="whitespace-nowrap md:w-fit">
Get your ticket
<Button
href={SCHEDULE_ANCHOR}
className="whitespace-nowrap md:w-fit"
>
View the schedule
</Button>
<CfpButton className="whitespace-nowrap md:w-fit" />
</div>
</Hero>
<AboutSection />
Expand All @@ -60,28 +57,16 @@ export default function SingaporePage() {
/>
<div className="gql-container gql-conf-navbar-strip text-neu-900 before:bg-white/40 before:dark:bg-blk/30">
<WhyAttendSection />
<BecomeASpeakerSection />
<PastSpeakersSection />
<EventPartnersSection />
<GallerySection moving />
<CtaCardSection
title="Get your ticket"
description="Join us for a day of GraphQL talks, networking, and hands-on learning at FOST Singapore."
>
<Button
href={TICKET_LINK}
variant="primary"
className="whitespace-nowrap"
>
Get your ticket
</Button>
</CtaCardSection>
<MarqueeRows
variant="secondary"
className="my-8 xl:mb-16 xl:mt-10"
items={MARQUEE_ITEMS}
/>
</div>
<ScheduleSection />
<MarqueeRows
variant="secondary"
className="my-8 xl:my-16"
items={MARQUEE_ITEMS}
/>
</main>
</>
)
Expand Down
130 changes: 130 additions & 0 deletions src/app/day/2026/singapore/schedule-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import type { StaticImageData } from "next/image"

import akshatSharmaAvatar from "./speakers/akshat-sharma.webp"
import michaelStaibAvatar from "./speakers/michael-staib.webp"
import pascalSennAvatar from "./speakers/pascal-senn.webp"

export interface SingaporeSpeaker {
id: number
name: string
company: string
jobtitle: string
avatar: StaticImageData
socialurls: { service: string; url: string }[]
}

export interface SingaporeSession {
id: number
uuid: string
title: string
/** ISO 8601 in venue local time, Asia/Singapore */
start: string
/** ISO 8601 in venue local time, Asia/Singapore */
end: string
/** Topic tags derived from the session description. */
tags: string[]
/** HTML */
description: string
venue: string
speakers: SingaporeSpeaker[]
}

export const SINGAPORE_TIMEZONE = "Asia/Singapore"

/** Color per topic, picked to read clearly against the cream/dark backgrounds. */
export const tagColors: Record<string, string> = {
Security: "#CC6BB0",
"Zero Trust": "#894545",
"Service Mesh": "#36C1A0",
"AI Agents": "#7e66cc",
Federation: "#FC8251",
"Public Sector": "#4e6e82",
"Schema Evolution": "#cbc749",
Observability: "#1a5b77",
}

export const singaporeSessions: SingaporeSession[] = [
{
id: 3224,
uuid: "80952503-07dd-4e31-acaf-b9e400f55126",
title: "Securing GraphQL at Scale with Zero Trust APIs",
start: "2026-04-15T15:55:00+08:00",
end: "2026-04-15T16:20:00+08:00",
tags: ["Security", "Zero Trust", "Service Mesh"],
description:
"<p>Modern microservice architectures often decentralize authentication and authorization, leading to inconsistent security policies and increased attack surfaces. GraphQL, while powerful, introduces unique risks such as over-fetching, query batching abuse, and introspection-based attacks that many teams underestimate.</p>\n<p>In this talk, I present a real-world case study of building a secure, identity-aware GraphQL gateway that enforces Zero Trust principles across distributed services. By integrating centralized identity management with Keycloak and leveraging service mesh technologies like Istio and Envoy, we created a unified layer for authentication, authorization, and traffic governance.</p>\n<p>The session will walk through practical challenges, including enforcing fine-grained access control, implementing query cost analysis, and mitigating abuse patterns in production. Attendees will gain insights into designing secure GraphQL APIs that scale without compromising performance or developer experience.</p>\n<p>This talk matters because API security is no longer optional. As organizations increasingly adopt GraphQL, understanding how to secure it in real-world systems is critical to preventing data leaks and maintaining trust.</p>\n",
venue: "Stage 3",
speakers: [
{
id: 4557,
name: "Akshat Sharma",
company: "Deskree",
jobtitle: "Technology Advocate",
avatar: akshatSharmaAvatar,
socialurls: [
{
service: "linkedin",
url: "https://www.linkedin.com/in/akshat-sharma11",
},
],
},
],
},
{
id: 3225,
uuid: "2a24223a-16d0-40fa-821b-b91c491ff9a6",
title: "GraphQL as the Execution Layer for AI Agents",
start: "2026-04-15T16:20:00+08:00",
end: "2026-04-15T16:45:00+08:00",
tags: ["AI Agents", "Federation", "Public Sector"],
description:
"<p>Your next million API consumers won't be developers. They'll be AI agents. And they don't read documentation, parse hypermedia links, or guess which of your 200 REST endpoints returns the data they need.</p>\n<p>This talk examines what happens when autonomous AI agents become the primary consumers of your API layer. Drawing on real data from Singapore's public government APIs, I'll show how REST responses waste 30–60% of an agent's token budget on structural overhead, and how a typed, self-describing schema changes the equation entirely.</p>\n<p>We'll walk through the three properties that make an API truly agent-native: discoverability, precision, and composability. We'll look at what it would take to unify API estates like Singapore's 3,000+ government APIs across 75+ agencies into a single, self-describing surface. A pattern Gartner expects 30% of enterprises to adopt by 2027.</p>\n<p>You'll leave with a framework for what makes an API truly agent-native, why GraphQL's type system and federation model get you there, and how to start without a rewrite.</p>\n",
venue: "Stage 3",
speakers: [
{
id: 2446,
name: "Pascal Senn",
company: "ChilliCream",
jobtitle: "Founder",
avatar: pascalSennAvatar,
socialurls: [
{
service: "linkedin",
url: "https://www.linkedin.com/in/pascal-senn-90899a15a",
},
{ service: "github", url: "https://github.com/PascalSenn" },
{ service: "website", url: "https://chillicream.com" },
],
},
],
},
{
id: 3226,
uuid: "02d9d427-d1ff-4f78-8d8c-243565d0f1cd",
title:
"Closing the Loop: How GraphQL Gives Coding Agents Eyes on What Actually Matters",
start: "2026-04-15T16:45:00+08:00",
end: "2026-04-15T17:10:00+08:00",
tags: ["AI Agents", "Schema Evolution", "Observability"],
description:
"<p>Coding agents are reshaping how we build software. Implementing features, refactoring systems, and shipping changes at a pace unthinkable 6 months ago. But to be successful with agents you need the right feedback loop. One that guides your agent to success, not into the spiral of death.</p>\n<p>Ask Claude to add a review system to your product API. Without knowing what's in use, it might reshape your types, move fields, and break your deployed clients because it is missing a crucial feedback loop of what's in use in your clients.</p>\n<p>GraphQL changes this. Every client operation explicitly declares the exact fields and types it needs. That gives you something rare: field-level usage data across your entire consumer base. Not endpoint hits, but actual demand, broken down to the individual field.</p>\n<p>When coding agents can access this data, they stop guessing. Evolve your schema grounded in reality, not assumptions.</p>\n<p>This talk shows how GraphQL's inherent usage visibility and the rise of coding agents create a feedback loop that didn't exist before. And why it matters for anyone building APIs that need to evolve fast.</p>\n",
venue: "Stage 3",
speakers: [
{
id: 1881,
name: "Michael Staib",
company: "ChilliCream",
jobtitle: "Founder",
avatar: michaelStaibAvatar,
socialurls: [
{
service: "linkedin",
url: "https://www.linkedin.com/in/michael-staib-31519571/",
},
{ service: "github", url: "https://github.com/michaelstaib" },
{ service: "website", url: "https://chillicream.com" },
],
},
],
},
]
Loading
Loading