diff --git a/public/img/ambassadors/chanda-raj-kumar.jpg b/public/img/ambassadors/chanda-raj-kumar.jpg new file mode 100644 index 0000000000..57a7e22ec0 Binary files /dev/null and b/public/img/ambassadors/chanda-raj-kumar.jpg differ diff --git a/public/img/ambassadors/giuseppe-abrignani.jpg b/public/img/ambassadors/giuseppe-abrignani.jpg new file mode 100644 index 0000000000..de1f558d49 Binary files /dev/null and b/public/img/ambassadors/giuseppe-abrignani.jpg differ diff --git a/public/img/ambassadors/jayant-acharya.jpg b/public/img/ambassadors/jayant-acharya.jpg new file mode 100644 index 0000000000..9d754c9265 Binary files /dev/null and b/public/img/ambassadors/jayant-acharya.jpg differ diff --git a/public/img/ambassadors/sabrina-wasserman.jpg b/public/img/ambassadors/sabrina-wasserman.jpg new file mode 100644 index 0000000000..9a78820393 Binary files /dev/null and b/public/img/ambassadors/sabrina-wasserman.jpg differ diff --git a/src/components/ambassador-grid.tsx b/src/components/ambassador-grid.tsx index ead354170b..e6304e7b8d 100644 --- a/src/components/ambassador-grid.tsx +++ b/src/components/ambassador-grid.tsx @@ -18,6 +18,7 @@ function buildRows(ambassador: Ambassador): InfoCardRow[] { }, { type: "label", + hideInConciseMode: true, label: ambassador.tags.length > 0 ? (
@@ -39,7 +40,13 @@ function buildRows(ambassador: Ambassador): InfoCardRow[] { ] } -export function AmbassadorGrid({ ambassadors }: { ambassadors: Ambassador[] }) { +export function AmbassadorGrid({ + ambassadors, + concise, +}: { + ambassadors: Ambassador[] + concise?: boolean +}) { return (
{ambassadors.map((ambassador, index) => ( @@ -47,6 +54,7 @@ export function AmbassadorGrid({ ambassadors }: { ambassadors: Ambassador[] }) { key={`${ambassador.label}-${index}`} rows={buildRows(ambassador)} className="h-full" + concise={concise} /> ))}
diff --git a/src/components/info-card/ambassador-data.tsx b/src/components/info-card/ambassador-data.tsx index b050097de6..5b77bb8bc4 100644 --- a/src/components/info-card/ambassador-data.tsx +++ b/src/components/info-card/ambassador-data.tsx @@ -24,7 +24,7 @@ export interface Ambassador { tags: AmbassadorTag[] } -export const ambassadors: Ambassador[] = [ +export const ambassadors202509: Ambassador[] = [ { label: "Artur Czemiel", imageUrl: "https://github.com/aexol.png", @@ -227,7 +227,7 @@ export const ambassadors: Ambassador[] = [ }, { label: "LinkedIn", - url: "https://www.linkedin.com/in/jem-gillam-92063b14/", + url: "https://www.linkedin.com/in/jemgillam/", icon: , }, ], @@ -468,3 +468,247 @@ export const ambassadors: Ambassador[] = [ ], }, ] + +export const ambassadors202512: Ambassador[] = [ + { + label: "An Ngo", + imageUrl: "https://github.com/vliegveld5.png", + alt: "An Ngo", + organization: "bol", + tags: [ + { + label: "GitHub", + url: "https://github.com/vliegveld5", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/vliegveld5/", + icon: , + }, + ], + }, + { + label: "Aurélien David", + imageUrl: "https://github.com/spyl94.png", + alt: "Aurélien David", + organization: "Pennylane", + tags: [ + { + label: "GitHub", + url: "https://github.com/spyl94/", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/aurel-spyl/", + icon: , + }, + { + label: "Twitter", + url: "https://x.com/spyl94", + icon: , + }, + ], + }, + { + label: "Chanda Raj Kumar", + imageUrl: "/img/ambassadors/chanda-raj-kumar.jpg", + alt: "Chanda Raj Kumar", + organization: "KL University Hyderabad", + tags: [ + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/chanda-raj-kumar-88799a1b3/", + icon: , + }, + ], + }, + { + label: "Derek Kuz", + imageUrl: "https://github.com/dariuszkuc.png", + alt: "Derek Kuz", + organization: "Apollo", + tags: [ + { + label: "Bluesky", + url: "https://bsky.app/profile/dkuc.bsky.social", + icon: , + }, + { + label: "GitHub", + url: "https://github.com/dariuszkuc", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/dkuc/", + icon: , + }, + ], + }, + { + label: "Gil Gardosh", + imageUrl: "https://github.com/gilgardosh.png", + alt: "Gil Gardosh", + organization: "The Guild", + tags: [ + { + label: "GitHub", + url: "https://github.com/gilgardosh/", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/gil-gardosh-9a5088a5/", + icon: , + }, + { + label: "Twitter", + url: "https://x.com/gilgardosh", + icon: , + }, + ], + }, + { + label: "Giuseppe Abrignani", + imageUrl: "/img/ambassadors/giuseppe-abrignani.jpg", + alt: "Giuseppe Abrignani", + organization: "Oranj Tech", + tags: [ + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/giuseppeabrignani/", + icon: , + }, + ], + }, + { + label: "Jayant Acharya", + imageUrl: "/img/ambassadors/jayant-acharya.jpg", + alt: "Jayant Acharya", + organization: "Techsophy", + tags: [ + { + label: "GitHub", + url: "https://github.com/jayant99acharya", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/jayantacharya/", + icon: , + }, + ], + }, + { + label: "Laurin Quast", + imageUrl: " https://github.com/n1ru4l.png", + alt: "Laurin Quast", + organization: "The Guild", + tags: [ + { + label: "GitHub", + url: " https://github.com/n1ru4l", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/laurin-quast-a47b871b4/", + icon: , + }, + { + label: "Twitter", + url: "https://x.com/n1rual", + icon: , + }, + ], + }, + { + label: "Lenz Weber-Tronic", + imageUrl: "https://github.com/phryneas.png", + alt: "Lenz Weber-Tronic", + organization: "Apollo", + tags: [ + { + label: "Bluesky", + url: "https://bsky.app/profile/phry.dev", + icon: , + }, + { + label: "GitHub", + url: "https://github.com/phryneas", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/lenz-w-069040113/", + icon: , + }, + { + label: "Website", + url: "https://phryneas.de/", + icon: , + }, + ], + }, + { + label: "Rigin Oommen", + imageUrl: "https://github.com/riginoommen.png", + alt: "Rigin Oommen", + organization: "Red Hat", + tags: [ + { + label: "GitHub", + url: "https://github.com/riginoommen", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/riginoommen/", + icon: , + }, + ], + }, + { + label: "Sabrina Wasserman", + imageUrl: "/img/ambassadors/sabrina-wasserman.jpg", + alt: "Sabrina Wasserman", + organization: "Facebook", + tags: [ + { + label: "GitHub", + url: "https://github.com/s3wasser", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/sabrina-wasserman-251045138/", + icon: , + }, + ], + }, + { + label: "Valentin Cocaud", + imageUrl: "https://github.com/EmrysMyrddin.png", + alt: "Valentin Cocaud", + organization: "The Guild", + tags: [ + { + label: "GitHub", + url: "https://github.com/EmrysMyrddin", + icon: , + }, + { + label: "LinkedIn", + url: "https://www.linkedin.com/in/valentin-cocaud/", + icon: , + }, + ], + }, +] + +export const ambassadors = [ + ...ambassadors202509, + //...ambassadors202512 +].sort((a, z) => a.label.localeCompare(z.label, "en-US")) diff --git a/src/components/info-card/index.tsx b/src/components/info-card/index.tsx index 9382991aba..ccd09b18d6 100644 --- a/src/components/info-card/index.tsx +++ b/src/components/info-card/index.tsx @@ -4,17 +4,20 @@ import { ReactNode } from "react" export interface InfoCardLabelRow { type: "label" label: ReactNode + hideInConciseMode?: boolean } export interface InfoCardTitleRow { type: "title" title: ReactNode + hideInConciseMode?: boolean } export interface InfoCardImageRow { type: "image" imageUrl: string alt?: string + hideInConciseMode?: boolean } export type InfoCardRow = InfoCardLabelRow | InfoCardTitleRow | InfoCardImageRow @@ -22,6 +25,7 @@ export type InfoCardRow = InfoCardLabelRow | InfoCardTitleRow | InfoCardImageRow export interface InfoCardProps { rows: InfoCardRow[] className?: string + concise?: boolean } export function InfoCardRow({ row }: { row: InfoCardRow }) { @@ -54,7 +58,7 @@ export function InfoCardRow({ row }: { row: InfoCardRow }) { } } -export function InfoCard({ rows, className }: InfoCardProps) { +export function InfoCard({ rows, concise, className }: InfoCardProps) { return (
- {rows.map((row, i) => ( - - ))} + {rows.map((row, i) => + !concise || !row.hideInConciseMode ? ( + + ) : null, + )}
) diff --git a/src/pages/blog/2025-09-08-announcing-graphql-ambassadors/index.md b/src/pages/blog/2025-09-08-announcing-graphql-ambassadors/index.md index 7fc2074459..ba3b0b1a16 100644 --- a/src/pages/blog/2025-09-08-announcing-graphql-ambassadors/index.md +++ b/src/pages/blog/2025-09-08-announcing-graphql-ambassadors/index.md @@ -1,9 +1,8 @@ --- title: "Announcing Our GraphQL Ambassadors" -tags: ["blog"] +tags: ["announcements"] date: 2025-09-08 byline: Jem Gillam and Jory Burson -featured: true --- The GraphQL Foundation is thrilled to announce the launch of the GraphQL Ambassadors Program — a new initiative to recognize and support community leaders who are helping to grow the GraphQL ecosystem worldwide. diff --git a/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/api-standards-booth.jpg b/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/api-standards-booth.jpg new file mode 100644 index 0000000000..9dbe8229af Binary files /dev/null and b/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/api-standards-booth.jpg differ diff --git a/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/index.mdx b/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/index.mdx new file mode 100644 index 0000000000..80059ee927 --- /dev/null +++ b/src/pages/blog/2025-12-19-meet-the-december-ambassador-cohort/index.mdx @@ -0,0 +1,49 @@ +--- +title: "Meet the December Ambassador Cohort" +tags: ["announcements"] +date: 2025-12-19 +byline: Jem Gillam +featured: true +--- + +import { AmbassadorGrid } from "../../../components/ambassador-grid" +import {ambassadors202512} from "../../../components/info-card/ambassador-data" + +The GraphQL Foundation is happy to announce the next cohort of GraphQL Ambassadors! +Ambassadors are nominated and represent a diverse range of geographies, backgrounds, and use cases — from maintainers of popular libraries, to meetup organizers, to educators writing guides and tutorials. Join us in welcoming these 12 incredible individuals to the team! + + + +## News from the Ambassadors + +Our Ambassadors hit the ground running, with new local meetup groups being organized in Philadelphia and Poland. We look forward to those first meetups in 2026! + +Ambassadors Erik and An were also busy representing GraphQL at API Days Paris. Alongside TSC member Martin, they staffed an API Standards booth promoting GraphQL, OpenAPI, AsyncAPI, and JSON Schema. The booth was well received and busy throughout the three-day event, helped in no small part by a 3D printer organised by Martin that produced magnets for all four standards. + +
+
+ {/* prettier-ignore */} + <>![API Standards booth with 3D printer](./api-standards-booth.jpg) +
+ {/* prettier-ignore */} +
+ API Standards booth with 3D printer. _Photo credit: Martin Bonnin_ +
+
+ +Four of our ambassadors (Erik, An, Aurélien, and Michael) joined five TSC members +to give talks during the APIDays event, also attending the dedicated [GraphQL.Day](https://graphql.day) track. + +## How to Get Involved + +- **Nominate an Ambassador.** Do you know someone doing incredible work with GraphQL? [Nominate them](https://forms.gle/hN7reX8aKQ6BqSJm7) (or [yourself](https://forms.gle/zRKVfcTPQ9kFn4Ps6))! + +- **Connect locally.** Attend events and workshops hosted by Ambassadors in your region. + +- **Share your story.** If you’re publishing, teaching, or building with GraphQL, we’d love to hear from you. + +## What’s Next + +The Ambassadors program is part of our broader effort to strengthen community engagement and education around GraphQL. Look forward to spotlights on our Ambassador team, upcoming blogs and speaking opportunities, and ways you can collaborate with these leaders. + +Together, we’re building not just technology, but a thriving, global GraphQL community.