diff --git a/src/app/(pages)/speakers/[slug]/page.tsx b/src/app/(pages)/speakers/[slug]/page.tsx
index 30d47dd..9e78644 100644
--- a/src/app/(pages)/speakers/[slug]/page.tsx
+++ b/src/app/(pages)/speakers/[slug]/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from "next";
-import { notFound } from "next/navigation";
+import { notFound, redirect } from "next/navigation";
import CTASection from "@/components/blocks/cta/cta";
import SpeakerDetail from "@/components/blocks/speakers/speaker-detail";
@@ -12,7 +12,11 @@ import {
buildSpeakerPageMetadata,
getSpeakerShareImageUrl,
} from "@/lib/speaker-seo";
-import { getAllSpeakerSlugs, getLocalizedSpeaker } from "@/lib/speakers";
+import {
+ getAllSpeakerSlugs,
+ getCanonicalSpeakerSlug,
+ getLocalizedSpeaker,
+} from "@/lib/speakers";
export async function generateStaticParams() {
return getAllSpeakerSlugs().map((slug) => ({ slug }));
@@ -36,8 +40,13 @@ const SpeakerSlugPage = async ({
params: Promise<{ slug: string }>;
}) => {
const { slug } = await params;
+ const canonicalSlug = getCanonicalSpeakerSlug(slug);
+
+ if (slug !== canonicalSlug) {
+ redirect(`/speakers/${canonicalSlug}`);
+ }
- const speaker = getLocalizedSpeaker(slug, STATIC_PRERENDER_LOCALE);
+ const speaker = getLocalizedSpeaker(canonicalSlug, STATIC_PRERENDER_LOCALE);
if (!speaker) {
notFound();
@@ -87,7 +96,7 @@ const SpeakerSlugPage = async ({
return (
<>
-
+
diff --git a/src/assets/data/schedule.ts b/src/assets/data/schedule.ts
index 96d5045..03bfcf0 100644
--- a/src/assets/data/schedule.ts
+++ b/src/assets/data/schedule.ts
@@ -766,7 +766,7 @@ export const scheduleEvents: ScheduleEvent[] = [
"Multi-Agent Teams in AI-Assisted Development: A Glimpse Into the Future of Programming",
speaker: "José Hernán Ortiz Ocampo / Daniel Sabogal",
talkKey: "multi-agent-teams-ai-dev",
- label: "Artificial Intelligence",
+ label: "LOKA Sponsor",
language: ["EN"],
},
{
diff --git a/src/assets/data/workshop-speakers-content.locale.ts b/src/assets/data/workshop-speakers-content.locale.ts
index d54db2a..19e1a37 100644
--- a/src/assets/data/workshop-speakers-content.locale.ts
+++ b/src/assets/data/workshop-speakers-content.locale.ts
@@ -95,9 +95,9 @@ export const workshopSpeakerContentByLocale: Record<
"Go beyond vibe coding and learn how to use specifications and code graphs to guide AI-assisted development. In this workshop, you'll discover how structured specs and dependency graphs give AI coding tools the context they need to produce coherent, maintainable code. We'll work with real Python projects to define specs, generate code graphs, and wire them into your AI-assisted workflow—resulting in code that actually makes sense architecturally.",
},
"esneider-bravo-benitez": {
- title: "Software Engineer @ Lendingfront",
+ title: "Software Engineer @ Muno Labs",
description:
- "Esneider is a Software Engineer at Lendingfront with a focus on code generation tools and developer experience. He explores how structured specifications can guide AI coding assistants to produce more reliable outputs, and contributes to open-source tooling for spec-driven AI development.",
+ "Esneider is a Software Engineer at Muno Labs with a focus on code generation tools and developer experience. He explores how structured specifications can guide AI coding assistants to produce more reliable outputs, and contributes to open-source tooling for spec-driven AI development.",
talkTitle: "Beyond Vibe Coding: Spec Driven Development with Code Graphs",
talkDescription:
"Go beyond vibe coding and learn how to use specifications and code graphs to guide AI-assisted development. In this workshop, you'll discover how structured specs and dependency graphs give AI coding tools the context they need to produce coherent, maintainable code. We'll work with real Python projects to define specs, generate code graphs, and wire them into your AI-assisted workflow—resulting in code that actually makes sense architecturally.",
@@ -372,9 +372,9 @@ export const workshopSpeakerContentByLocale: Record<
"Ve más allá del vibe coding y aprende a usar especificaciones y grafos de código para guiar el desarrollo asistido por IA. En este taller descubrirás cómo las especificaciones estructuradas y los grafos de dependencias dan a las herramientas de codificación de IA el contexto que necesitan para producir código coherente y mantenible. Trabajaremos con proyectos reales de Python para definir specs, generar grafos de código y conectarlos a tu flujo de trabajo asistido por IA, resultando en código que tiene sentido arquitectónicamente.",
},
"esneider-bravo-benitez": {
- title: "Ingeniero de Software @ Lendingfront",
+ title: "Ingeniero de Software @ Muno Labs",
description:
- "Esneider es Ingeniero de Software en Lendingfront con enfoque en herramientas de generación de código y experiencia del desarrollador. Explora cómo las especificaciones estructuradas pueden guiar a los asistentes de codificación de IA para producir resultados más confiables, y contribuye a herramientas de código abierto para el desarrollo dirigido por especificaciones.",
+ "Esneider es Ingeniero de Software en Muno Labs con enfoque en herramientas de generación de código y experiencia del desarrollador. Explora cómo las especificaciones estructuradas pueden guiar a los asistentes de codificación de IA para producir resultados más confiables, y contribuye a herramientas de código abierto para el desarrollo dirigido por especificaciones.",
talkTitle:
"Más allá del Vibe Coding: Spec Driven Development con Code Graphs",
talkDescription:
diff --git a/src/components/blocks/speakers/speaker-detail.tsx b/src/components/blocks/speakers/speaker-detail.tsx
index 83ea624..4d407a1 100644
--- a/src/components/blocks/speakers/speaker-detail.tsx
+++ b/src/components/blocks/speakers/speaker-detail.tsx
@@ -14,7 +14,7 @@ import { MotionPreset } from "@/components/ui/motion-preset";
import { Separator } from "@/components/ui/separator";
import { useLanguage, useTranslations } from "@/contexts/language-context";
import { getLocalizedSpeaker } from "@/lib/speakers";
-import { getTalkBySpeakerSlug } from "@/lib/talks";
+import { getTalksBySpeakerSlug } from "@/lib/talks";
type SpeakerDetailProps = {
slug: string;
@@ -27,8 +27,8 @@ const SpeakerDetail = ({ slug }: SpeakerDetailProps) => {
() => getLocalizedSpeaker(slug, locale),
[slug, locale],
);
- const talk = useMemo(
- () => getTalkBySpeakerSlug(slug, locale),
+ const talks = useMemo(
+ () => getTalksBySpeakerSlug(slug, locale),
[slug, locale],
);
@@ -145,11 +145,19 @@ const SpeakerDetail = ({ slug }: SpeakerDetailProps) => {
className="space-y-4"
>