diff --git a/_includes/world/2025/components/agenda_header.html b/_includes/world/2025/components/agenda_header.html new file mode 100644 index 000000000..c74470362 --- /dev/null +++ b/_includes/world/2025/components/agenda_header.html @@ -0,0 +1,13 @@ +
+
+

Rails World 2025

+

Official Agenda

+

+ When we say there’s something for everyone... we mean it. Here’s the full breakdown so you can plan your Rails World 2025 experience. +

+
+ +
+ attendees at rails world +
+
diff --git a/_includes/world/2025/components/agenda_tabs.html b/_includes/world/2025/components/agenda_tabs.html new file mode 100644 index 000000000..fb3d06580 --- /dev/null +++ b/_includes/world/2025/components/agenda_tabs.html @@ -0,0 +1,67 @@ +
+
+

Wednesday

+
+ +
+

Thursday

+
+ +
+

Friday

+
+
+ + diff --git a/_includes/world/2025/components/navbar_links.html b/_includes/world/2025/components/navbar_links.html index ef60075fb..705f79732 100644 --- a/_includes/world/2025/components/navbar_links.html +++ b/_includes/world/2025/components/navbar_links.html @@ -1,3 +1,4 @@ Speakers +Agenda FAQs Rails at Scale Summit diff --git a/_includes/world/2025/components/session_card.html b/_includes/world/2025/components/session_card.html index d3c556fa4..b6bdb408b 100644 --- a/_includes/world/2025/components/session_card.html +++ b/_includes/world/2025/components/session_card.html @@ -1,26 +1,57 @@ {% assign speaker_url = include.speaker.path | split: '/' | last | remove_first: '.md' %} {% assign session = include.session %} - {% assign clean_path = session.path | replace: '_world_sessions/2025', '' | replace: '.md', '' %} -
-

{{ session.title }}

-

{{ include.speaker.first_name }} {{ include.speaker.last_name }} - {{ include.speaker.tagline }}{% if include.speaker.company %}, {{ include.speaker.company }} {% endif %}

+ aria-label="{% unless session.show_page == false %}Go to {{ session.title }} session page{% else %}{{ session.title }}{% endunless %}" + {% unless session.show_page == false %} + onclick="openWindow('/world/2025{{ clean_path }}')" + onkeydown="handleEnterOrSpaceWindowOpen(event, '/world/2025{{ clean_path }}')" + role="button" + tabindex="0" + {% endunless %} > + + {% if page.path contains 'speakers/' %} +
+

{{ day }}

+

{{ session.time }}

+

{{ track }}

+
+ {% else %} +

{{ session.time }}

+ {% endif %} + +
+

{{ session.title }}

+ {% if session.multiple_speakers %} +

{{session.multiple_speakers}}

+ {% elsif include.speaker %} +

{{ include.speaker.first_name }} {{ include.speaker.last_name }} {% if include.speaker.tagline %} - {{ include.speaker.tagline }} {% endif %} {% if include.speaker.company %}, {{ include.speaker.company }} {% endif %}

+ {% endif %} +
diff --git a/_layouts/world/2025/session.html b/_layouts/world/2025/session.html index 531055cd3..ccd51bfae 100644 --- a/_layouts/world/2025/session.html +++ b/_layouts/world/2025/session.html @@ -5,10 +5,27 @@ {% assign filteredSpeakers = site.world_speakers | where_exp:"speaker", "speaker.path contains page.speaker" | where_exp: 'item', 'item.path contains "2025"' %} {% assign speaker = filteredSpeakers | first %} +{% if page.location == "Effectenbeurs" %} + {% assign track = "Track 1" %} +{% else %} + {% assign track = "Track 2" %} +{% endif %} + +{% if page.path contains 'day-1/' %} + {% assign day = 'Thursday September 4' %} +{% elsif page.path contains 'day-2/' %} + {% assign day = 'Friday September 5' %} +{% endif %} +

{{ page.title }}

{{ content }}

+ +
+ clock icon +

{{ day }} / {{ page.time }} / {{ track }}

+
diff --git a/_sass/world/2025/base/_colors.scss b/_sass/world/2025/base/_colors.scss index 7302734c8..8e99d8e29 100644 --- a/_sass/world/2025/base/_colors.scss +++ b/_sass/world/2025/base/_colors.scss @@ -15,3 +15,5 @@ $speaker-card-gradient-hover: linear-gradient(180deg, rgba(59, 29, 98, 0%) 0%, r $session-card-gradient: linear-gradient(-90deg, rgba(59, 29, 98, 0%) 20%, $red 100%); $session-card-gradient-hover: linear-gradient(-90deg, rgba(59, 29, 98, 0%) 0%, $red 61%); + +$agenda-tag-gradient: linear-gradient(0deg, rgba(59, 29, 98, 0%) 0%, $red 140%); diff --git a/_sass/world/2025/base/_layout.scss b/_sass/world/2025/base/_layout.scss index 6e465cc59..b8ae24a11 100644 --- a/_sass/world/2025/base/_layout.scss +++ b/_sass/world/2025/base/_layout.scss @@ -54,3 +54,14 @@ body { padding: 0 5%; } } + +.sessions-container { + margin-top: 80px; + display: flex; + flex-direction: column; + gap: 25px; + + @include media(MobileAndTabletScreens) { + margin-top: 50px; + } +} diff --git a/_sass/world/2025/modules/_agenda_page.scss b/_sass/world/2025/modules/_agenda_page.scss new file mode 100644 index 000000000..83ab1fd19 --- /dev/null +++ b/_sass/world/2025/modules/_agenda_page.scss @@ -0,0 +1,96 @@ +.agenda-page { + padding-left: 80px; + + @include media(MobileScreens) { + padding: 0 20px; + margin-bottom: 50px; + } + + @include media(TabletScreens) { + padding: 0 40px; + } +} + +.agenda-page { + .session-card { + @include media(MobileAndTabletScreens) { + width: 90%; + } + } +} + +.agenda-header { + margin-top: 50px; + display: flex; + align-items: center; + justify-content: space-between; + + @include media(MobileAndTabletScreens) { + flex-direction: column-reverse; + text-align: center; + } + + @include media(MobileScreens) { + margin-top: 25px; + } + + @include media(TabletScreens) { + margin-top: 50px; + } + + h1 { + margin-bottom: 10px; + + @include media(MobileScreens) { + font-size: $xx-large; + } + + @include media(TabletScreens) { + font-size: 50px; + } + } + + h2 { + font-size: 60px; + + @include media(MobileScreens) { + font-size: 25px; + } + + @include media(TabletScreens) { + font-size: 40px; + } + } + + p { + @include media(MobileScreens) { + font-size: 18px; + } + + @include media(TabletScreens) { + font-size: 28px; + } + } +} + +.agenda-header .content { + width: 50%; + align-self: flex-start; + margin-top: 100px; + + @include media(MobileAndTabletScreens) { + width: 100%; + margin-top: 25px; + } +} + +.agenda-header .illustration-container { + @include media(MobileAndTabletScreens) { + display: none; + } + + img { + width: 500px; + rotate: 180deg; + } +} diff --git a/_sass/world/2025/modules/_agenda_tabs.scss b/_sass/world/2025/modules/_agenda_tabs.scss new file mode 100644 index 000000000..01fcb4aa9 --- /dev/null +++ b/_sass/world/2025/modules/_agenda_tabs.scss @@ -0,0 +1,28 @@ +.agenda-tabs { + display: flex; + gap: 25px; + + @include media(MobileAndTabletScreens) { + margin-top: 50px; + } + + @include media(MobileScreens) { + gap: 10px; + } + + .tab { + cursor: pointer; + padding: 10px 50px; + border-top: 1px solid white; + border-right: 1px solid white; + border-left: 1px solid white; + + &:hover, &.active { + background-image: $agenda-tag-gradient; + } + + @include media(MobileScreens) { + padding: 10px; + } + } +} diff --git a/_sass/world/2025/modules/_session_card.scss b/_sass/world/2025/modules/_session_card.scss index 5a11b0d79..777717404 100644 --- a/_sass/world/2025/modules/_session_card.scss +++ b/_sass/world/2025/modules/_session_card.scss @@ -1,29 +1,79 @@ .session-card { - cursor: pointer; + display: flex; + align-items: center; + gap: 70px; position: relative; width: 100%; padding: 20px 25px; - display: flex; - flex-direction: column; - justify-content: flex-start; background-image: $session-card-gradient; transition: background 0.6s ease-in; - @include media(MobileScreens) { - gap: 10px; + &.pointer { + cursor: pointer; + } + + @include media(MobileAndTabletScreens) { + flex-direction: column; + align-items: flex-start; padding: 25px; width: fit-content; } + @include media(MobileScreens) { + gap: 20px; + } + + @include media(TabletScreens) { + gap: 30px; + } + + .details { + width: 160px; + padding-right: 50px; + border-right: 1px solid white; + font-variation-settings: $font-weight-800-basic; + font-size: 22px; + + @include media(MobileScreens) { + font-size: 16px;; + } + + @include media(TabletScreens) { + font-size: 20px; + } + + @include media(MobileAndTabletScreens) { + width: fit-content; + border-right: none; + padding-right: 0; + } + } + + .content { + display: flex; + flex-direction: column; + justify-content: flex-start; + + @include media(MobileAndTabletScreens) { + gap: 10px; + } + } + h3 { font-size: $x-large; font-variation-settings: $font-weight-700; line-height: 45px; + margin-bottom: 0; @include media(MobileScreens) { font-size: 18px; line-height: 25px; } + + @include media(TabletScreens) { + font-size: 22px; + line-height: 35px; + } } p { diff --git a/_sass/world/2025/modules/_session_page.scss b/_sass/world/2025/modules/_session_page.scss index ce189d522..3146730b3 100644 --- a/_sass/world/2025/modules/_session_page.scss +++ b/_sass/world/2025/modules/_session_page.scss @@ -49,3 +49,16 @@ margin-top: 100px; } } + +.session-page .session-details { + display: flex; + align-items: center; + gap: 10px; + margin-top: 20px; + + p { + color: $pink; + font-size: $x-large; + font-variation-settings: $font-weight-700; + } +} diff --git a/_sass/world/2025/modules/_speaker_show.scss b/_sass/world/2025/modules/_speaker_show.scss index 622b4440c..e6ca7f2a1 100644 --- a/_sass/world/2025/modules/_speaker_show.scss +++ b/_sass/world/2025/modules/_speaker_show.scss @@ -128,14 +128,3 @@ } } } - -.speaker-show-page .sessions-container { - margin-top: 80px; - display: flex; - flex-direction: column; - gap: 25px; - - @include media(MobileAndTabletScreens) { - margin-top: 50px; - } -} diff --git a/_world_sessions/2025/day-0/early-registration.md b/_world_sessions/2025/day-0/early-registration.md new file mode 100644 index 000000000..0e24228d2 --- /dev/null +++ b/_world_sessions/2025/day-0/early-registration.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Pre-registration & badge pickup +speaker: false +time: 16:00 - 19:00 +location: +running_order: 0 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/adrianna-chang.md b/_world_sessions/2025/day-1/adrianna-chang.md index 452bddb95..32812ba61 100644 --- a/_world_sessions/2025/day-1/adrianna-chang.md +++ b/_world_sessions/2025/day-1/adrianna-chang.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "From Chaos to Clarity: Structured Event Reporting in Rails" speaker: adrianna-chang.md -time: -location: -running_order: +time: 14:45 - 15:15 +location: Graanbeurs +running_order: 10 --- Events in Rails applications are like the heartbeat of your code - whether it’s a log, a telemetry signal, or a business event, they tell us when something interesting is happening. To truly harness he power of these events for observability and data analysis, we need high-quality, contextualized data. The human-readable lines that Rails.logger provides is great for manual inspection but falls short in production and analytics contexts. diff --git a/_world_sessions/2025/day-1/austin-story.md b/_world_sessions/2025/day-1/austin-story.md index a32106d92..603713b2b 100644 --- a/_world_sessions/2025/day-1/austin-story.md +++ b/_world_sessions/2025/day-1/austin-story.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Startup Speed, Enterprise Scale: Rails Powers 3k Events/Sec Throughput" speaker: austin-story.md -time: -location: -running_order: +time: 11:15 - 11:45 +location: Graanbeurs +running_order: 3 --- Ditch vendor lock-in! diff --git a/_world_sessions/2025/day-1/david-hansson.md b/_world_sessions/2025/day-1/david-hansson.md index 1e3642b7a..fe904696f 100644 --- a/_world_sessions/2025/day-1/david-hansson.md +++ b/_world_sessions/2025/day-1/david-hansson.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Rails World Opening Keynote" speaker: david-hansson.md -time: -location: -running_order: +time: 10:00 - 11:00 +location: Effectenbeurs +running_order: 1 --- DHH will kick off the third edition of Rails World in Amsterdam with an Opening Keynote highlighting what is new in Rails today, and where the framework is headed tomorrow. diff --git a/_world_sessions/2025/day-1/donal-mcbreen.md b/_world_sessions/2025/day-1/donal-mcbreen.md index df426b169..524624299 100644 --- a/_world_sessions/2025/day-1/donal-mcbreen.md +++ b/_world_sessions/2025/day-1/donal-mcbreen.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Resumable Jobs with Active Job Continuations" speaker: donal-mcbreen.md -time: -location: -running_order: +time: 13:45 - 14:15 +location: Graanbeurs +running_order: 8 --- Long-running jobs can cause problems. They can delay deployments and leave old versions of your code running longer than expected. Interrupting them can leave data in an inconsistent state or cause redundant rework. diff --git a/_world_sessions/2025/day-1/hartley-mcguire.md b/_world_sessions/2025/day-1/hartley-mcguire.md index 3289f30b4..94360607f 100644 --- a/_world_sessions/2025/day-1/hartley-mcguire.md +++ b/_world_sessions/2025/day-1/hartley-mcguire.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Active Record 8: Resilient by Default" speaker: hartley-mcguire.md -time: -location: -running_order: +time: 15:45 - 16:15 +location: Graanbeurs +running_order: 12 --- Databases crash, connections drop, and queries timeout at the worst possible moments. Rather than writing custom rescue code everywhere, Rails is revolutionizing how Active Record handles these inevitable hiccups. diff --git a/_world_sessions/2025/day-1/jack-sharkey.md b/_world_sessions/2025/day-1/jack-sharkey.md index da71704c4..05a562513 100644 --- a/_world_sessions/2025/day-1/jack-sharkey.md +++ b/_world_sessions/2025/day-1/jack-sharkey.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "The $1B Rails Startup: Scaling from 0 to Unicorn in Four Years" speaker: jack-sharkey.md -time: -location: -running_order: +time: 15:45 - 16:15 +location: Effectenbeurs +running_order: 11 --- We started when Rails was “dead.” Everyone said it wouldn’t scale, wasn’t fast enough, and that no one used it anymore. Four years later, we’ve processed $1B+, handle 150k RPM, and run a feature-complete marketplace with real-time chat, notifications, payments, and live streaming - all on a Rails monolith with just 15 engineers. diff --git a/_world_sessions/2025/day-1/katarina-rossi.md b/_world_sessions/2025/day-1/katarina-rossi.md index b8ba321b4..0527d356d 100644 --- a/_world_sessions/2025/day-1/katarina-rossi.md +++ b/_world_sessions/2025/day-1/katarina-rossi.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Teaching Rails with the Real Thing: Onboarding Engineers into a (Massive) Monolith" speaker: katarina-rossi.md -time: -location: -running_order: +time: 13:00 - 13:30 +location: Graanbeurs +running_order: 6 --- At Procore, our Rails monolith is massive - among the largest in the world - and intimidating to newcomers. I designed and taught a course that helped over 900 engineers of varying skill levels stop fearing it by teaching Rails and our monolith at the same time. Rather than using generic tutorials, we grounded everything in the actual product they’d be working on - layering Rails fundamentals with the domain-specific knowledge they really needed. In this talk, I’ll share how learning science, product context, and deep app knowledge came together to make our course work—and how you can adapt it for your team. diff --git a/_world_sessions/2025/day-1/kevin-mcconnell.md b/_world_sessions/2025/day-1/kevin-mcconnell.md index caf4804f8..b0d2faca7 100644 --- a/_world_sessions/2025/day-1/kevin-mcconnell.md +++ b/_world_sessions/2025/day-1/kevin-mcconnell.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "SQLite Replication with Beamer" speaker: kevin-mcconnell.md -time: -location: -running_order: +time: 13:00 - 13:30 +location: Effectenbeurs +running_order: 5 --- SQLite is an increasingly popular choice for powering Rails applications. It's fast, simple to use, and has an impressive feature set. But without a conventional database server, scaling beyond a single application server can be challenging. diff --git a/_world_sessions/2025/day-1/kinsey-durham.md b/_world_sessions/2025/day-1/kinsey-durham.md index f89c5cf95..aae589d01 100644 --- a/_world_sessions/2025/day-1/kinsey-durham.md +++ b/_world_sessions/2025/day-1/kinsey-durham.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Beyond the Prompt: Building Real-World LLM Features in Rails" speaker: kinsey-durham.md -time: -location: -running_order: +time: 13:45 - 14:15 +location: Effectenbeurs +running_order: 7 --- Prompting an LLM is easy. Building a Rails app that reliably integrates one? That’s a different story. This talk goes beyond prompt hacking to explore what it takes to bring LLM-powered features into real-world Rails apps—with real users, latency constraints, and production consequences. We’ll cover architectural patterns like model orchestration, prompt versioning, and skill/tool design, all tailored to the Rails ecosystem. You’ll learn how to connect your LLM to internal APIs, business logic, and background jobs, while keeping everything observable, testable, and maintainable. Whether you're adding a smart assistant or orchestrating agents, you’ll leave with practical Rails-specific strategies and patterns to build it right. diff --git a/_world_sessions/2025/day-1/lunch.md b/_world_sessions/2025/day-1/lunch.md new file mode 100644 index 000000000..03a2cad36 --- /dev/null +++ b/_world_sessions/2025/day-1/lunch.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Lunch sponsored by Codeminer42 +speaker: false +time: 11:45 - 13:00 +location: +running_order: 4 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/mike-dalessio.md b/_world_sessions/2025/day-1/mike-dalessio.md index 59eae14d6..a6b484429 100644 --- a/_world_sessions/2025/day-1/mike-dalessio.md +++ b/_world_sessions/2025/day-1/mike-dalessio.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Multi-Tenant Rails: Everybody Gets a Database!" speaker: mike-dalessio.md -time: -location: -running_order: +time: 11:15 - 11:45 +location: Effectenbeurs +running_order: 2 --- As Rails’s SQLite support has improved, it's finally possible to have truly multi-tenant Rails applications - isolated data for each account! - without sacrificing performance or ease of use. This talk describes a novel, production-vetted approach to isolating tenant data everywhere in Rails: the database, fragment caches, background jobs, Active Storage, Turbo Stream broadcasts, Action Mailer, and even the testing framework. diff --git a/_world_sessions/2025/day-1/miles-mcguire.md b/_world_sessions/2025/day-1/miles-mcguire.md index 7aa8141c8..cfdd3c408 100644 --- a/_world_sessions/2025/day-1/miles-mcguire.md +++ b/_world_sessions/2025/day-1/miles-mcguire.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Taming the Beast: Safely Managing Database Operations in Rails in a Team of 100s" speaker: miles-mcguire.md -time: -location: -running_order: +time: 14:45 - 15:15 +location: Effectenbeurs +running_order: 9 --- Intercom leverages Rails to empower hundreds of engineers to move fast and make the changes they need in production without a lengthy centralized review process. But allowing arbitrary migrations to run across hundreds of tables and hundreds of terabytes of data in MySQL comes with inherent risks. In this session, we’ll look at where we came from, what changes we've made to reduce risk and enable people to move fast while safely leveraging Rails’ power, and where we're going in the future. diff --git a/_world_sessions/2025/day-1/opening.md b/_world_sessions/2025/day-1/opening.md new file mode 100644 index 000000000..a11d6bdbb --- /dev/null +++ b/_world_sessions/2025/day-1/opening.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Doors Open +speaker: false +time: 09:00 - 10:00 +location: +running_order: 0 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/xavier-noria.md b/_world_sessions/2025/day-1/xavier-noria.md index 66f7eac23..49e824822 100644 --- a/_world_sessions/2025/day-1/xavier-noria.md +++ b/_world_sessions/2025/day-1/xavier-noria.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Day 1 Closing Keynote" speaker: xavier-noria.md -time: -location: -running_order: +time: 16:30 - 17:30 +location: Effectenbeurs +running_order: 13 --- This talk will cover Rails internals that are closest to the user. It has been written with both newcomers and seasoned developers in mind. diff --git a/_world_sessions/2025/day-1/aaron-patterson.md b/_world_sessions/2025/day-2/aaron-patterson.md similarity index 75% rename from _world_sessions/2025/day-1/aaron-patterson.md rename to _world_sessions/2025/day-2/aaron-patterson.md index 8be4a8aa2..a661924eb 100644 --- a/_world_sessions/2025/day-1/aaron-patterson.md +++ b/_world_sessions/2025/day-2/aaron-patterson.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Rails World Closing Keynote" speaker: aaron-patterson.md -time: -location: -running_order: +time: 16:30 - 17:30 +location: Effectenbeurs +running_order: 13 --- We actually never know with Aaron. We'll find out what this session is about when you do. diff --git a/_world_sessions/2025/day-2/andrew-mcnamara.md b/_world_sessions/2025/day-2/andrew-mcnamara.md new file mode 100644 index 000000000..f79adbbdd --- /dev/null +++ b/_world_sessions/2025/day-2/andrew-mcnamara.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: "AI Agents at Scale" +speaker: andrew-mcnamara.md +time: 15:45 - 16:15 +location: Effectenbeurs +running_order: 11 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/chris-oliver.md b/_world_sessions/2025/day-2/chris-oliver.md similarity index 90% rename from _world_sessions/2025/day-1/chris-oliver.md rename to _world_sessions/2025/day-2/chris-oliver.md index 808de9170..d96fb2499 100644 --- a/_world_sessions/2025/day-1/chris-oliver.md +++ b/_world_sessions/2025/day-2/chris-oliver.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Beyond the Basics: Advanced Rails Techniques" speaker: chris-oliver.md -time: -location: -running_order: +time: 13:45 - 14:15 +location: Effectenbeurs +running_order: 7 --- This talk showcases ways to take a traditional Rails app and shape it around your product domain—while also using Rails tools in ways you might not have considered. diff --git a/_world_sessions/2025/day-2/closing.md b/_world_sessions/2025/day-2/closing.md new file mode 100644 index 000000000..f116df941 --- /dev/null +++ b/_world_sessions/2025/day-2/closing.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Closing party (location TBD) +speaker: false +time: 18:30 - 22:30 +location: +running_order: 14 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/jason-meller.md b/_world_sessions/2025/day-2/jason-meller.md similarity index 93% rename from _world_sessions/2025/day-1/jason-meller.md rename to _world_sessions/2025/day-2/jason-meller.md index 1271ff3c6..44fc5c15d 100644 --- a/_world_sessions/2025/day-1/jason-meller.md +++ b/_world_sessions/2025/day-2/jason-meller.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Passkeys Have Problems, but So Will You If You Ignore Them" speaker: jason-meller.md -time: -location: -running_order: +time: 14:45 - 15:15 +location: Graanbeurs +running_order: 10 --- Back in 2024, many of us in the Rails community dismissed passkeys as hype rather than a real password replacement. But now we're facing a serious problem - a newer and more sophisticated attack called Real-Time Phishing is gaining popularity and effortlessly defeating nearly all popular 2FA methods, except one: passkeys. Even security experts are getting fooled, and AI makes these attacks frighteningly scalable. In this session, I'll demo exactly how attackers execute real-time phishing live. Then we'll turn the tables: I'll guide you step-by-step through adding secure, user-friendly passkey authentication as an MFA option to your Rails 8 apps. Come on, Rails! Let's give passkeys one more chance. diff --git a/_world_sessions/2025/day-1/joe-masilotti.md b/_world_sessions/2025/day-2/joe-masilotti.md similarity index 93% rename from _world_sessions/2025/day-1/joe-masilotti.md rename to _world_sessions/2025/day-2/joe-masilotti.md index a3b0a664b..46aea60a3 100644 --- a/_world_sessions/2025/day-1/joe-masilotti.md +++ b/_world_sessions/2025/day-2/joe-masilotti.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Hotwire Native: A Rails Developer’s Secret Tool to Building Mobile Apps" speaker: joe-masilotti.md -time: -location: -running_order: +time: 14:45 - 15:15 +location: Effectenbeurs +running_order: 9 --- Building native mobile apps is time-consuming and expensive. Each screen must be built three times: once for web, again for iOS, and a third time for Android. diff --git a/_world_sessions/2025/day-2/lunch.md b/_world_sessions/2025/day-2/lunch.md new file mode 100644 index 000000000..03a2cad36 --- /dev/null +++ b/_world_sessions/2025/day-2/lunch.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Lunch sponsored by Codeminer42 +speaker: false +time: 11:45 - 13:00 +location: +running_order: 4 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/masafumi-okura.md b/_world_sessions/2025/day-2/masafumi-okura.md similarity index 90% rename from _world_sessions/2025/day-1/masafumi-okura.md rename to _world_sessions/2025/day-2/masafumi-okura.md index 399daf49e..8e7a8d72f 100644 --- a/_world_sessions/2025/day-1/masafumi-okura.md +++ b/_world_sessions/2025/day-2/masafumi-okura.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Reading Rails 1.0 Source Code" speaker: masafumi-okura.md -time: -location: -running_order: +time: 13:00 - 13:30 +location: Graanbeurs +running_order: 6 --- Rails is great. In fact, Rails has been great since the very beginning. However, in terms of technical details, Rails 1.0 was very different from Rails 8. Lots of things have changed, many frameworks have been introduced and overall quality has been polished. diff --git a/_world_sessions/2025/day-2/opening-keynote.md b/_world_sessions/2025/day-2/opening-keynote.md new file mode 100644 index 000000000..f67de5d30 --- /dev/null +++ b/_world_sessions/2025/day-2/opening-keynote.md @@ -0,0 +1,12 @@ +--- +layout: world/2025/session +title: "Ruby & Rails - a Chat with Maintainers" +multiple_speakers: "Hiroshi Shibata, Aaron Patterson, Jean Boussier" +speaker: hiroshi-shibata.md +second_speaker: aaron-patterson.md +third_speaker: jean-boussier.md +time: 10:00 - 11:00 +location: Effectenbeurs +running_order: 1 +show_page: false +--- diff --git a/_world_sessions/2025/day-2/opening.md b/_world_sessions/2025/day-2/opening.md new file mode 100644 index 000000000..a11d6bdbb --- /dev/null +++ b/_world_sessions/2025/day-2/opening.md @@ -0,0 +1,9 @@ +--- +layout: world/2025/session +title: Doors Open +speaker: false +time: 09:00 - 10:00 +location: +running_order: 0 +show_page: false +--- diff --git a/_world_sessions/2025/day-1/pawel-strzalkowski.md b/_world_sessions/2025/day-2/pawel-strzalkowski.md similarity index 93% rename from _world_sessions/2025/day-1/pawel-strzalkowski.md rename to _world_sessions/2025/day-2/pawel-strzalkowski.md index 5119ac979..3def107b4 100644 --- a/_world_sessions/2025/day-1/pawel-strzalkowski.md +++ b/_world_sessions/2025/day-2/pawel-strzalkowski.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Make Rails AI-Ready by Design with the Model Context Protocol" speaker: pawel-strzalkowski.md -time: -location: -running_order: +time: 13:00 - 13:30 +location: Effectenbeurs +running_order: 5 --- Remember the joy of Rails scaffold creating web interfaces in DHH’s demos? Let’s make it just as simple for AI integrations! diff --git a/_world_sessions/2025/day-1/peter-zhu.md b/_world_sessions/2025/day-2/peter-zhu.md similarity index 92% rename from _world_sessions/2025/day-1/peter-zhu.md rename to _world_sessions/2025/day-2/peter-zhu.md index 0833694eb..61658103d 100644 --- a/_world_sessions/2025/day-1/peter-zhu.md +++ b/_world_sessions/2025/day-2/peter-zhu.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Ruby Stability at Scale" speaker: peter-zhu.md -time: -location: -running_order: +time: 11:15 - 11:45 +location: Effectenbeurs +running_order: 2 --- There are many talks, articles, and tutorials on how to monitor your Rails app for stability. These assume the source of the bug comes from your application code, from Rails itself, or from a gem. But what if the source of instability comes from Ruby or a native gem? If Ruby crashes, do you have any monitoring or ways to debug it? diff --git a/_world_sessions/2025/day-1/radan-skoric.md b/_world_sessions/2025/day-2/radan-skoric.md similarity index 93% rename from _world_sessions/2025/day-1/radan-skoric.md rename to _world_sessions/2025/day-2/radan-skoric.md index d23893e20..8dccf21ec 100644 --- a/_world_sessions/2025/day-1/radan-skoric.md +++ b/_world_sessions/2025/day-2/radan-skoric.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Lessons from Migrating a Legacy Frontend to Hotwire" speaker: radan-skoric.md -time: -location: -running_order: +time: 15:45 - 16:15 +location: Graanbeurs +running_order: 12 --- Is Hotwire just for `rails new` scenarios and not worth it for mature applications? Absolutely not. diff --git a/_world_sessions/2025/day-1/rosa-gutierrez.md b/_world_sessions/2025/day-2/rosa-gutierrez.md similarity index 86% rename from _world_sessions/2025/day-1/rosa-gutierrez.md rename to _world_sessions/2025/day-2/rosa-gutierrez.md index a605c57a2..6be7b1cdf 100644 --- a/_world_sessions/2025/day-1/rosa-gutierrez.md +++ b/_world_sessions/2025/day-2/rosa-gutierrez.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Coming Soon: Offline Mode to Hotwire with Service Workers" speaker: rosa-gutierrez.md -time: -location: -running_order: +time: 13:45 - 14:15 +location: Graanbeurs +running_order: 8 --- Rosa is trying out a new methodology called Conference Driven Development™, so she's actually hard at work on building what she will discuss in her talk at Rails World. So for now, this abstract is To Be Determined. Wish her luck! diff --git a/_world_sessions/2025/day-1/snehal-ahire.md b/_world_sessions/2025/day-2/snehal-ahire.md similarity index 94% rename from _world_sessions/2025/day-1/snehal-ahire.md rename to _world_sessions/2025/day-2/snehal-ahire.md index 56bfbaed5..99a1fd229 100644 --- a/_world_sessions/2025/day-1/snehal-ahire.md +++ b/_world_sessions/2025/day-2/snehal-ahire.md @@ -2,9 +2,9 @@ layout: world/2025/session title: "Rails Under a Microscope: Diagnosing Slowness at the Byte Level" speaker: snehal-ahire.md -time: -location: -running_order: +time: 11:15 - 11:45 +location: Graanbeurs +running_order: 3 --- We realized our legacy code didn’t need a rewrite, it needed a performance plan. diff --git a/_world_speakers/2025/speakers/andrew-mcnamara.md b/_world_speakers/2025/speakers/andrew-mcnamara.md new file mode 100644 index 000000000..49fd58e53 --- /dev/null +++ b/_world_speakers/2025/speakers/andrew-mcnamara.md @@ -0,0 +1,15 @@ +--- +layout: world/2025/speaker +redirect_from: /world/speakers/andrew-mcnamra +first_name: Andrew +last_name: Mcnamara +image_path: +role: +tagline: +company: +keynote: +github: +linkedin: +twitter: +specific_order: +--- diff --git a/_world_speakers/2025/speakers/hiroshi-shibata.md b/_world_speakers/2025/speakers/hiroshi-shibata.md index 3021b0a0e..8ae0822b0 100644 --- a/_world_speakers/2025/speakers/hiroshi-shibata.md +++ b/_world_speakers/2025/speakers/hiroshi-shibata.md @@ -10,7 +10,7 @@ keynote: true tagline: Ruby Committer & OSS maintainer github: https://github.com/hsbt linkedin: https://www.linkedin.com/in/hiroshi-shibata-04264122/ -twitter: +twitter: --- OSS programmer, Ruby committer, maintainer of many OSS such as Ruby, rubygems, rake, ruby-build and administrator of ruby-lang.org. diff --git a/_world_speakers/2025/speakers/jean-boussier.md b/_world_speakers/2025/speakers/jean-boussier.md new file mode 100644 index 000000000..72d0bf8c1 --- /dev/null +++ b/_world_speakers/2025/speakers/jean-boussier.md @@ -0,0 +1,15 @@ +--- +layout: world/2025/speaker +redirect_from: /world/speakers/jean-boussier +first_name: Jean +last_name: Boussier +image_path: +role: +tagline: +company: +keynote: +github: +linkedin: +twitter: +specific_order: +--- diff --git a/assets/css/world-2025.scss b/assets/css/world-2025.scss index 396c1826c..c77ff3b34 100644 --- a/assets/css/world-2025.scss +++ b/assets/css/world-2025.scss @@ -17,6 +17,8 @@ @import 'world/2025/common/hexagon_frame'; @import 'world/2025/common/social_card'; +@import 'world/2025/modules/agenda_page'; +@import 'world/2025/modules/agenda_tabs'; @import 'world/2025/modules/announcement_banner'; @import 'world/2025/modules/faq'; @import 'world/2025/modules/footer'; diff --git a/assets/world/2025/icons/clock.svg b/assets/world/2025/icons/clock.svg new file mode 100644 index 000000000..54b787165 --- /dev/null +++ b/assets/world/2025/icons/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/world/2025/agenda/day-0.html b/world/2025/agenda/day-0.html new file mode 100644 index 000000000..3a4239a67 --- /dev/null +++ b/world/2025/agenda/day-0.html @@ -0,0 +1,23 @@ +--- +layout: world/2025/default +permalink: /world/2025/agenda/day-0 +redirect_from: /world/agenda/day-0 +day: day-0 +title: Agenda +--- + +{% assign sessions = site.world_sessions | where_exp: "session", "session.path contains '2025/day-0'" %} + +
+
+ {% include world/2025/components/agenda_header.html %} + {% include world/2025/components/agenda_tabs.html %} + +
+ {% for session in sessions %} + {% assign session_speaker = nil %} + {% include world/2025/components/session_card.html session=session speaker=session_speaker %} + {% endfor %} +
+
+
diff --git a/world/2025/agenda/day-1.html b/world/2025/agenda/day-1.html new file mode 100644 index 000000000..48b01729b --- /dev/null +++ b/world/2025/agenda/day-1.html @@ -0,0 +1,31 @@ +--- +layout: world/2025/default +permalink: /world/2025/agenda/day-1 +redirect_from: /world/agenda/day-1 +day: day-1 +title: Agenda +--- + +{% assign sessions = site.world_sessions | where_exp: "session", "session.path contains '2025/day-1'" %} +{% assign sortedSessions = sessions | sort: "running_order" %} +{% assign speakers_2025 = site.world_speakers | where_exp: 'item', 'item.path contains "2025"'%} + +
+
+ {% include world/2025/components/agenda_header.html %} + {% include world/2025/components/agenda_tabs.html %} + +
+ {% for session in sortedSessions %} + {% assign session_speaker = nil %} + + {% unless session.speaker == false %} + {% assign speaker_filename = session.speaker | replace: '.md', '' %} + {% assign session_speaker = speakers_2025 | where_exp: "s", "s.path contains speaker_filename" | first %} + {% endunless %} + + {% include world/2025/components/session_card.html session=session speaker=session_speaker %} + {% endfor %} +
+
+
diff --git a/world/2025/agenda/day-2.html b/world/2025/agenda/day-2.html new file mode 100644 index 000000000..ec492282e --- /dev/null +++ b/world/2025/agenda/day-2.html @@ -0,0 +1,31 @@ +--- +layout: world/2025/default +permalink: /world/2025/agenda/day-2 +redirect_from: /world/agenda/day-2 +day: day-2 +title: Agenda +--- + +{% assign sessions = site.world_sessions | where_exp: "session", "session.path contains '2025/day-2'" %} +{% assign sortedSessions = sessions | sort: "running_order" %} +{% assign speakers_2025 = site.world_speakers | where_exp: 'item', 'item.path contains "2025"'%} + +
+
+ {% include world/2025/components/agenda_header.html %} + {% include world/2025/components/agenda_tabs.html dayTwoActive=true %} + +
+ {% for session in sortedSessions %} + {% assign session_speaker = nil %} + + {% unless session.speaker == false %} + {% assign speaker_filename = session.speaker | replace: '.md', '' %} + {% assign session_speaker = speakers_2025 | where_exp: "s", "s.path contains speaker_filename" | first %} + {% endunless %} + + {% include world/2025/components/session_card.html session=session speaker=session_speaker %} + {% endfor %} +
+
+
diff --git a/world/2025/speakers.html b/world/2025/speakers.html index 5fa32616d..f58a9270d 100644 --- a/world/2025/speakers.html +++ b/world/2025/speakers.html @@ -7,7 +7,10 @@ title: Speakers --- -{% assign sorted_speakers = site.world_speakers | where_exp: 'item', 'item.path contains "2025"' | sort: 'first_name' %} +{% assign sorted_speakers = site.world_speakers + | where_exp: 'item', 'item.path contains "2025"' + | where_exp: 'item', 'item.image_path' + | sort: 'first_name' %}