diff --git a/public/images/speakers/david-stiven-jurado-chavarria.jpg b/public/images/speakers/david-stiven-jurado-chavarria.jpg new file mode 100644 index 0000000..997b366 Binary files /dev/null and b/public/images/speakers/david-stiven-jurado-chavarria.jpg differ diff --git a/public/images/speakers/douglas-ardila-garces.jpg b/public/images/speakers/douglas-ardila-garces.jpg new file mode 100644 index 0000000..7ca4e2d Binary files /dev/null and b/public/images/speakers/douglas-ardila-garces.jpg differ diff --git a/public/images/speakers/sebastian-rodriguez-colina.jpg b/public/images/speakers/sebastian-rodriguez-colina.jpg new file mode 100644 index 0000000..a94ac78 Binary files /dev/null and b/public/images/speakers/sebastian-rodriguez-colina.jpg differ diff --git a/public/images/sponsors/interledger/1.webp b/public/images/sponsors/interledger/1.webp new file mode 100644 index 0000000..57194cf Binary files /dev/null and b/public/images/sponsors/interledger/1.webp differ diff --git a/public/images/sponsors/interledger/10.webp b/public/images/sponsors/interledger/10.webp new file mode 100644 index 0000000..f73a229 Binary files /dev/null and b/public/images/sponsors/interledger/10.webp differ diff --git a/public/images/sponsors/interledger/11.webp b/public/images/sponsors/interledger/11.webp new file mode 100644 index 0000000..22f0e50 Binary files /dev/null and b/public/images/sponsors/interledger/11.webp differ diff --git a/public/images/sponsors/interledger/12.webp b/public/images/sponsors/interledger/12.webp new file mode 100644 index 0000000..9d586f3 Binary files /dev/null and b/public/images/sponsors/interledger/12.webp differ diff --git a/public/images/sponsors/interledger/13.webp b/public/images/sponsors/interledger/13.webp new file mode 100644 index 0000000..ce18a27 Binary files /dev/null and b/public/images/sponsors/interledger/13.webp differ diff --git a/public/images/sponsors/interledger/2.webp b/public/images/sponsors/interledger/2.webp new file mode 100644 index 0000000..061611c Binary files /dev/null and b/public/images/sponsors/interledger/2.webp differ diff --git a/public/images/sponsors/interledger/3.webp b/public/images/sponsors/interledger/3.webp new file mode 100644 index 0000000..2f540e4 Binary files /dev/null and b/public/images/sponsors/interledger/3.webp differ diff --git a/public/images/sponsors/interledger/4.webp b/public/images/sponsors/interledger/4.webp new file mode 100644 index 0000000..aec0e1d Binary files /dev/null and b/public/images/sponsors/interledger/4.webp differ diff --git a/public/images/sponsors/interledger/5.webp b/public/images/sponsors/interledger/5.webp new file mode 100644 index 0000000..ae81679 Binary files /dev/null and b/public/images/sponsors/interledger/5.webp differ diff --git a/public/images/sponsors/interledger/6.webp b/public/images/sponsors/interledger/6.webp new file mode 100644 index 0000000..a0675e0 Binary files /dev/null and b/public/images/sponsors/interledger/6.webp differ diff --git a/public/images/sponsors/interledger/7.webp b/public/images/sponsors/interledger/7.webp new file mode 100644 index 0000000..ac9533d Binary files /dev/null and b/public/images/sponsors/interledger/7.webp differ diff --git a/public/images/sponsors/interledger/8.webp b/public/images/sponsors/interledger/8.webp new file mode 100644 index 0000000..0be76d7 Binary files /dev/null and b/public/images/sponsors/interledger/8.webp differ diff --git a/public/images/sponsors/interledger/9.webp b/public/images/sponsors/interledger/9.webp new file mode 100644 index 0000000..98a9894 Binary files /dev/null and b/public/images/sponsors/interledger/9.webp differ diff --git a/src/assets/data/schedule.ts b/src/assets/data/schedule.ts index 89c6080..8be92b5 100644 --- a/src/assets/data/schedule.ts +++ b/src/assets/data/schedule.ts @@ -649,7 +649,7 @@ export const scheduleEvents: ScheduleEvent[] = [ date: "2026-07-25", title: "Sponsor Space: EPAM", displayTitle: "Sponsor Space: EPAM", - speaker: "EPAM", + speaker: "Carlos Alberto Riveros Varela", label: "Sponsor Space", }, { @@ -873,21 +873,12 @@ export const scheduleEvents: ScheduleEvent[] = [ room: "Room 14 - Workshops", hour: "8:00 - 10:00", date: "2026-07-26", - title: "Workshop: FACTORED Sponsor", - displayTitle: "FACTORED Sponsor", - speaker: "Factored", + title: "Workshop: Construyendo Agentes de IA para jugar Catan", + displayTitle: "Construyendo Agentes de IA para jugar Catan", + speaker: "Sebastián Rodríguez Colina", + talkKey: "ai-agents-catan", label: "FACTORED Sponsor", - }, - { - id: "83", - type: "workshop", - room: "Room 15 - Workshops", - hour: "8:00 - 10:00", - date: "2026-07-26", - title: "Workshop: EPAM Sponsor", - displayTitle: "EPAM Sponsor", - speaker: "EPAM", - label: "EPAM Sponsor", + language: ["ES"], }, { id: "63", @@ -1092,10 +1083,27 @@ export const scheduleEvents: ScheduleEvent[] = [ room: "Room 14 - Workshops", hour: "10:30 - 12:30", date: "2026-07-26", - title: "Workshop: FACTORED Sponsor", - displayTitle: "FACTORED Sponsor", - speaker: "Factored", + title: + "Workshop: Extracción de datos de PDFs a escala: cuándo confiar en un LLM", + displayTitle: + "Extracción de datos de PDFs a escala: cuándo confiar en un LLM", + speaker: "Douglas Ardila Garcés", + talkKey: "pdf-extraction-llm", label: "FACTORED Sponsor", + language: ["ES"], + }, + { + id: "83", + type: "workshop", + room: "Room 15 - Workshops", + hour: "10:30 - 12:30", + date: "2026-07-26", + title: "Workshop: Forjando Agentes en AWS: Hechizos con Strands, MCP y A2A", + displayTitle: "Forjando Agentes en AWS: Hechizos con Strands, MCP y A2A", + speaker: "David Stiven Jurado Chavarria", + talkKey: "forjando-agentes-aws", + label: "EPAM Sponsor", + language: ["ES"], }, { id: "72", diff --git a/src/assets/data/sponsor-gallery.ts b/src/assets/data/sponsor-gallery.ts index 4322e0b..78657c3 100644 --- a/src/assets/data/sponsor-gallery.ts +++ b/src/assets/data/sponsor-gallery.ts @@ -3,6 +3,7 @@ import { aimpointGalleryImages } from "@/assets/data/sponsor-gallery/aimpoint"; import { epamGalleryImages } from "@/assets/data/sponsor-gallery/epam"; import { factoredGalleryImages } from "@/assets/data/sponsor-gallery/factored"; import { genlogsGalleryImages } from "@/assets/data/sponsor-gallery/genlogs"; +import { interledgerGalleryImages } from "@/assets/data/sponsor-gallery/interledger"; import { lokaGalleryImages } from "@/assets/data/sponsor-gallery/loka"; import { provectusGalleryImages } from "@/assets/data/sponsor-gallery/provectus"; import { slalomGalleryImages } from "@/assets/data/sponsor-gallery/slalom"; @@ -12,6 +13,7 @@ const sponsorGalleryBySlug: Partial> = { epam: epamGalleryImages, factored: factoredGalleryImages, genlogs: genlogsGalleryImages, + interledger: interledgerGalleryImages, loka: lokaGalleryImages, provectus: provectusGalleryImages, slalom: slalomGalleryImages, diff --git a/src/assets/data/sponsor-gallery/interledger.ts b/src/assets/data/sponsor-gallery/interledger.ts new file mode 100644 index 0000000..a99231b --- /dev/null +++ b/src/assets/data/sponsor-gallery/interledger.ts @@ -0,0 +1,57 @@ +import type { GalleryImage } from "@/assets/data/gallery"; + +/** Gallery images for Interledger — files in public/images/sponsors/interledger/ */ +export const interledgerGalleryImages: GalleryImage[] = [ + { + src: "/images/sponsors/interledger/1.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/2.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/3.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/4.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/5.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/6.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/7.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/8.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/9.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/10.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/11.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/12.webp", + alt: "Interledger at PyCon Colombia", + }, + { + src: "/images/sponsors/interledger/13.webp", + alt: "Interledger at PyCon Colombia", + }, +]; diff --git a/src/assets/data/sponsor-videos.ts b/src/assets/data/sponsor-videos.ts index d8c7d8d..f0ea637 100644 --- a/src/assets/data/sponsor-videos.ts +++ b/src/assets/data/sponsor-videos.ts @@ -3,6 +3,7 @@ import { epamVideos } from "@/assets/data/sponsor-videos/epam"; import { factoredVideos } from "@/assets/data/sponsor-videos/factored"; import { interledgerVideos } from "@/assets/data/sponsor-videos/interledger"; import { lokaVideos } from "@/assets/data/sponsor-videos/loka"; +import { lovelyticsVideos } from "@/assets/data/sponsor-videos/lovelytics"; import { provectusVideos } from "@/assets/data/sponsor-videos/provectus"; import { slalomVideos } from "@/assets/data/sponsor-videos/slalom"; @@ -17,6 +18,7 @@ const sponsorVideosBySlug: Partial> = { factored: factoredVideos, interledger: interledgerVideos, loka: lokaVideos, + lovelytics: lovelyticsVideos, provectus: provectusVideos, slalom: slalomVideos, }; diff --git a/src/assets/data/sponsor-videos/interledger.ts b/src/assets/data/sponsor-videos/interledger.ts index f4dbaaa..b244e4f 100644 --- a/src/assets/data/sponsor-videos/interledger.ts +++ b/src/assets/data/sponsor-videos/interledger.ts @@ -5,4 +5,8 @@ export const interledgerVideos: SponsorVideo[] = [ youtubeId: "1fTdtpLdDH0", title: "What is Interledger", }, + { + youtubeId: "hMOHUODru_Y", + title: "What is Interledger? Spanish Subtitles", + }, ]; diff --git a/src/assets/data/sponsor-videos/lovelytics.ts b/src/assets/data/sponsor-videos/lovelytics.ts new file mode 100644 index 0000000..06986ee --- /dev/null +++ b/src/assets/data/sponsor-videos/lovelytics.ts @@ -0,0 +1,8 @@ +import type { SponsorVideo } from "@/assets/data/sponsor-videos"; + +export const lovelyticsVideos: SponsorVideo[] = [ + { + youtubeId: "LAYzW73aN0I", + title: "Lovelytics at PyCon Colombia", + }, +]; diff --git a/src/assets/data/workshop-requirements.ts b/src/assets/data/workshop-requirements.ts index d7e346e..e5472c3 100644 --- a/src/assets/data/workshop-requirements.ts +++ b/src/assets/data/workshop-requirements.ts @@ -77,6 +77,12 @@ A free or paid account for an AI assistant such as Cursor, GitHub Copilot, Claud "You need a Sigma Public account; just create an account with your email: https://public.sigmacomputing.com/", "elkin-javier-guerra-galeano": "Python +3.10, Ollama installed, Docker installed.", + "sebastian-rodriguez-colina": + "uv (https://docs.astral.sh/uv/), Docker, and Git", + "douglas-ardila-garces": + "https://github.com/factoredai/factored-pycon-workshop-2026-data-engineering", + "david-stiven-jurado-chavarria": + "Only a laptop is required; AWS accounts will be provided for the workshop.", }; export const workshopRequirementsEs: Record = { @@ -156,6 +162,11 @@ Una cuenta gratuita o versión paga de un asistente de inteligencia artificial c "Se necesita una cuenta de Sigma Public, solo deben crear una cuenta con su correo: https://public.sigmacomputing.com/", "elkin-javier-guerra-galeano": "Python +3.10, Ollama instalado, Docker instalado.", + "sebastian-rodriguez-colina": "uv (https://docs.astral.sh/uv/), docker y git", + "douglas-ardila-garces": + "https://github.com/factoredai/factored-pycon-workshop-2026-data-engineering", + "david-stiven-jurado-chavarria": + "Solo laptop es requerida, cuentas de AWS serán proporcionadas para la ejecución del workshop", }; export const workshopRequirementsByLocale: Record< diff --git a/src/assets/data/workshop-speakers-content.locale.ts b/src/assets/data/workshop-speakers-content.locale.ts index 09814a7..e8e2fe8 100644 --- a/src/assets/data/workshop-speakers-content.locale.ts +++ b/src/assets/data/workshop-speakers-content.locale.ts @@ -322,6 +322,30 @@ const workshopContentEn: SpeakerContentBySlug = { talkTitle: "", talkDescription: "", }, + "sebastian-rodriguez-colina": { + title: "Staff Machine Learning Engineer @ Factored", + description: + "Machine Learning Engineer with 10+ years of experience building scalable solutions and delivering high business value through generative AI, computer vision, and MLOps techniques for AI startups, technology companies, and the manufacturing industry. Moreover, I have been a mentor and a teacher of AI related subjects at Universidad EAFIT and Universidad de Antioquia.", + talkTitle: "Building AI Agents to Play Catan", + talkDescription: + "Designing AI for environments with chance and imperfect information is a fascinating challenge. In this workshop, we will develop a Python agent capable of playing Settlers of Catan and compare different approaches live. Beyond the board, attendees will discover how the principles used here apply to any LLM-based agent system. You will learn to equip your agents with tools, connect services via MCP (Model Context Protocol), and structure robust architectures to optimize complex decision-making.", + }, + "douglas-ardila-garces": { + title: "Engineering Manager & Data engineer @ Factored", + description: + "Engineering Manager & Data engineer with strong experience in architecting, developing, and maintaining highly reliable analytical data infrastructure and data pipelines that move data in and out to enable better decision-making and create business value primarily within the Fintech sector. Proficient in AWS, Google Cloud, Snowflake’s data ecosystem, Airflow, dbt, and other tools. Cares about other team members and is invested in empowering them to grow personally and professionally. Works cross-functionally with stakeholders (software engineers, data scientists, business analysts, etc), to ensure that the data infrastructure meets their evolving needs.\n\nCurrently, working as a Data Engineering Manager at Factored (one of the fastest-growing data science companies in the Americas, we build very high-caliber teams of rigorously vetted data scientists for top US companies).", + talkTitle: "PDF Data Extraction at Scale: When to Trust an LLM", + talkDescription: + 'LLMs read chaotic documents like no one else, but when money or legal liability is on the line, the question is not "can it?" but "when should I trust it, and how do I catch it when it is wrong?". In this hands-on workshop we build, step by step, a real extraction pipeline for legal PDFs with variable formats, orchestrated with Airflow, using a hybrid extractor (deterministic + LLM) and deterministic guardrails in Python. You will leave with a framework for deciding which tool to use and a reliable pattern for production environments.', + }, + "david-stiven-jurado-chavarria": { + title: "Lead Systems Engineer @ EPAM", + description: + "I am a DevOps/Cloud Engineer with more than 8 years of experience in Tech. I currently participate in AI projects where I have been able to go deeper into GenAI without limiting my scope only to infrastructure or DevOps. I have been a speaker at multiple events and I lead 2 communities: CloudCrafters and AI AWS UG Colombia.", + talkTitle: "Forging Agents on AWS: Spells with Strands, MCP, and A2A", + talkDescription: + "Artificial intelligence is no longer just a tool that developers use: it is a teammate they can build. In this workshop, you will discover how to forge autonomous AI agents on AWS using Strands, a framework that simplifies creating agents able to think and act on their own. We will explore how to connect these agents with external tools and services via MCP (Model Context Protocol), how to orchestrate communication among multiple agents with A2A (Agent-to-Agent), and how to design systems where several agents collaborate to solve complex problems in a coordinated way.", + }, }; const workshopContentEs: SpeakerContentBySlug = { @@ -628,6 +652,30 @@ const workshopContentEs: SpeakerContentBySlug = { talkTitle: "", talkDescription: "", }, + "sebastian-rodriguez-colina": { + title: "Staff Machine Learning Engineer @ Factored", + description: + "Ingeniero de Machine Learning con más de 10 años de experiencia construyendo soluciones escalables y generando alto valor de negocio mediante técnicas de IA generativa, visión por computador y MLOps para startups de IA, empresas de tecnología y la industria manufacturera. Además, he sido mentor y docente de temas relacionados con IA en la Universidad EAFIT y la Universidad de Antioquia.", + talkTitle: "Construyendo Agentes de IA para jugar Catan", + talkDescription: + "Diseñar IA para entornos con azar e información imperfecta es un reto fascinante. En este taller, desarrollaremos un agente de Python capaz de jugar Settlers of Catan y enfrentaremos diferentes enfoques en vivo. Más allá del tablero, los asistentes descubrirán cómo los principios utilizados aquí se aplican a cualquier sistema de agentes basados en LLMs. Aprenderás a equipar a tus agentes con herramientas, conectar servicios mediante MCP (Model Context Protocol) y estructurar arquitecturas robustas para optimizar la toma de decisiones complejas.", + }, + "douglas-ardila-garces": { + title: "Engineering Manager & Data engineer @ Factored", + description: + "Engineering Manager & Data engineer con sólida experiencia diseñando, desarrollando y manteniendo infraestructura analítica y pipelines de datos altamente confiables que mueven datos de un lado a otro para habilitar mejores decisiones y crear valor de negocio, principalmente en el sector Fintech. Dominio de AWS, Google Cloud, el ecosistema de datos de Snowflake, Airflow, dbt y otras herramientas. Se preocupa por las personas de su equipo y se invierte en empoderarlas para crecer personal y profesionalmente. Trabaja de forma transversal con stakeholders (ingenieros de software, científicos de datos, analistas de negocio, etc.) para asegurar que la infraestructura de datos responda a sus necesidades en evolución.\n\nActualmente trabaja como Data Engineering Manager en Factored (una de las empresas de ciencia de datos de más rápido crecimiento en las Américas; construimos equipos de alto calibre de científicos de datos rigurosamente evaluados para empresas top de EE. UU.).", + talkTitle: "Extracción de datos de PDFs a escala: cuándo confiar en un LLM", + talkDescription: + 'Los LLMs leen documentos caóticos como nadie, pero cuando te juegas dinero o responsabilidad legal, la pregunta no es "¿puede?" sino "¿cuándo debo confiar y cómo lo atrapo cuando se equivoca?". En este taller práctico construimos, paso a paso, un pipeline real de extracción de datos de PDFs legales de formato variable orquestado con Airflow, con un extractor híbrido (determinista + LLM) y guardrails deterministas en Python. Saldrás con un framework para decidir qué herramienta usar y un patrón confiable para ambientes productivos.', + }, + "david-stiven-jurado-chavarria": { + title: "Lead Systems Engineer @ EPAM", + description: + "Soy DevOps/Cloud Engineer con más de 8 años de experiencia en Tech. Actualmente me encuentro participando en proyectos de IA donde he podido tener la experiencia de adentrarme un poco más en el mundo del GenAI sin limitar mi alcance netamente a infraestructura o DevOps. He sido speaker en múltiples eventos y soy líder de 2 comunidades: CloudCrafters y AI AWS UG Colombia.", + talkTitle: "Forjando Agentes en AWS: Hechizos con Strands, MCP y A2A", + talkDescription: + "La inteligencia artificial ya no es solo una herramienta que los desarrolladores usan: es un compañero de equipo que pueden construir. En este workshop, descubrirás cómo forjar agentes de IA autónomos en AWS usando Strands, un framework que simplifica la creación de agentes capaces de pensar y actuar por sí mismos. Exploraremos cómo conectar estos agentes con herramientas y servicios externos mediante MCP (Model Context Protocol), cómo orquestar la comunicación entre múltiples agentes con A2A (Agent-to-Agent), y cómo diseñar sistemas donde varios agentes colaboran para resolver problemas complejos de forma coordinada.", + }, }; export const workshopSpeakerContentByLocale: Record< SiteLocale, diff --git a/src/assets/data/workshop-speakers.ts b/src/assets/data/workshop-speakers.ts index 0e041bf..bd22209 100644 --- a/src/assets/data/workshop-speakers.ts +++ b/src/assets/data/workshop-speakers.ts @@ -77,6 +77,12 @@ const workshopSpeakerImages: Record = { "https://drive.google.com/open?id=1_VnqQ_auY0NHtlSv5JluF3LBIfLnXzmc", "elkin-javier-guerra-galeano": "https://drive.google.com/open?id=1OflXShgH7ig1EDesVvdObqXc47GKGS9R", + "sebastian-rodriguez-colina": + "https://drive.google.com/open?id=1HDPMXTg3uGp28m4rsNK2lNjxlPOM31RH", + "douglas-ardila-garces": + "https://drive.google.com/open?id=1AdTgHque9-0dFaw-6RYpK2aXIe7YJiK9", + "david-stiven-jurado-chavarria": + "https://drive.google.com/open?id=1F7dgfO-ta8QPYpbyof2m6mlNLk-VYILH", }; const workshopSpeakerListBase: SpeakerInput[] = [ @@ -549,6 +555,53 @@ const workshopSpeakerListBase: SpeakerInput[] = [ level: "Intermediate / Intermedio", format: "workshop", }, + // 27. Building AI Agents to Play Catan (FACTORED Sponsor) + { + slug: "sebastian-rodriguez-colina", + talkKey: "ai-agents-catan", + name: "Sebastián Rodríguez Colina", + github: "https://github.com/srcolinas", + linkedin: "https://www.linkedin.com/in/srcolinas/", + tracks: [ + "artificial-intelligence", + "data-science", + "machine-learning", + ] as SpeakerTrack[], + country: "Colombia", + language: "Spanish / Español", + level: "Intermediate / Intermedio", + format: "workshop", + }, + // 28. PDF Extraction at Scale (FACTORED Sponsor) + { + slug: "douglas-ardila-garces", + talkKey: "pdf-extraction-llm", + name: "Douglas Ardila Garcés", + github: "https://github.com/douglasag17", + linkedin: "https://www.linkedin.com/in/douglasag17", + tracks: [ + "artificial-intelligence", + "core-python", + "machine-learning", + "data-science", + ] as SpeakerTrack[], + country: "Colombia", + language: "Spanish / Español", + level: "All / Para todos los niveles", + format: "workshop", + }, + // 29. Forjando Agentes en AWS (EPAM Sponsor) + { + slug: "david-stiven-jurado-chavarria", + talkKey: "forjando-agentes-aws", + name: "David Stiven Jurado Chavarria", + linkedin: "https://www.linkedin.com/in/d-jurado/", + tracks: ["artificial-intelligence"] as SpeakerTrack[], + country: "Colombia", + language: "Spanish / Español", + level: "Intermediate / Intermedio", + format: "workshop", + }, ]; export const workshopSpeakerList: SpeakerInput[] = workshopSpeakerListBase.map( diff --git a/src/components/shadcn-studio/blocks/user-schedule-02/user-schedule-02.tsx b/src/components/shadcn-studio/blocks/user-schedule-02/user-schedule-02.tsx index ac9431a..d28bacf 100644 --- a/src/components/shadcn-studio/blocks/user-schedule-02/user-schedule-02.tsx +++ b/src/components/shadcn-studio/blocks/user-schedule-02/user-schedule-02.tsx @@ -233,7 +233,11 @@ function ScheduleEventCard({ event, t, locale }: ScheduleEventCardProps) { const eventSpeakers = resolveSpeakersForScheduleEvent(event, locale); const showSpeakers = shouldShowScheduleSpeakers(event, eventSpeakers) && - !(sponsor && isSponsorSpaceEvent(event)); + !( + sponsor && + isSponsorSpaceEvent(event) && + !eventSpeakers.some((speaker) => speaker.slug) + ); const keynoteHref = keynote ? getKeynoteHref(keynote.slug) : undefined; const talkHref = talk ? getTalkHref(talk.id) : undefined; const sessionHref = keynoteHref ?? talkHref;