diff --git a/pages/ambassadors/components/AmbassadorBanner.tsx b/components/AmbassadorsBanner.tsx similarity index 100% rename from pages/ambassadors/components/AmbassadorBanner.tsx rename to components/AmbassadorsBanner.tsx diff --git a/pages/ambassadors/components/AmbassadorCard.tsx b/components/AmbassadorsCard.tsx similarity index 83% rename from pages/ambassadors/components/AmbassadorCard.tsx rename to components/AmbassadorsCard.tsx index ce175430c..ad287ce64 100644 --- a/pages/ambassadors/components/AmbassadorCard.tsx +++ b/components/AmbassadorsCard.tsx @@ -1,16 +1,17 @@ import React, { useState } from 'react'; import Image from 'next/image'; -// import { Github, Twitter, Linkedin } from 'lucide-react'; -// Define the types for the `ambassador` prop interface Contribution { title: string; - date?: { month: string; year: number }; + date?: { + month: string; + year: number; + }; link: string; type: string; } -interface Ambassador { +export interface Ambassador { img?: string; name?: string; title?: string; @@ -24,29 +25,23 @@ interface Ambassador { contributions?: Contribution[]; } -interface AmbassadorCardProps { - ambassador: Ambassador; -} - -type SocialPlatform = 'github' | 'twitter' | 'mastodon' | 'linkedin'; +type SocialIcons = 'github' | 'twitter' | 'mastodon' | 'linkedin'; -// Utility function to generate full URLs for social media const getSocialMediaUrl = ( - platform: SocialPlatform, + platform: SocialIcons, username: string | undefined, ) => { - const baseUrls: Record = { + const baseUrls: Record = { github: 'https://github.com/', twitter: 'https://twitter.com/', - mastodon: 'https://mastodon.social/', + mastodon: 'https://fosstodon.org/', linkedin: 'https://www.linkedin.com/in/', }; return username ? baseUrls[platform] + username : undefined; }; -// Social media icon component with proper typing -const SocialIcon: React.FC<{ platform: SocialPlatform }> = ({ platform }) => { - const icons: Record = { +const SocialIcon = ({ platform }: { platform: SocialIcons }) => { + const icons: Record = { github: ( = ({ platform }) => { linkedin: ( - + + + ), mastodon: ( @@ -91,7 +99,7 @@ const SocialIcon: React.FC<{ platform: SocialPlatform }> = ({ platform }) => { return icons[platform]; }; -const AmbassadorCard: React.FC = ({ ambassador }) => { +const AmbassadorCard = ({ ambassador }: { ambassador: Ambassador }) => { const [showContributions, setShowContributions] = useState(false); const [imgSrc, setImgSrc] = useState( ambassador.img || '/api/placeholder/400/320', @@ -106,8 +114,7 @@ const AmbassadorCard: React.FC = ({ ambassador }) => { contributions = [], } = ambassador; - // Available social platforms with proper typing - const socialPlatforms: SocialPlatform[] = [ + const SocialIconss: SocialIcons[] = [ 'github', 'twitter', 'mastodon', @@ -116,7 +123,6 @@ const AmbassadorCard: React.FC = ({ ambassador }) => { return (
- {/* Black Borders */}
@@ -151,9 +157,8 @@ const AmbassadorCard: React.FC = ({ ambassador }) => {

)} - {/* Social Media Links */}
- {socialPlatforms.map((platform) => { + {SocialIconss.map((platform) => { const username = ambassador[platform]; return username ? ( = ({ ambassador }) => { })}
- {/* Button to Show/Hide Contributions */} {contributions.length > 0 && ( )} - {/* Contributions Section (Toggled) */} {showContributions && contributions.length > 0 && (

diff --git a/pages/ambassadors/components/AmbassadorList.tsx b/components/AmbassadorsList.tsx similarity index 85% rename from pages/ambassadors/components/AmbassadorList.tsx rename to components/AmbassadorsList.tsx index dfb3fcca7..0328f4772 100644 --- a/pages/ambassadors/components/AmbassadorList.tsx +++ b/components/AmbassadorsList.tsx @@ -1,18 +1,18 @@ import React from 'react'; -interface AmbassadorLink { +interface AmbassadorsLink { title: string; icon: string; details: string; } -interface AmbassadorListProps { +interface AmbassadorsListProps { ambassadorList: { - contents: AmbassadorLink[]; + contents: AmbassadorsLink[]; }; } -const AmbassadorList: React.FC = ({ ambassadorList }) => { +const AmbassadorList = ({ ambassadorList }: AmbassadorsListProps) => { return (
    {ambassadorList.contents.map((link) => ( diff --git a/context.ts b/context.ts index a091c1cb3..2d7bbee79 100644 --- a/context.ts +++ b/context.ts @@ -20,6 +20,7 @@ export const SectionContext = React.createContext< | 'getting-started' | 'reference' | 'roadmap' + | 'ambassador' >(null); export const BlockContext = React.createContext(null); export const FullMarkdownContext = React.createContext(null); diff --git a/data/ambassador_lists.json b/data/ambassadors-contributions.json similarity index 93% rename from data/ambassador_lists.json rename to data/ambassadors-contributions.json index 5b5537e7d..9bc6cab4c 100644 --- a/data/ambassador_lists.json +++ b/data/ambassadors-contributions.json @@ -12,7 +12,7 @@ }, { "title": "Give talks", - "details": "Speak at meetups and conferences; we’ll help with slides, abstract submissions, and travel budget.", + "details": "Speak at meetups and conferences; we'll help with slides, abstract submissions, and travel budget.", "icon": "/img/ambassadors/illustrations/speaker.png" }, { diff --git a/pages/ambassadors/index.page.tsx b/pages/ambassadors/index.page.tsx index 24521528a..259d32035 100644 --- a/pages/ambassadors/index.page.tsx +++ b/pages/ambassadors/index.page.tsx @@ -2,19 +2,34 @@ import React from 'react'; import { getLayout } from '~/components/SiteLayout'; import { SectionContext } from '~/context'; -import ambassadorsBanner from '../../public/img/community/ambassadors.png'; -import AmbassadorBanner from './components/AmbassadorBanner'; -import ambassadorData from '../../data/ambassadors.json'; -import AmbassadorCard from './components/AmbassadorCard'; -import ambassadorList from '../../data/ambassador_lists.json'; +import ambassadorList from '~/data/ambassadors-contributions.json'; +import ambassadorsBanner from '~/public/img/community/ambassadors.png'; import Image from 'next/image'; -import AmbassadorList from './components/AmbassadorList'; +import fs from 'fs'; -export default function communityPages() { +import AmbassadorBanner from '~/components/AmbassadorsBanner'; +import AmbassadorCard, { type Ambassador } from '~/components/AmbassadorsCard'; +import AmbassadorList from '~/components/AmbassadorsList'; + +export async function getStaticProps() { + const ambassadorData = fs.readFileSync('data/ambassadors.json', 'utf-8'); + + return { + props: { + ambassadorData, + }, + }; +} + +export default function ambassadorPages({ + ambassadorData, +}: { + ambassadorData: any; +}) { return ( - +
    - {/* Left Section with Title, Description, and Button */}
    Become a JSON Schema Ambassador

-

+

The JSON Schema Ambassadors Program recognizes the people who drive adoption, innovation, and knowledge sharing in the JSON Schema community. @@ -42,16 +56,15 @@ export default function communityPages() {

- {/* Right Section with Image */}

- JSON Ambassador Contributions + JSON Schema Ambassador Contributions

- JSON Ambassadors are passionate about JSON Schema. They share - their interest, expertise, and excitement within their communities - to help others build better software. + Ambassadors are passionate about JSON Schema. They share their + interest, expertise, and excitement within their communities to + help others build better software.

@@ -81,7 +94,7 @@ export default function communityPages() {

- Join These JSON Ambassadors
+ Join These JSON Schema Ambassadors

Learn and share knowledge with community members.

@@ -89,9 +102,11 @@ export default function communityPages() {

- {ambassadorData.map((ambassador, index) => ( - - ))} + {JSON.parse(ambassadorData).map( + (ambassador: Ambassador, index: number) => ( + + ), + )}
@@ -102,4 +117,4 @@ export default function communityPages() { ); } -communityPages.getLayout = getLayout; +ambassadorPages.getLayout = getLayout; diff --git a/pages/blog/posts/apidays-paris-2024-recap.md b/pages/blog/posts/apidays-paris-2024-recap.md new file mode 100644 index 000000000..0a50c3923 --- /dev/null +++ b/pages/blog/posts/apidays-paris-2024-recap.md @@ -0,0 +1,79 @@ +--- +title: "JSON Schema conference: A milestone event at Apidays Paris 2024" +date: "2024-12-19" +tags: + - News +type: Community +cover: /img/posts/2024/apidays-paris-2024-recap/json-schema-conference.png +authors: + - name: Valeria Hernandez + photo: /img/avatars/valeria.webp + twitter: valeriahhdez + byline: Technical writer +excerpt: "Apidays Paris 2024 was the venue for a significant milestone for our project: the first-ever JSON Schema Conference." +--- +## Introduction +[Apidays Paris](https://www.apidays.global/paris/), the flagship event of the apidays family, returned this year with a focus on "The Future API Stack for Mass Innovation." This annual gathering of API enthusiasts, developers, and industry leaders brought together experts to discuss the latest trends and best practices in API design, API development, and API management. + +This year's agenda highlighted the increasing role of AI in API development, exploring how AI can be used to automate tasks, improve API design, and enhance API performance. +Continuing our successful partnership with [AsyncAPI](https://www.asyncapi.com/en) and [OpenAPI](https://www.openapis.org/), this year's event marked a significant milestone with the inaugural JSON Schema conference track. This dedicated track, sponsored by [Octue](https://www.octue.com/), delved deep into the world of JSON Schema, exploring its role in API design, validation, and documentation. + +## The first JSON Schema conference + +The inaugural [JSON Schema conference track](https://conference.json-schema.org/) at apidays Paris 2024 was a resounding success. As part of the larger conference theme "The Future API Stack for Mass Innovation," the track showcased JSON Schema's crucial role in modern API development and data contract design. + +
+ Five people standing at a booth labeled 'Standards'. They are smiling and looking at the camera. From left to right, their names are Benjamin Granados, Thomas Clark, Andreas Eberhart, Juan Cruz Viotti, and Ben Hutton. +
Community members at the standards booth shared with AsyncAPI, OpenAPI, and GraphQL. From left to right: Benjamin Granados (community manager), Thomas Clark (Octue CEO), Andreas Eberhart (JSON Schema ambassador), Juan Cruz Viotti (TSC member), and Ben Hutton (TSC member).
+
+
+ +[Ten comprehensive presentations](https://conference.json-schema.org/sessions/) spanned the spectrum of JSON Schema applications, from foundational concepts to cutting-edge implementations. The list of talks included: + +- JSON Schema for data design and contract, client and code generation by Tom Collins (DVLA, UK Gov) +- IEC standards: Toward digital standards with JSON Schema by Thomas Clark (Octue CEO, conference sponsor) +- Introducing Strands - a JSON Schema repository by Thomas Clark +- JSON Schema: powering FINOS architecture as code by James Gough (Morgan Stanley) +- Generic and extensible web of things manager using JSON Schema and AI by Andreas Eberhart (Dashjoin, JSON Schema ambassador) +- High-performance JSON Schema validation in .NET by Matthew Adams (Endjin, TSC member) +- JSON schema and relational databases: bridging the gap by Loic Lefèvre (Oracle) +- Applying software engineering practices to JSON Schemas by Juan Cruz Viotti (Sourcemeta CEO, TSC member) +- The state of JSON schema by Benjamin Granados (Celonis, TSC member) +- Unlocking dynamic frontend development through JSON Schema by Neha Singla (Apple) + +Three major themes recurred throughout the track: data design and standardization, tooling infrastructure, and modern application integration. Particularly notable was the emphasis on JSON Schema's role in AI integration and automated API development, aligning perfectly with the broader conference focus on AI's increasing importance in the API landscape. + +Octue's sponsorship significantly bolstered the track's success, demonstrating their commitment to the JSON Schema community. This support enabled a diverse range of speakers to share their expertise and experiences. + +Audience engagement exceeded expectations. Attendees from various industries and organizations - such as fintech, renewable energy, IT, and government - participated in robust Q&A sessions after each presentation. The discussions revealed both the growing adoption of JSON Schema across different sectors and the community's hunger for more knowledge about its practical applications. + +
+ Loic Lefevre presenting on stage at the APIDays Paris 2024 conference. The audience is seated in rows of chairs, facing the stage. +
A room full of people listening to Loïc Lefèvre’s engaging presentation on utilizing JSON schemas to manage relational databases.
+
+
+ +Looking ahead, this first dedicated track has laid a strong foundation for future JSON Schema events. The feedback highlighted the need to further showcase JSON Schema's versatility across different use cases, and plans are underway to expand and enhance next year's track. This successful launch not only validates JSON Schema's importance in modern API development but also signals the beginning of a new chapter in the community's growth and evolution. + +## Collaboration with organizations + +The success of the JSON Schema track at apidays Paris 2024 highlighted the vital role of community collaboration in our growth. It also demonstrated how organizations collaborating with JSON Schema gain more than just visibility - they become part of a broader movement toward standardized, high-quality API development. + +Here's how your organization can benefit: +- **Standardization & interoperability**: Ensure seamless data exchange and API integration. +- **Improved data quality**: Minimize errors with robust data validation. +- **Enhanced API design**: Streamline development with clear and concise schemas. +- **Increased productivity**: Automate tasks and boost efficiency with JSON Schema tools. + +Here’s how you can become part of the initiative: +- [Be an ambassador](https://github.com/json-schema-org/community/tree/main/programs/ambassadors): Share your JSON Schema expertise and champion its adoption. +- [Become a sponsor](https://json-schema.org/overview/sponsors): Gain visibility and support the standard's growth. +- [Contribute to the project](https://github.com/json-schema-org): Help us shape the future of JSON Schema development. +- [Join our Slack workspace](https://json-schema.org/slack): Connect with the vibrant JSON Schema community. + + +Together, we can build a more robust and interoperable API ecosystem. + +A final thank you to Octue for sponsoring the conference, apidays Paris for hosting it, the organizers for their dedication and hard work, and the attendees for your valuable input and insightful questions. On behalf of JSON Schema, we look forward to seeing you again next year! + +Acknowledgments: The author would like to thank Onyedikachi Hope, Ben Hutton, and Benjamin Granados for their valuable feedback, which enhanced the quality of this article. diff --git a/public/img/posts/2024/apidays-paris-2024-recap/json-schema-conference.png b/public/img/posts/2024/apidays-paris-2024-recap/json-schema-conference.png new file mode 100644 index 000000000..e82c5c48c Binary files /dev/null and b/public/img/posts/2024/apidays-paris-2024-recap/json-schema-conference.png differ diff --git a/public/img/posts/2024/apidays-paris-2024-recap/json-schema-team.jpg b/public/img/posts/2024/apidays-paris-2024-recap/json-schema-team.jpg new file mode 100644 index 000000000..4293a4ba7 Binary files /dev/null and b/public/img/posts/2024/apidays-paris-2024-recap/json-schema-team.jpg differ diff --git a/public/img/posts/2024/apidays-paris-2024-recap/loic-lefevre-talk.jpg b/public/img/posts/2024/apidays-paris-2024-recap/loic-lefevre-talk.jpg new file mode 100644 index 000000000..a335a7907 Binary files /dev/null and b/public/img/posts/2024/apidays-paris-2024-recap/loic-lefevre-talk.jpg differ