docs(core): ai webinar (#30297)

- Adds the march webinar
- Adds an `eventDate` frontmatter property for webinars
- Orders webinars by publish date in the `/blog` list (not event date)
- Adds a CTA to the Cursor blog post that points to the March webinar
This commit is contained in:
Isaac Mann 2025-03-06 15:55:53 -05:00 committed by GitHub
parent 442058a27b
commit 15c67cf45f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 85 additions and 59 deletions

View File

@ -1,6 +1,7 @@
---
title: 'Monorepos: the Benefits, Challenges, and Importance of Tooling Support '
description: 'Learn how monorepos and better tooling can help you overcome challenges in software development like scalability, maintenance, communication, and cost.'
date: 2024-01-24
slug: 'monorepos-the-benefits-challenges-and-importance-of-tooling-support'
authors: ['Juri Strumpflohner']
tags: [webinar]

View File

@ -1,8 +1,8 @@
---
title: "Nx Agents Walkthrough:
Effortlessly Fast CI Built for Monorepos"
description: "Learn how you can streamline your existing CI config to its absolute simplest form, reducing CI times from 30 minutes to ~5 minutes with Nx Agents. "
slug: 'nx-agents-walkthrougheffortlessly-fast-ci-built-for-monorepos'
title: 'Nx Agents Walkthrough: Effortlessly Fast CI Built for Monorepos'
description: 'Learn how you can streamline your existing CI config to its absolute simplest form, reducing CI times from 30 minutes to ~5 minutes with Nx Agents. '
date: 2024-03-11
slug: 'nx-agents-walkthrough-effortlessly-fast-ci-built-for-monorepos'
authors: ['Rareș Matei']
tags: [webinar]
cover_image: /blog/images/2024-03-11/march-webinar.png

View File

@ -1,6 +1,7 @@
---
title: 'Making the Argument for Monorepos'
description: 'Trying to convince your colleagues to use a monorepo? Already using a monorepo and need to justify that decision? Check out this webinar to learn 7 essential reasons for using monorepos and bust a few myths and misconceptions along the way.'
date: 2024-04-17
slug: 'making-the-argument-for-monorepos'
authors: ['Miroslav Jonaš']
tags: [webinar]

View File

@ -2,6 +2,7 @@
title: "Monorepos and CI can be a Mess - Here's How Nx and Nx Cloud Fixed It"
description: "Continuous Integration (CI) in monorepos can be notoriously slow and unreliable, quickly become a bottleneck for scaling monorepos.
Learn how Nx and Nx Cloud's new task-based approach ensures fast, resilient, and efficient CI for your monorepo projects."
date: 2024-06-26
slug: 'monorepos-and-ci-can-be-a-mess-heres-how-nx-and-nx-cloud-fixed-it'
authors: ['Juri Strumpflohner']
tags: [webinar]

View File

@ -1,17 +1,15 @@
---
title: 'Nx Cloud: Scale Your CI and Team with Ease'
description: 'Learn how you can attain fast, reliable CI and better coordination across your technical organization with Nx Cloud, and see our new multi-workspace features for organizational scaling in action.'
date: 2025-01-22
slug: 'nx-cloud-scale-your-ci-and-team-with-ease'
authors: ['Nicole Oliver', 'Rareș Matei', 'James Henry']
tags: [webinar]
cover_image: /blog/images/2025-01-22/Jan-webinar-image.png
time: 1-2pm ET/6-7pm UTC
status: Past - Gated
registrationUrl: https://go.nx.dev/jan2025-webinar
---
**Jan 22, 2025 - 1-2pm ET/6-7pm UTC**
Presented by Nicole Oliver, Rareș Matei, and James Henry
Learn how you can attain fast, reliable CI and better coordination across your technical organization with Nx Cloud, and see our new multi-workspace features for organizational scaling in action.

View File

@ -2,20 +2,18 @@
title: "React Development for 2025"
description: "In this webinar, well dive into building modern React applications using platform-native tools like NPM workspaces and TypeScript project references.
Learn how Nx improves the developer experience all while letting you ship your React apps faster. Well explore features like project references, how they work, and why they can significantly improve the performance of large React and TypeScript monorepos, both locally and on CI."
date: 2025-02-26
slug: 'react-development-for-2025'
authors: ['Juri Strumpflohner']
tags: [webinar]
cover_image: /blog/images/2025-02-26/Feb-Webinar-Card.png
time: 2-3pm ET/7-8pm UTC
status: Upcoming
status: Past - Gated
registrationUrl: https://go.nx.dev/feb2025-webinar
---
**Feb 26, 2025 - 2-3pm ET/7-8pm UTC**
Presented by Juri Strumpflohner
In this webinar, well dive into building modern React applications using platform-native tools like NPM workspaces and TypeScript project references.
Learn how Nx improves the developer experience all while letting you ship your React apps faster. Well explore features like project references, how they work, and why they can significantly improve the performance of large React and TypeScript monorepos, both locally and on CI.
{% call-to-action title="Register today!" url="https://go.nx.dev/feb2025-webinar" description="Save your spot" /%}
{% call-to-action title="Download the recording" url="https://go.nx.dev/feb2025-webinar" description="Sign up to gain access" /%}

View File

@ -17,6 +17,8 @@ youtubeUrl: https://youtu.be/V2W94Sq_v6A
A couple of weeks ago, we [announced how Nx makes your LLM smarter](/blog/nx-just-made-your-llm-smarter) by providing rich metadata about your monorepo structure, project relationships, and architectural context. This enhancement was initially available through GitHub Copilot in VSCode, but now we're taking it a step further by implementing the Model Context Protocol (MCP) for Cursor, making your AI assistant even more powerful.
{% call-to-action title="Learn more about Nx and AI" url="https://go.nx.dev/march2025-webinar" description="LLM-focused Webinar on March 19th" /%}
{% toc /%}
## What is the Model Context Protocol (MCP)?

View File

@ -0,0 +1,20 @@
---
title: 'Are Monorepos the Answer to Better AI-Assisted Development?'
description: 'In this webinar, Nx CTO Victor Savkin and Senior Engineer Max Kless will break down **why monorepos are inherently more AI-friendly**, giving LLMs the full context they need to generate more accurate, actionable insights. Youll also learn how Nx provides deep architectural awareness, making AI tools smarter and more effective.'
date: 2025-03-06
slug: 'are-monorepos-the-answer-to-better-aiassisted-development'
authors: ['Victor Savkin', 'Max Kless']
tags: [webinar]
cover_image: /blog/images/2025-03-19/March-2025-Webinar-card.png
time: 1pm EDT/5pm UTC
status: Upcoming
registrationUrl: https://go.nx.dev/march2025-webinar
---
**Mar 19, 2025 - 1pm EDT/5pm UTC**
Presented by Victor Savkin and Max Kless
In this webinar, Nx CTO Victor Savkin and Senior Engineer Max Kless will break down **why monorepos are inherently more AI-friendly**, giving LLMs the full context they need to generate more accurate, actionable insights. Youll also learn how Nx provides deep architectural awareness, making AI tools smarter and more effective.
{% call-to-action title="Register today!" url="https://go.nx.dev/march2025-webinar" description="Save your spot" /%}

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 KiB

View File

@ -57,6 +57,7 @@ export class BlogApi {
authors: authors.filter((author) =>
frontmatter.authors?.includes(author.name)
),
eventDate: this.dateFromFileName(file),
date: this.calculateDate(file, frontmatter),
time: frontmatter.time,
status: frontmatter.status,
@ -103,12 +104,8 @@ export class BlogApi {
return frontmatter.slug || baseName;
}
private calculateDate(filename: string, frontmatter: any): string {
const date: Date = new Date();
const timeString = date.toTimeString();
if (frontmatter.date) {
return new Date(frontmatter.date + ' ' + timeString).toISOString();
} else {
private dateFromFileName(filename: string): string {
const timeString = new Date().toISOString().split('T')[1];
const regexp = /^(\d\d\d\d-\d\d-\d\d).+$/;
const match = filename.match(regexp);
if (match) {
@ -117,6 +114,17 @@ export class BlogApi {
throw new Error(`Could not parse date from filename: ${filename}`);
}
}
private calculateDate(filename: string, frontmatter: any): string {
const date: Date = new Date();
const timeString = date.toISOString().split('T')[1];
if (frontmatter.date) {
return new Date(
frontmatter.date.toISOString().split('T')[0] + 'T' + timeString
).toISOString();
} else {
return this.dateFromFileName(filename);
}
}
private fileExists(filePath: string): boolean {

View File

@ -2,6 +2,7 @@ import { BlogPostDataEntry } from './blog.model';
export interface WebinarDataEntry extends BlogPostDataEntry {
status?: 'Upcoming' | 'Past - Gated' | 'Past - Ungated';
eventDate?: string;
time?: string;
registrationUrl?: string;
}

View File

@ -19,7 +19,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
<div className="mx-auto max-w-7xl px-8">
{webinars
.filter(
(w) => w.status === 'Upcoming' && new Date(w.date) >= new Date()
(w) => w.status === 'Upcoming' && new Date(w.eventDate) >= new Date()
)
.map((webinar, index) => {
const authorsList = (
@ -30,7 +30,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
: webinar.authors.map((a) => a.name)
).join(', ');
const dateAndTime =
new Date(webinar.date).toLocaleDateString('en-US', {
new Date(webinar.eventDate).toLocaleDateString('en-US', {
month: 'short',
day: '2-digit',
year: 'numeric',
@ -83,7 +83,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
<div>
{webinars
.filter(
(w) => w.status !== 'Upcoming' || new Date(w.date) < new Date()
(w) => w.status !== 'Upcoming' || new Date(w.eventDate) < new Date()
)
.map((w, index) => (
<WebinarListItem key={w.slug} webinar={w} episode={index + 1} />

View File

@ -123,7 +123,7 @@ const propertyParsers = {
return prop.url;
},
date: (prop: DateProperty): string => {
return prop.date.start;
return prop.date?.start;
},
files: (prop: FilesProperty): string => {
return prop.files.map((entry) => {
@ -168,22 +168,16 @@ async function main() {
});
}
if (imageFiles.length > 0) {
download(
imageFiles[0].file.url,
const imageFilePath =
BLOG_ROOT +
`/images/${webinar.Date.date.start}/${imageFiles[0].name.replaceAll(
' ',
'-'
)}`
);
console.log(
'Downloaded image',
BLOG_ROOT +
`/images/${webinar.Date.date.start}/${imageFiles[0].name.replaceAll(
' ',
'-'
)}`
);
)}`;
if (!existsSync(imageFilePath)) {
download(imageFiles[0].file.url, imageFilePath);
console.log('Downloaded image', imageFilePath);
}
cover_image = `/blog/images/${
webinar.Date.date.start
}/${imageFiles[0].name.replaceAll(' ', '-')}`;
@ -192,9 +186,11 @@ async function main() {
const webinarMarkdown = `---
title: "${processedWebinar.Title}"
description: "${processedWebinar.Description}"
date: ${processedWebinar['Publish Date'] || processedWebinar.Date}
slug: '${slugify(processedWebinar.Title)}'
authors: [${processedWebinar['Speaker(s)']
.replace(', and ', ', ')
.replace(' and ', ', ')
.split(', ')
.map((author) => `'${author}'`)
.join(', ')}]
@ -225,11 +221,11 @@ youtubeUrl: ${processedWebinar['YouTube Link']}`
registrationUrl: ${processedWebinar['Link to Landing Page']}`
: ''
}
---
${
---${
processedWebinar.Time
? `**${new Date(
? `
**${new Date(
processedWebinar.Date + ' ' + new Date().toTimeString()
).toLocaleDateString('en-US', {
month: 'short',
@ -237,13 +233,13 @@ ${
year: 'numeric',
})} - ${processedWebinar.Time}**`
: ''
}
${
}${
processedWebinar['Speaker(s)']
? `Presented by ${processedWebinar['Speaker(s)']}`
? `
Presented by ${processedWebinar['Speaker(s)']}`
: ''
}
}
${processedWebinar.Description}