---
title: "Rails World"
url: https://stanko.io/rails-world-sPmrX4SDRCa5
author: Stanko Krtalic Rusendic
published: 2023-10-10
updated: 2026-02-15
tags: [ruby, travel]
---

# Rails World

It was Wednesday morning and I got up even earlier than I usually do because I
had to be on a plain to Amsterdam in a few hours. I haven't been to Amsterdam
since 2019 when I briefly meandered through it's streets on my way to EuRuKo in
Rotterdam. This time I was going there for Rails World which was special to me
since I've never been to Rails-specific conference before.

![Rails World banner](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/railsworld_banner.jpeg/1600w.jpg)

Two brief flights and a train ride and I was at Amsterdam Centraal train
station. It was a cloudy and windy day. I made my way to Beurs Van Berlage - a
beautiful, old, ornate, red brick building with a tall clock tower, right in the
heart of the city - to register for the conference.

![Beurs van Berlage](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/railsworld_beurs_van_berlage.jpeg/1600w.jpg)

Then I made my way to the Zoku hotel where I would be staying until Sunday. The
hotel looked modern from the Booking.com listing, but the pictures don't do it
justice. To check-in I had to take an elevator all the way up to the 6th floor,
which turned out to be a rooftop terrace with small ponds, a glassed-in walkway
to the lobby, and a garden on each side of the walkway. The view was amazing,
the clouds had cleared a bit, and the sun was just starting to set over the
city.

![The sunset over Amsterdam as seen from the rooftop lobby of the Zoku hotel](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/zoku_sunset.jpeg/1600w.jpg)

The room was very stylish. It had everything a regular apartment would have - a
stove top, a kitchen sink, a dishwasher, a dining table, a TV, a speaker, a
couch, an office desk, shelves full of books, a bed, plus a bathroom - but it
was arranged in a very compact way which made it fun to just explore the room.
For example, the bed is above the shelves and to get into it you have to pull
out a set of stairs out of the shelves to be able to climb up. The office desk
is in a cupboard under the bed. In fact everything under the bed is storage
space with various doors to it that act like closets. And there were a lot of
quirky design touches like the office desk chair being made of concrete, the
light switch in the bathroom being a plunger on a red string hanging from the
ceiling, or the athletic rings hanging from the living room ceiling.

![My room in the Zoku Hotel Amsterdam](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/zoku_room.jpeg/1600w.jpg)

The next morning, at 8:30 am, I made my way back to Beurs Van Berlage. There
weren't many people out an about, which was strange to me. In Zagreb, there
would be a flood of people in the streets at this time of day.

The venue was even more beautiful from the inside than from the outside. The red
brickwork from the outside continued on the inside. There were four rooms, each
of which was an atrium lit by sunlight coming through the colored glass ceiling
held up by iron beams. Each room was three stories tall, and three of them had
brick walkways on the first and second floor held up by arches and pillars.

![The ceiling of the Beurs van Berlage](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/beurs_van_berlage_ceiling.jpeg/1600w.jpg)

The opening keynote was about to start, so I made my way to the Track 1 room to
find a chair. The room had moody lighting and a stage as wide as the whole room.

Amanda Perino, the executive director of the Rails Foundation, walked up on
stage and give a captivating introduction. [She explained what the role of the
Rails Foundation is](https://rubyonrails.org/foundation). Then she showed
everywhere where people came from, the person that traveled the longest
distance, and the person that traveled the shortest distance. People from all
over the world came to Rails World. Finally she introduced the MCs, which in
term introduced DHH.

![The stage on Track 1 of Rails World](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/railsworld_stage.jpeg/1600w.jpg)

His keynote was a banger. It started off by introducing all the new features
coming to Rails - solid_cache, solid_queue, Strada, Kamal, Propshaft, and Turbo
8 - and then switched to the concept of the “Renaissance Developer”, an analog
to the Renaissance man or Polymath. A developer knowledgeable in many subjects -
the backend, the frontend, deployments, and mobile apps - that can act as a
one-person team. And Rails is exactly what enables such a developer. With money
being tight as of late, these are the people we need to make great software.

The idea of a Renaissance Developer deeply resonated with me. I always like to
broaden my knowledge, learn new thing, learn how things work, how people solved
some problems and what were their reasons behind making certain decisions, and
then dive deep into topics that interest me most. But I was always met with
advice like “*specialize in one thing, because that’s financially smarter*” or
“*don’t be a jack of all trades and a master of none*”. This never stopped me
from perusing knowledge, but it wore me down to hear that I was going in “*the
wrong direction*” every other day. Hearing DHH, and later people in the
hallways, talk about the return of the Renaissance Man - the Renaissance
Developer - was a breath of fresh air, inspiration, and motivation. I felt like
I wasn't the crazy one after all.

I went to the talk about Strada by Jay Ohms next. He gave an introduction into
using Strada to build iOS and Android apps. Explained how it interacts with
Turbo native and Rails/HTML, the design decisions behind it and trade-offs.
Like, it being designed to easily deploy new versions of the app without going
through AppStore reviews, and having backwards and forwards compatibility in
mind. It seems to be a really solid way to build mobile apps. It doesn’t yet
fully cover offline, but it seems that there is a plan how to expand into
offline territory with local storage and IndexedDB. All in all a great talk.

I learned how to hide UI elements using CSS and move them to native controls
instead. You can do this because Strada updates a data attribute on the HTML
element with a list of components it supports, so you can check if a component
is enabled or not using square brackets and =~ selectors. Basically you
implement a native method that adds a navbar button, for example, with which
elements it should have and what it should send back when a button is pressed,
from there you click the corresponding hidden UI element with JS and that’s it.
It’s simple and that’s what I love about it. Everything we know and use in the
web daily is translated over to mobile with a thin wrapper to control native UI
elements.

Next, I went to Jorge Manrubia’s talk about Making a difference with Turbo. His
talk was great. He explained all the new features in Turbo 8 with a focus on
Turbo Morph. Basically, they are building a calendar for Hey (if you watched
closely during DHH’s keynote you could notice a calendar button in the top
center of his Imbox) and rendering it with turbo streams would have been
difficult so they looked for simpler solutions and developed Turbo Morph in the
process.

Generally, the easiest thing to do is to refresh a page when something updates -
that's the old-school HTTP request-response way. But a full refresh is a jarring
experience - the page flickers, you lose your scroll position, opened menus
close again, CSS animations reset.

The next easiest solution are turbo frames, which allow you to update the page
in sections as you interact with that section. This is similar to a full page
refresh though without most of the jarring side effects, but you have to keep
track of when you want to break out of the frame and that each page you can
navigate to from the frame has a frame of the same name in it.

Finally, the hardest solution are turbo streams which are basically raw HTML
manipulation events from the server. You have to know in which context you are
sending them so you manipulate the HTML correctly. But they are the least
jarring and feel like a native app.

Now with [Turbo Morph](https://github.com/hotwired/turbo/pull/1019) you have the
same native look and feel as turbo streams with the ease of use of a full page
refresh. Morph basically does a full page refresh, takes the new HTML and morphs
the current HTML into the new one. This preserves CSS animations, scroll state,
open menus (with a flag), and doesn’t flicker the screen. All of this is done
using a library called [idiomorph](https://github.com/bigskysoftware/idiomorph).
They were inspired by Phoenix’s LiveView does the same thing just using a
different library.

I’m hyped for the release of Turbo 8. Morph will make my life so much easier. I
can basically delete most turbo stream responses at work and simplify the code a
lot.

Then came the lunch break. The food was amazing! The catering service deserves a
lot of praise. There were many different options and all of them were delicious.

After lunch, I went to Marco Roth’s talk about the future of Rails as a
full-stack framework powered by Hotwire. His talk was also great. He focused
more on the ecosystem around Hotwired, and how he came to Hotwired. He added a
lot of nice user-friendly errors to Stimulus, like when you have a typo on a
controller name or action it will tell you that instead of doing nothing. He
also made an LSP for stimulus which looks amazing. It can suggest you
completions specific to your app, like the exact controller, action, class,
value or target name. He is also starting a weekly newsletter about Hotwired.
And he started [hotwired.io](https://hotwire.io) to aggregate and share all the
cool thing in the ecosystem and community.

Then I went to Alivija Rojas’ talk about an offline experience with a Rails
powered PWA. It was a very insightful talk about how to build a progressive web
app with Rails, that caches certain pages locally and stores any form
submissions made with no Internet to be synced later when Internet service is
available. This can be done with a [service
worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers)
with which you cache the index and new pages. Then you add a Stimulus controller
on the form that checks if Internet service is available before submission and
if it isn’t then you store the form data in [Indexed
DB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API). On the
index page you check what you have in your local storage and render that. A neat
idea.

Next, I went to Xavier Noria’s talk about Zeitwerk’s internals. I liked his
presentation style a lot and enjoyed the talk. I did read through
[Zeitwerk](https://github.com/fxn/zeitwerk) some time ago so it was nice to hear
the explanation of each concept in the codebase and how some tricky situations
are resolved when loading in classes and modules.

For the last regular talk of the day I went to Breno Gazzola’s talk about
[Propshaft](https://github.com/rails/propshaft). The goal of propshaft is to
simplify asset serving a lot. It intentionally doesn't to anything besides
generating digests and serving pre-processed files. This is in response to
Sprockets, which do everything from integrating with Gulp to compiling
coffeescript.

Finally, the closing keynote by Eileen Uchitelle. It was the same keynote she
gave at [RailsConf this year](https://m.youtube.com/watch?v=TKulocPqV38). A very
inspiring talk, that motivated me to contribute to the framework more when I
could. This talk also reminded me that I had an open PR to Rails that I forgot
about.

That was a wrap for day one so I walked back to my hotel room. Now there was a
sea of people in the streets, seems like Amsterdam comes alive in the afternoon.

There are a few things I’ve heard that I didn’t go to a talk to or that didn’t
have a talk about them. First, solid_queue is essentially, or at least is
inspired by, [good_job](https://github.com/bensheldon/good_job) but will be
database agnostic. And it's coming by the end of the year. Second,
[solid_cache](https://github.com/rails/solid_cache) is a database backed cache.
The speed of retrieving data is worse than e.g. caching in Redis, but we are
talking about 1.2ms instead of 0.8ms, nobody is going to notice that difference.
The benefit of using the database as a cache is that your cache can live for
much longer because SSDs are larger and cheaper for storage than RAM. Having
longer lived caches means that you have to compute results less often which can
dramatically decrease response times.

The next day came around and I made my way back to the conference for an AMA
with the Rails Core Team (10 out of 12 members were present). The AMA was lead
by the creator of [OhMyZSH](https://ohmyz.sh/), Robby Russle. It was both
inspiring and funny. Inspiring because the core team had nothing but words of
encouragement towards the public, they want to help people contribute to Rails
and know that some things can be daunring to beguinners which they could and are
improving. And funny because of the answers, haggling with the host - especially
between Aaron Patterson and Robby - and the bloopers. There was a wonderful
moment when Robby asked all the contributors to rails to stand up, and about 10%
of the audience stood up. Then he asked that anybody that has ever commented on
a PR or similar to stand up, and another 20% of the audience stood up. Around
30% of the audience contributed to Rails in some way, which is a lot.

Next were two talks that were both very interesting and which I wanted to attend
but they were happening at the same time - that was kind of the theme of the
second day.

I went to the Rails and Ruby Garbage Collector talk by Peter Zhu first. I met
the guy at EuRuKo last year and he seemed excited about this topic then so I
figured this would be a great talk, and it was. He started off by introducing
how GC works in Ruby. I wasn’t there for the rest of the talk but I heard that
he created [a gem called autotuner](https://github.com/Shopify/autotuner) to
help you tune your Rails app’s GC.

Midway through Peter Zhu’s talk I switched to the Powerful Rails features you
might not know talk by Chris Oliver. This was a fun talk to listen to, Chris is
an excellent presenter and speaker. He showed many interesting tips and tricks
that you can use in Rails. So many that they’d warrant a post of their own to
cover.

I can’t wait for the videos to come so that I can watch both talks in full.

I didn’t go to any of the next two talks that were next because I met a few
people I knew from other conferences and some that I met yesterday so we chatted
for a bit. This was also perfect timing since lunch was up next and we could get
a head start on the food before queues form.

After lunch, I went to Ryan Singer’s talk about Applying [Shape
Up](https://basecamp.com/shapeup) in the Real World. [He sells a
course](https://www.feltpresence.com/srl/) that seems to be a much more through
version of this talk. Shape Up formalized most intuitions I already had about
project management and taught me very helpful tools and processes for project
management and development that are so simple and obvious that they are just
beautiful, so I was looking forward to this talk. The talk was amazing, in my
opinion it could be a keynote.

He started off with introducing all the problems of modern project management
and development and drew analogs from that.

Like, “*working on tickets is like putting your project plan through a paper
shredder*”. I can’t state enough how strongly I agree with this analogy. I’m
amazed that people don’t notice that most problems during a project occur
because nobody sees the big picture and decisions are made basically in the
dark.

Next he had an analogy about cooperation which deeply resonated with me.
“*Imagine renovating a room and spending moths laying out the new interior and
particularly picking a lamp that will hang from the wall above the couch. Only
to show the plan to the electrician and for him to tell you that there is no
wire in that wall and that he’ll have to rip up the wall if you want to put the
lamp there*”. I’ve been so many times in a spot where somebody just threw
something extremely hard to implement over the wall for me to solve. This was
always made worse by working on tickets since often times I didn't notice a
problem until I was in the middle of the project. Just asking the team how hard
something is to implement is a huge improvement in cooperation between project
management and development.

There were so many nuggets of wisdom in this talk, it’s well worth the watch
when the video comes out.

Next, I went to Adam Wathan’s talk about [Tailwind](https://tailwindcss.com). It
was an introduction to Tailwind with some tips and tricks along the side, all
explained and shown through live coding examples. Respect for pulling that off,
it was an excellent talk.

Then I went to Irina Nazarova’s talk about making profit on OSS. This was a very
interesting talk about which strategies you have if you want to make money on
OSS and how you can bootstrap yourself. Among many other things, I learned that
you can ask for sponsorship when a company asks for a feature on your project.

For the last regular talk on Friday I went to Don’t call it a Comeback by Jason
Charnes. It was a very inspiring talk about the comeback of Rails with a
reminder that we have to work to keep it that way and not take it for granted.
We have to help people learn Rails, make the guides better, improve
documentation, make videos, record podcasts and more to keep it relevant.

The closing keynote was Future of Developer Acceleration with Rails by Aaron
Patterson. The talk started out with a lot of jokes poking fun at the opening
keynote.

Then he turned to his aggravated onion, a personification of layers of things
he’s mad about. It was fun to hear him rant for a bit. He mostly focused on how
rewriting things to other languages is way more complicated than improving the
algorithm something uses and it doesn’t actually solve the fundamental issue - a
slow sort is slow in Rust and in Ruby. That people think that interop between
Rust and Ruby is safe when in fact it comes with new problems, like memory
leaks. And concluded that we all should just enable YJIT since it gives a great
performance boost for no extra cost.

After that he turned to profiling. With profiling you can figure out which parts
of your app are slow and should be optimized. He went over how a sampling
profiler works and how to read a flame-graph and a call tree. Then he introduced
[Vernier](https://github.com/jhawthorn/vernier), a sampling profile made by John
Hawthorn and himself. Vernier is easy to integrate into Rails and comes with a
nice UI to help you figure out what’s going on in your app.

Finally, he turned to language servers. He created a language server for Rails
that shows you model attributes, routes and other useful information right in
your editor. This is now part of
[ruby-lsp-rails](https://github.com/Shopify/ruby-lsp-rails) which is in term an
addon for for [ruby-lsp](https://github.com/Shopify/ruby-lsp). His goal is for
Rails to have one standard, built-in, LSP so that developers have the best
experience possible out-of-the-box.

Except for the aggravated onion, these are things that he covered on his [live
streams](https://www.youtube.com/@TenderlovesCoolStuff/streams) in the past few
months.

And that was it. Just the 20th anniversary celebration was left. The lights in
the rooms were dimmed, and there were celebratory cupcakes given out. I was so
tired that I decided to go to the hotel room after 15min, but I heard that the
party was a blast.

I met a lot of new people, and a few old friends.

I got to chat with Chris Oliver who’s podcast -
[RemoteRuby](https://remoteruby.com) - is my go to Ruby podcast. It’s a blast to
listen to him, Jason and Andrew. I even got a hand crafted, artisan, limited
edition podcast sticker.

![Remote Ruby podcast sticker](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/remoteruby_sticker.jpeg/1600w.jpg)

I also met DHH and Rafael Franca. Though the only thing I mustered to say to
them was “*Thank you both, Rails really changed my life*”. I wanted to ask and
say so much more but I was too tired to think at that point. And decided to stop
there and go rest.

Meeting these people really humanized them. Until then they almost seemed super
human, but talking to them, meeting them in person, and just seeing them in the
crowd really showed me that they are just regular people which is inspiring to
me.

I think Rails World was a huge success. The talks were so amazing that it was
hard to pick which one to go to. Everything was well organized. The people were
extremely nice. The volunteers/employees were super helpful. It wasn’t
exorbitantly expensive (except for the hotels, but that's not their fault) and
the location was great. Overall, just amazing. Amanda Perino did an outstanding
job. I’m glad that I could attend it, and be there for Rails’ 20th anniversary -
20 years and still going strong!

![Rails' 20th anniversary pin](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/rails_20th_anniversary_pin.jpeg/1600w.jpg)

The next morning was a busy day. It was my last day before going back so I
wanted to tour the city and enjoy the museums. The Rijksmuseum is my favorite
museum, I’ve been to it three times already, but I wasn’t visiting it this time.
This time I bought tickets for the Van Gogh museum since I’ve never been there
before.

The museum was huge. There are three floors full of his and his contemporaries'
works. The first floor goes over his early life and how he got into painting. He
used to be an art dealer, and at the age of 27 decided to become a painter.

The second floor covers his life as a painter, his struggles, and how he
searched for his style. I learned that he was influenced by Japanese art, which
he and his brother collected and admired. He traveled around but found happiness
in the countryside and the simple life of peasants. On this floor are the
sunflowers, one of his most famous works.

![My girlfriend in front of the sunflowers by Van Gogh](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/karla_with_the_sunflowers.jpeg/1600w.jpg)

On the last floor are the works immediately before his death, and the work of
authors that he inspired. His painting career was relatively short lived with
him committing suicide 10 years after becoming a painter. On this floor there
were a number of his most famous paintings like the almond tree blossoms and the
wheat fields.

I was surprised to see that most paintings were covered by glass. This really
sucks because Vincent put on very heavy brush strokes which gave his pictures a
texture, but through the glass this is barely noticeable due to the glare. I
mean, it makes sense to protect these paintings when people throw tomato soup on
priceless works of art, but it still sucks.

Something that I never noticed in prints of his work is how good he was at
capturing depth. His paintings draw you in, there is a 3D effect going on that
just isn’t visible in a photograph of the same painting. And the colors on the
paintings seem much more vivid in person.

There was a crossover exhibition going on too. Since Vincent was inspired by
Japanese art, the Pokemon illustrators made a few Pokemon cards and paintings in
his style. Needless to say, the gift shop was raided for anything and all
Pokemon.

![Pikachu with a hat, drawn in the style of Van Gogh](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/van_gogh_pikatchu.jpg/1600w.jpg)

Next up was the the De Hortis, Amsterdam’s botanical garden. It’s one of the
best botanical gardens I’ve been to. The garden has 7 glass houses, an outdoor
park, and bee hives. There is a tropical, sub-tropical, and desert glass house.
The desert plans look like they came from an alien planet. While the tropical
glass house had gigantic plants and was full of small brown singing frogs.

![Gian lily pads from the tropical glass house at the De Hortis](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/giant_liliypads.jpeg/1600w.jpg)

There was a very beautiful glass house with all sorts of plants.

![A glass house at the De Hortis](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/glass_house.jpeg/1600w.jpg)

And a glass house that served as a nursery for butterflies with dozens of them
flying about pollinating plants.

By now it was already late in the afternoon so I went back to the hotel to pack
up.

![Walkway from the elevator to the lobby of the Zoku hotel](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/zoku_walkway.jpeg/1600w.jpg)

The next morning I made my way to Schiphol airport and then back to Zagreb.

![Terminal B36 at Schiphol Airport](https://media.stanko.io/variants/articles/rails-world-sPmrX4SDRCa5/shiphol_terminal_b36.jpeg/1600w.jpg)
