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:
parent
442058a27b
commit
15c67cf45f
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'Monorepos: the Benefits, Challenges, and Importance of Tooling Support '
|
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.'
|
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'
|
slug: 'monorepos-the-benefits-challenges-and-importance-of-tooling-support'
|
||||||
authors: ['Juri Strumpflohner']
|
authors: ['Juri Strumpflohner']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Nx Agents Walkthrough:
|
title: 'Nx Agents Walkthrough: Effortlessly Fast CI Built for Monorepos'
|
||||||
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. '
|
||||||
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-walkthrougheffortlessly-fast-ci-built-for-monorepos'
|
slug: 'nx-agents-walkthrough-effortlessly-fast-ci-built-for-monorepos'
|
||||||
authors: ['Rareș Matei']
|
authors: ['Rareș Matei']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
cover_image: /blog/images/2024-03-11/march-webinar.png
|
cover_image: /blog/images/2024-03-11/march-webinar.png
|
||||||
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'Making the Argument for Monorepos'
|
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.'
|
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'
|
slug: 'making-the-argument-for-monorepos'
|
||||||
authors: ['Miroslav Jonaš']
|
authors: ['Miroslav Jonaš']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
title: "Monorepos and CI can be a Mess - Here's How Nx and Nx Cloud Fixed It"
|
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.
|
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."
|
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'
|
slug: 'monorepos-and-ci-can-be-a-mess-heres-how-nx-and-nx-cloud-fixed-it'
|
||||||
authors: ['Juri Strumpflohner']
|
authors: ['Juri Strumpflohner']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
|
|||||||
@ -1,17 +1,15 @@
|
|||||||
---
|
---
|
||||||
title: 'Nx Cloud: Scale Your CI and Team with Ease'
|
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.'
|
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'
|
slug: 'nx-cloud-scale-your-ci-and-team-with-ease'
|
||||||
authors: ['Nicole Oliver', 'Rareș Matei', 'James Henry']
|
authors: ['Nicole Oliver', 'Rareș Matei', 'James Henry']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
cover_image: /blog/images/2025-01-22/Jan-webinar-image.png
|
cover_image: /blog/images/2025-01-22/Jan-webinar-image.png
|
||||||
time: 1-2pm ET/6-7pm UTC
|
|
||||||
status: Past - Gated
|
status: Past - Gated
|
||||||
registrationUrl: https://go.nx.dev/jan2025-webinar
|
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
|
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.
|
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.
|
||||||
|
|||||||
@ -1,21 +1,19 @@
|
|||||||
---
|
---
|
||||||
title: "React Development for 2025"
|
title: "React Development for 2025"
|
||||||
description: "In this webinar, we’ll dive into building modern React applications using platform-native tools like NPM workspaces and TypeScript project references.
|
description: "In this webinar, we’ll 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. We’ll 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."
|
Learn how Nx improves the developer experience all while letting you ship your React apps faster. We’ll 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'
|
slug: 'react-development-for-2025'
|
||||||
authors: ['Juri Strumpflohner']
|
authors: ['Juri Strumpflohner']
|
||||||
tags: [webinar]
|
tags: [webinar]
|
||||||
cover_image: /blog/images/2025-02-26/Feb-Webinar-Card.png
|
cover_image: /blog/images/2025-02-26/Feb-Webinar-Card.png
|
||||||
time: 2-3pm ET/7-8pm UTC
|
status: Past - Gated
|
||||||
status: Upcoming
|
|
||||||
registrationUrl: https://go.nx.dev/feb2025-webinar
|
registrationUrl: https://go.nx.dev/feb2025-webinar
|
||||||
---
|
---
|
||||||
|
|
||||||
**Feb 26, 2025 - 2-3pm ET/7-8pm UTC**
|
|
||||||
|
|
||||||
Presented by Juri Strumpflohner
|
Presented by Juri Strumpflohner
|
||||||
|
|
||||||
In this webinar, we’ll dive into building modern React applications using platform-native tools like NPM workspaces and TypeScript project references.
|
In this webinar, we’ll 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. We’ll 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.
|
Learn how Nx improves the developer experience all while letting you ship your React apps faster. We’ll 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" /%}
|
||||||
|
|||||||
@ -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.
|
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 /%}
|
{% toc /%}
|
||||||
|
|
||||||
## What is the Model Context Protocol (MCP)?
|
## What is the Model Context Protocol (MCP)?
|
||||||
|
|||||||
@ -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. You’ll 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. You’ll 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" /%}
|
||||||
BIN
docs/blog/images/2025-03-19/March-2025-Webinar-card.png
Normal file
BIN
docs/blog/images/2025-03-19/March-2025-Webinar-card.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 582 KiB |
@ -57,6 +57,7 @@ export class BlogApi {
|
|||||||
authors: authors.filter((author) =>
|
authors: authors.filter((author) =>
|
||||||
frontmatter.authors?.includes(author.name)
|
frontmatter.authors?.includes(author.name)
|
||||||
),
|
),
|
||||||
|
eventDate: this.dateFromFileName(file),
|
||||||
date: this.calculateDate(file, frontmatter),
|
date: this.calculateDate(file, frontmatter),
|
||||||
time: frontmatter.time,
|
time: frontmatter.time,
|
||||||
status: frontmatter.status,
|
status: frontmatter.status,
|
||||||
@ -103,19 +104,26 @@ export class BlogApi {
|
|||||||
return frontmatter.slug || baseName;
|
return frontmatter.slug || baseName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
return new Date(match[1] + ' ' + timeString).toISOString();
|
||||||
|
} else {
|
||||||
|
throw new Error(`Could not parse date from filename: ${filename}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private calculateDate(filename: string, frontmatter: any): string {
|
private calculateDate(filename: string, frontmatter: any): string {
|
||||||
const date: Date = new Date();
|
const date: Date = new Date();
|
||||||
const timeString = date.toTimeString();
|
const timeString = date.toISOString().split('T')[1];
|
||||||
if (frontmatter.date) {
|
if (frontmatter.date) {
|
||||||
return new Date(frontmatter.date + ' ' + timeString).toISOString();
|
return new Date(
|
||||||
|
frontmatter.date.toISOString().split('T')[0] + 'T' + timeString
|
||||||
|
).toISOString();
|
||||||
} else {
|
} else {
|
||||||
const regexp = /^(\d\d\d\d-\d\d-\d\d).+$/;
|
return this.dateFromFileName(filename);
|
||||||
const match = filename.match(regexp);
|
|
||||||
if (match) {
|
|
||||||
return new Date(match[1] + ' ' + timeString).toISOString();
|
|
||||||
} else {
|
|
||||||
throw new Error(`Could not parse date from filename: ${filename}`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { BlogPostDataEntry } from './blog.model';
|
|||||||
|
|
||||||
export interface WebinarDataEntry extends BlogPostDataEntry {
|
export interface WebinarDataEntry extends BlogPostDataEntry {
|
||||||
status?: 'Upcoming' | 'Past - Gated' | 'Past - Ungated';
|
status?: 'Upcoming' | 'Past - Gated' | 'Past - Ungated';
|
||||||
|
eventDate?: string;
|
||||||
time?: string;
|
time?: string;
|
||||||
registrationUrl?: string;
|
registrationUrl?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
|
|||||||
<div className="mx-auto max-w-7xl px-8">
|
<div className="mx-auto max-w-7xl px-8">
|
||||||
{webinars
|
{webinars
|
||||||
.filter(
|
.filter(
|
||||||
(w) => w.status === 'Upcoming' && new Date(w.date) >= new Date()
|
(w) => w.status === 'Upcoming' && new Date(w.eventDate) >= new Date()
|
||||||
)
|
)
|
||||||
.map((webinar, index) => {
|
.map((webinar, index) => {
|
||||||
const authorsList = (
|
const authorsList = (
|
||||||
@ -30,7 +30,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
|
|||||||
: webinar.authors.map((a) => a.name)
|
: webinar.authors.map((a) => a.name)
|
||||||
).join(', ');
|
).join(', ');
|
||||||
const dateAndTime =
|
const dateAndTime =
|
||||||
new Date(webinar.date).toLocaleDateString('en-US', {
|
new Date(webinar.eventDate).toLocaleDateString('en-US', {
|
||||||
month: 'short',
|
month: 'short',
|
||||||
day: '2-digit',
|
day: '2-digit',
|
||||||
year: 'numeric',
|
year: 'numeric',
|
||||||
@ -83,7 +83,7 @@ export function WebinarList({ webinars }: WebinarListProps): JSX.Element {
|
|||||||
<div>
|
<div>
|
||||||
{webinars
|
{webinars
|
||||||
.filter(
|
.filter(
|
||||||
(w) => w.status !== 'Upcoming' || new Date(w.date) < new Date()
|
(w) => w.status !== 'Upcoming' || new Date(w.eventDate) < new Date()
|
||||||
)
|
)
|
||||||
.map((w, index) => (
|
.map((w, index) => (
|
||||||
<WebinarListItem key={w.slug} webinar={w} episode={index + 1} />
|
<WebinarListItem key={w.slug} webinar={w} episode={index + 1} />
|
||||||
|
|||||||
@ -123,7 +123,7 @@ const propertyParsers = {
|
|||||||
return prop.url;
|
return prop.url;
|
||||||
},
|
},
|
||||||
date: (prop: DateProperty): string => {
|
date: (prop: DateProperty): string => {
|
||||||
return prop.date.start;
|
return prop.date?.start;
|
||||||
},
|
},
|
||||||
files: (prop: FilesProperty): string => {
|
files: (prop: FilesProperty): string => {
|
||||||
return prop.files.map((entry) => {
|
return prop.files.map((entry) => {
|
||||||
@ -168,22 +168,16 @@ async function main() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (imageFiles.length > 0) {
|
if (imageFiles.length > 0) {
|
||||||
download(
|
const imageFilePath =
|
||||||
imageFiles[0].file.url,
|
|
||||||
BLOG_ROOT +
|
BLOG_ROOT +
|
||||||
`/images/${webinar.Date.date.start}/${imageFiles[0].name.replaceAll(
|
`/images/${webinar.Date.date.start}/${imageFiles[0].name.replaceAll(
|
||||||
' ',
|
' ',
|
||||||
'-'
|
'-'
|
||||||
)}`
|
)}`;
|
||||||
);
|
if (!existsSync(imageFilePath)) {
|
||||||
console.log(
|
download(imageFiles[0].file.url, imageFilePath);
|
||||||
'Downloaded image',
|
console.log('Downloaded image', imageFilePath);
|
||||||
BLOG_ROOT +
|
}
|
||||||
`/images/${webinar.Date.date.start}/${imageFiles[0].name.replaceAll(
|
|
||||||
' ',
|
|
||||||
'-'
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
cover_image = `/blog/images/${
|
cover_image = `/blog/images/${
|
||||||
webinar.Date.date.start
|
webinar.Date.date.start
|
||||||
}/${imageFiles[0].name.replaceAll(' ', '-')}`;
|
}/${imageFiles[0].name.replaceAll(' ', '-')}`;
|
||||||
@ -192,9 +186,11 @@ async function main() {
|
|||||||
const webinarMarkdown = `---
|
const webinarMarkdown = `---
|
||||||
title: "${processedWebinar.Title}"
|
title: "${processedWebinar.Title}"
|
||||||
description: "${processedWebinar.Description}"
|
description: "${processedWebinar.Description}"
|
||||||
|
date: ${processedWebinar['Publish Date'] || processedWebinar.Date}
|
||||||
slug: '${slugify(processedWebinar.Title)}'
|
slug: '${slugify(processedWebinar.Title)}'
|
||||||
authors: [${processedWebinar['Speaker(s)']
|
authors: [${processedWebinar['Speaker(s)']
|
||||||
.replace(', and ', ', ')
|
.replace(', and ', ', ')
|
||||||
|
.replace(' and ', ', ')
|
||||||
.split(', ')
|
.split(', ')
|
||||||
.map((author) => `'${author}'`)
|
.map((author) => `'${author}'`)
|
||||||
.join(', ')}]
|
.join(', ')}]
|
||||||
@ -225,25 +221,25 @@ youtubeUrl: ${processedWebinar['YouTube Link']}`
|
|||||||
registrationUrl: ${processedWebinar['Link to Landing Page']}`
|
registrationUrl: ${processedWebinar['Link to Landing Page']}`
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
---
|
---${
|
||||||
|
processedWebinar.Time
|
||||||
|
? `
|
||||||
|
|
||||||
${
|
**${new Date(
|
||||||
processedWebinar.Time
|
processedWebinar.Date + ' ' + new Date().toTimeString()
|
||||||
? `**${new Date(
|
).toLocaleDateString('en-US', {
|
||||||
processedWebinar.Date + ' ' + new Date().toTimeString()
|
month: 'short',
|
||||||
).toLocaleDateString('en-US', {
|
day: '2-digit',
|
||||||
month: 'short',
|
year: 'numeric',
|
||||||
day: '2-digit',
|
})} - ${processedWebinar.Time}**`
|
||||||
year: 'numeric',
|
: ''
|
||||||
})} - ${processedWebinar.Time}**`
|
}${
|
||||||
: ''
|
processedWebinar['Speaker(s)']
|
||||||
}
|
? `
|
||||||
|
|
||||||
${
|
Presented by ${processedWebinar['Speaker(s)']}`
|
||||||
processedWebinar['Speaker(s)']
|
: ''
|
||||||
? `Presented by ${processedWebinar['Speaker(s)']}`
|
}
|
||||||
: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
${processedWebinar.Description}
|
${processedWebinar.Description}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user