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
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
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
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
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
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. 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
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 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. 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 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 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. 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 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. 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. 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 but will be database agnostic. And it's coming by the end of the year. Second, 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, 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 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 in the Real World. He sells a course 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. 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, 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 which is in term an addon for for 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 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 - 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
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
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
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
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
There was a very beautiful glass house with all sorts of plants.
A glass house at the De Hortis
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
The next morning I made my way to Schiphol airport and then back to Zagreb.
Terminal B36 at Schiphol Airport
Subscribe to the newsletter to receive future posts via email