<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Hanakai</title>
  <subtitle>Let your Ruby bloom. Hanakai is a family of Ruby tools that help you write clearer, more maintainable apps.</subtitle>
  <link href="https://hanakai.org/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://hanakai.org/" rel="alternate" type="text/html"/>
  <id>https://hanakai.org/feed.xml</id>
  <updated>2025-12-22T12:30:00+00:00</updated>
  <entry>
    <title>State of Hanami, December 2025</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/12/22/state-of-hanami-december-2025"/>
    <id>https://hanakai.org/blog/2025/12/22/state-of-hanami-december-2025</id>
    <published>2025-12-22T12:30:00+00:00</published>
    <updated>2025-12-22T12:30:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;I’m very pleased to share our &lt;strong&gt;State of Hanami&lt;/strong&gt; update for 2025! We’re back for our second time. If you want to get caught up, &lt;a href="https://hanakai.org/blog/2024/12/10/state-of-hanami-december-2024/"&gt;check out our update from last year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This has been a pivotal year for Hanami, our first steps into a new era: we made a substantial new release, began unifying our ecosystem, expanded our team, launched our sponsorship program, and saw a real uptick in community activity.&lt;/p&gt;
&lt;p&gt;I’ll go into all these highlights below, before leaving you with some plans for 2026.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#our-biggest-release-yet" aria-hidden="true" class="anchor" id="our-biggest-release-yet"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Our biggest release yet&lt;/h2&gt;
&lt;p&gt;In November we &lt;a href="https://hanakai.org/blog/2025/11/12/hanami-23-racked-and-ready/"&gt;released Hanami 2.3&lt;/a&gt;. This was our first major release in a year, and it turned out to be our biggest release yet, with 32 different contributors choosing to make Hanami better. Hanami 2.3 introduced Rack 3 support, resource routing, improved media type handling, along with a wide range of DX improvements. We’d love for you to give it a try!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#our-ecosystem-came-together" aria-hidden="true" class="anchor" id="our-ecosystem-came-together"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Our ecosystem came together&lt;/h2&gt;
&lt;p&gt;Our maintainers this year have been taking care of &lt;a href="https://dry-rb.org"&gt;Dry&lt;/a&gt; and &lt;a href="https://rom-rb.org"&gt;Rom&lt;/a&gt; in addition to Hanami. We’ve been working towards bringing these projects together under a single banner. As part of this, we’ve chosen a new overall project name, and have been developing a new website and unified branding. Together, these will reintroduce us to the Ruby world and give our users an easier time learning our tools. We plan to launch these in February, but in the meantime, you can check out the &lt;a href="https://github.com/hanakai-rb/site"&gt;source code&lt;/a&gt; and the &lt;a href="https://hanakai.org"&gt;in-progress&lt;/a&gt; live site (our guides are already &lt;a href="https://hanakai.org/learn/hanami/v2.3/getting-started"&gt;looking particularly fine&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#our-team-grew-again" aria-hidden="true" class="anchor" id="our-team-grew-again"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Our team grew again&lt;/h2&gt;
&lt;p&gt;This year we welcomed nine new people to our maintainers team:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaronmallen"&gt;Aaron Allen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/afomera"&gt;Andrea Fomera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dcr8898"&gt;Damian C. Rossney&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/josephinehall"&gt;Josephine Hall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/krzykamil"&gt;Krzysztof Piotrowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/makenosound"&gt;Max Wheeler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/katafrakt"&gt;Paweł Świątkowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/radar"&gt;Ryan Bigg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/svoop"&gt;Sven Schwyn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These joined our existing team members, who have continued to work over the last year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaronmoodie"&gt;Aaron Moodie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alassek"&gt;Adam Lassek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kyleplump"&gt;Kyle Plump&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/waiting-for-dev"&gt;Marc Busqué&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flash-gordon"&gt;Nikita Shilnikov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parndt"&gt;Philip Arndt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cllns"&gt;Sean Collins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/timriley"&gt;Tim Riley&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all these beautiful people for giving their time to Hanami and for improving our part of the Ruby world!&lt;/p&gt;
&lt;p&gt;All up, our maintainers team is now 17 strong. This feels like a good foundation for us to step up and do even better work next year. If you’d like to get involved, we recommend helping to triage issues and evaluate pull requests.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#our-community-shone-through" aria-hidden="true" class="anchor" id="our-community-shone-through"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Our community shone through&lt;/h2&gt;
&lt;p&gt;Our community took things to a new level this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We launched &lt;a href="https://discord.gg/KFCxDmk3JQ"&gt;our Discord&lt;/a&gt; and saw it bring more community activity than ever before.&lt;/li&gt;
&lt;li&gt;We saw the launch of several new open source Hanami apps, including Princeton University Library’s &lt;a href="https://github.com/pulibrary/orcid_princeton_hanami"&gt;orcid_princeton_hanami&lt;/a&gt;, which is also running in production! Huge props to &lt;a href="https://github.com/carolyncole"&gt;Carolyn Cole&lt;/a&gt; for driving that project and &lt;a href="https://discourse.hanamirb.org/t/converting-a-rails-app-feature-parity/1287"&gt;sharing her thoughts&lt;/a&gt; on the process. We also saw the release of Pat Allan’s &lt;a href="https://codeberg.org/patallan/playsmith"&gt;Playsmith&lt;/a&gt;, Ryan Bigg’s &lt;a href="https://github.com/radar/twist-v3"&gt;Twist v3&lt;/a&gt;, and our very own &lt;a href="https://github.com/hanakai-rb/site"&gt;upcoming website&lt;/a&gt;. Meanwhile, Paweł continues to keep &lt;a href="https://github.com/katafrakt/palaver"&gt;Palaver&lt;/a&gt; up to date as one of the most complete example apps out there.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/inouire"&gt;Edouard&lt;/a&gt; launched the new (commercial) &lt;a href="https://catalogue-studio.com/"&gt;Catalogue Studio&lt;/a&gt;, after leaving us a brilliant trail of “&lt;a href="https://discourse.hanamirb.org/t/hanami-1-3-hanami-2-2-tips-notes-about-my-journey/1210"&gt;Tips and notes about &lt;span data-escaped-char&gt;[&lt;/span&gt;his&lt;span data-escaped-char&gt;]&lt;/span&gt; journey&lt;/a&gt;” from Hanami 1.3 to 2.2.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/afomera"&gt;Andrea Fomera&lt;/a&gt; arrived on the scene with a &lt;em&gt;meteorological&lt;/em&gt; level of energy. She contributed some key pieces to Hanami 2.3, and also created &lt;a href="https://github.com/afomera/hanami-omakase"&gt;hanami-omakase&lt;/a&gt; as a proving ground for Rails-alike features.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/radar"&gt;Ryan Bigg&lt;/a&gt; pointed his big blogging brain our way and penned his “&lt;a href="https://ryanbigg.com/2025/10/hanami-for-rails-developers-1-models"&gt;Hanami for Rails developers&lt;/a&gt;” series. With Ryan now on the team, we’re looking forward to creating our very own “for Rails devs” guides in the future!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/andrew"&gt;Andrew Nesbitt&lt;/a&gt; shipped &lt;a href="https://github.com/andrew/hanami-sprockets"&gt;hanami-sprockets&lt;/a&gt;, an alternative asset bundler and proving ground for the pluggable bundlers we’d like to ship next year.&lt;/li&gt;
&lt;li&gt;Andrew also helped us get our new &lt;a href="https://github.com/hanakai-rb/awesome-hanakai"&gt;awesome-hanakai&lt;/a&gt; repo off the ground. There’s still a bit of tidying to do, but it exists, and that’s the important thing. If you have something awesome, now you know where to put it!&lt;/li&gt;
&lt;li&gt;Did I mention our Hanami 2.3 release saw input from 32 different contributors? This is amazing! Thanks in particular to &lt;a href="https://github.com/wout"&gt;Wout&lt;/a&gt; and &lt;a href="https://github.com/wuarmin"&gt;Armin&lt;/a&gt; for multiple helpful contributions across the year.&lt;/li&gt;
&lt;li&gt;Starting in August, I’ve also been sharing &lt;a href="https://timriley.info/tag/continuations"&gt;my weeknotes&lt;/a&gt; covering Hanami development. I hope you find them helpful!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our community is the most important thing to us. To reflect this, this year we made our community values clearer than ever, and placed them &lt;a href="https://hanamirb.org"&gt;front and centre on our website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We want the Hanami community to be a welcoming place for people who bring kindness, curiosity, and care. A place where people of all backgrounds and experience levels can feel respected, and can share and grow. A place for people to be proud of, and feel safe within.&lt;/p&gt;
&lt;p&gt;We do not tolerate nazis, transphobes, racists, or any kind of bigotry. See our &lt;a href="https://hanakai.org/conduct"&gt;code of conduct&lt;/a&gt; for more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We also &lt;a href="https://hanakai.org/blog/2025/09/02/hanami-adopts-contributor-covenant-3-0/"&gt;adopted the Contributor Covenant 3.0&lt;/a&gt;, which brings a more approachable text for our worldwide community, and places a helpful emphasis on restorative justice.&lt;/p&gt;
&lt;p&gt;I believe our values have played a big part in the health and growth of our community this year. Thank you to everyone for building a space we can all enjoy!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#we-went-out-into-the-world" aria-hidden="true" class="anchor" id="we-went-out-into-the-world"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;We went out into the world&lt;/h2&gt;
&lt;p&gt;Once again, we took ourselves to some conferences!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tim visited beautiful Riga, Latvia for &lt;a href="https://balticruby.org/archive/2025"&gt;Baltic Ruby&lt;/a&gt;, where he presented a new Murakami-themed introduction to Hanami, and thoughts on the importance of a diverse Ruby ecosystem. He also ran a hack session, where &lt;a href="https://github.com/ismasan"&gt;Ismael Celis&lt;/a&gt; used his &lt;a href="https://github.com/ismasan/sourced"&gt;sourced&lt;/a&gt; toolkit to create the &lt;a href="https://bsky.app/profile/ismaelcelis.com/post/3lrj5ltfvlc2a"&gt;world’s first event-sourced calculator built on Hanami&lt;/a&gt;, and &lt;a href="https://github.com/krzykamil"&gt;Krzysztof&lt;/a&gt; worked on the &lt;code&gt;db rollback&lt;/code&gt; command for Hanami 2.3. Thank you to Baltic Ruby for the invitation!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cllns"&gt;Sean&lt;/a&gt; attended &lt;a href="https://rockymtnruby.dev"&gt;Rocky Mountain Ruby&lt;/a&gt; in Boulder, Colorado, and spoke on &lt;a href="https://www.rubyevents.org/talks/slicing-and-dicing-through-complexity-with-hanami?back_to=%2Fevents%2Frocky-mountain-ruby-2025%2Ftalks%3Fscroll_top%3D1872&amp;amp;back_to_title=Rocky+Mountain+Ruby+2025"&gt;Slicing and Dicing through Complexity with Hanami&lt;/a&gt;. He also got to spend some quality time with some #HanamiFriends new and old!&lt;/li&gt;
&lt;li&gt;Tim was lucky enough to reprise his talk at both &lt;a href="https://www.xoruby.com/event/san-diego/"&gt;XO Ruby San Diego&lt;/a&gt; and &lt;a href="https://thoughtbot.com/blog/announcing-the-thoughtbot-open-summit-2025-full-schedule"&gt;thoughtbot Open Summit&lt;/a&gt;. Thanks to XO organiser &lt;a href="https://ruby.social/@jremsikjr"&gt;Jim Remsik&lt;/a&gt;, the San Diego talk was streamed to the internet, and the Open Summit was a native online event. We saw a good-sized group come together for each one, and I’m really glad I could share Hanami in such an open way. Thank you to Jim and thoughtbot for making these happen!&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="display: flex; gap: 1rem;"&gt;
&lt;img src="/blog/assets/2025-12-22-state-of-hanami-december-2025/sean-at-rocky-mountain-ruby.webp" alt="Sean on stage at Rocky Mountain Ruby" style="flex: 1; max-width: calc(50% - 0.5rem);" width="1280" height="961"&gt;
&lt;img src="/blog/assets/2025-12-22-state-of-hanami-december-2025/tim-at-baltic-ruby.webp" alt="Matz joins the Hanami table at Baltic Ruby" style="flex: 1; max-width: calc(50% - 0.5rem);" width="1280" height="960"&gt;
&lt;/div&gt;
&lt;h2&gt;
&lt;a href="#we-launched-our-sponsorship-program" aria-hidden="true" class="anchor" id="we-launched-our-sponsorship-program"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;We launched our sponsorship program&lt;/h2&gt;
&lt;p&gt;This year we launched our first ever &lt;a href="https://hanakai.org/sponsor"&gt;sponsorship program&lt;/a&gt; for Hanami, Dry and Rom. These are big and ambitious projects, and they need consistent attention for them to grow. Thanks to the support of the Ruby community, we made this happen! Since February this year, I’ve been able to commit a full business day every week towards the stewardship of our projects.&lt;/p&gt;
&lt;p&gt;This could not have happened without our founding patrons. Thank you to &lt;a href="https://sidekiq.org/"&gt;&lt;strong&gt;Sidekiq&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/baweaver"&gt;&lt;strong&gt;Brandon Weaver&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.honeybadger.io/?utm_source=hanami&amp;amp;utm_medium=paid-referral&amp;amp;utm_campaign=founding-patron"&gt;&lt;strong&gt;Honeybadger&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.fastruby.io/"&gt;&lt;strong&gt;FastRuby&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://www.appsignal.com/"&gt;&lt;strong&gt;AppSignal&lt;/strong&gt;&lt;/a&gt; for your support! Your courage and belief is what got this thing off the ground in the first place.&lt;/p&gt;
&lt;p&gt;Thank you also to all the individuals who are supporting us &lt;a href="https://github.com/sponsors/hanami"&gt;through GitHub sponsors&lt;/a&gt;. There are 20 of you right now! There’s real power in numbers, and your support takes us further than we could go alone.&lt;/p&gt;
&lt;p&gt;We’ll run another sponsorship drive toward the middle of next year, but we are ready to accept your support at any time! &lt;a href="https://hanakai.org/sponsor"&gt;See our sponsorship site&lt;/a&gt; to learn more. A few more businesses, or growing from 20 to 40 individual supporters, would make a huge difference to our project. And as you can see from everything in this post, your support goes a long way.&lt;/p&gt;
&lt;p&gt;We have also ceased our relationship with Ruby Central as a fiscal host, following their removal of the Bundler and RubyGems.org maintainer teams from those projects, and their conduct thereafter. We stand with every maintainer.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#looking-forward-to-next-year" aria-hidden="true" class="anchor" id="looking-forward-to-next-year"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Looking forward to next year&lt;/h2&gt;
&lt;p&gt;Just like &lt;a href="https://hanakai.org/blog/2024/12/10/state-of-hanami-december-2024/"&gt;last year&lt;/a&gt;, we have some goals we want to pursue across 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Establish a twice-a-year release cycle for Hanami.&lt;/strong&gt; Right now we’re aiming for May and November.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finish unifying our ecosystem.&lt;/strong&gt; We’ll launch our new site, finish rolling out our repo sync and release automation, then look at merging our forums.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare the future for Dry and Rom.&lt;/strong&gt; We want to reinvigorate these gems and make things easier for new contributors. This means triaging issues, bringing on focused maintainers, and developing roadmaps for the next phase of these projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter a successful second year of funded maintenance.&lt;/strong&gt; Year one proved we could do this. Year two will show us whether we can sustain it. We’re looking forward to your support!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ll share more on each of these as we work through the year.&lt;/p&gt;
&lt;p&gt;In the meantime, that’s it from us for 2025. Thank you to everyone who contributed to a wonderful year of improvements. We’re looking forward to continuing the work!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Hanami 2.3: Racked and Ready</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/11/12/hanami-23-racked-and-ready"/>
    <id>https://hanakai.org/blog/2025/11/12/hanami-23-racked-and-ready</id>
    <published>2025-11-12T13:00:00+00:00</published>
    <updated>2025-11-12T13:00:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;Today we are excited to announce Hanami 2.3! With this release, we unlock Rack 3, introduce resource routes, and deliver dozens of quality-of-life improvements that make building with Hanami smoother than ever.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#built-for-rack-3" aria-hidden="true" class="anchor" id="built-for-rack-3"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Built for Rack 3&lt;/h2&gt;
&lt;p&gt;We are excited to bring Rack 3 support to Hanami! We now support both versions 2 and 3, so you can use whichever version of Rack suits your situation. We encourage you to upgrade Rack when you can, and we’re happy that Hanami can help you on this path.&lt;/p&gt;
&lt;p&gt;When you upgrade to Rack 3, check out the &lt;a href="https://github.com/rack/rack/blob/main/UPGRADE-GUIDE.md"&gt;Rack 3 upgrade guide&lt;/a&gt;. Hanami already handles the essential changes for you, but you may need to update your app code if you’re working with Rack request/response details.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#streamlined-from-route-to-response" aria-hidden="true" class="anchor" id="streamlined-from-route-to-response"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Streamlined from route to response&lt;/h2&gt;
&lt;p&gt;More than just Rack, we’ve refined all aspects of our routing and request handling layer. The biggest change is the return of resource-based routing.&lt;/p&gt;
&lt;p&gt;To set up RESTful routes, you’d previously add the following lines:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;&lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; Previously...
&lt;/span&gt;get &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.index&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;as&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;books&lt;/span&gt;
get &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books/:id&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.show&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;as&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;book&lt;/span&gt;
get &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books/new&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.new&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;as&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;new_book&lt;/span&gt;
post &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.create&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
get &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books/:id/edit&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.edit&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;as&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;edit_book&lt;/span&gt;
patch &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books/:id&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.update&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
delete &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;/books/:id&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;to&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;books.destroy&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, all you need is one:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;&lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; Now! 🥰
&lt;/span&gt;resources &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;books&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Resource routing is integrated with every aspect of routing. Resources can be customized, nested, and combined with scopes and ordinary routes. &lt;a href="https://guides.hanamirb.org/v2.3/routing/overview/#resource-routes"&gt;Learn more here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The improvements don’t stop there! With this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route scopes can be given custom name prefixes.&lt;/li&gt;
&lt;li&gt;Routes can be named with a prefix that precedes scope prefixes.&lt;/li&gt;
&lt;li&gt;Router runtime performance is considerably improved for large numbers of routes.&lt;/li&gt;
&lt;li&gt;Multipart form and JSON request bodies are parsed by default.&lt;/li&gt;
&lt;li&gt;Action format and media type config is &lt;a href="https://guides.hanamirb.org/v2.3/actions/formats-and-media-types/"&gt;clearer and more flexible&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can access your subdomains via &lt;code&gt;Request#subdomains&lt;/code&gt;, and &lt;a href="https://guides.hanamirb.org/v2.3/actions/request-and-response/#request"&gt;configure your TLD length&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When you add &lt;code&gt;'nonce'&lt;/code&gt; to your content security policy, nonces are automatically added to script and stylesheet tags.&lt;/li&gt;
&lt;li&gt;CSRF tokens are loaded from the &lt;code&gt;X-CSRF-Token&lt;/code&gt; header in addition to request params.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;a href="#dx-in-the-details" aria-hidden="true" class="anchor" id="dx-in-the-details"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;DX in the details&lt;/h2&gt;
&lt;p&gt;We’ve also improved many more of your day-to-day interactions with Hanami:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hanami new&lt;/code&gt; now initializes a Git repository for new apps. You can also provide &lt;code&gt;--skip-view&lt;/code&gt; to skip the view layer, as well as &lt;code&gt;--gem-source&lt;/code&gt;, so you can use &lt;a href="https://gem.coop"&gt;gem.coop&lt;/a&gt; from the get-go.&lt;/li&gt;
&lt;li&gt;New apps get a helpful &lt;code&gt;bin/setup&lt;/code&gt; script, as well as an improved README with a handy list of first steps.&lt;/li&gt;
&lt;li&gt;New apps also receive a &lt;code&gt;bin/hanami&lt;/code&gt; binstub, so you can invoke &lt;code&gt;bin/hanami&lt;/code&gt; without requiring a &lt;code&gt;bundle exec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;hanami db rollback&lt;/code&gt; to easily rollback a database migration.&lt;/li&gt;
&lt;li&gt;Add your own methods to &lt;code&gt;hanami console&lt;/code&gt; via your own modules: add &lt;code&gt;config.console.include MyModule&lt;/code&gt; in your app class.&lt;/li&gt;
&lt;li&gt;Prefer Pry to IRB? Make it the default with &lt;code&gt;config.console.engine = :pry&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The console now prints a one-time warning when you access the &lt;code&gt;keys&lt;/code&gt; for an un-booted app or slice. You can also chose to boot your app preemptively with &lt;code&gt;hanami console --boot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The default &lt;code&gt;Rakefile&lt;/code&gt; will automatically load custom tasks from &lt;code&gt;lib/tasks/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://guides.hanamirb.org/v2.3/views/context/"&gt;View context&lt;/a&gt; classes are generated by default, so you can more easily see where to put custom view logic.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;hanami generate&lt;/code&gt; command within a slice directory and the generated file will target that slice automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ve made dozens more small improvements and fixes. Check out &lt;a href="https://github.com/hanami/hanami/blob/main/CHANGELOG.md"&gt;the changelogs&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#try-hanami-23" aria-hidden="true" class="anchor" id="try-hanami-23"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Try Hanami 2.3&lt;/h2&gt;
&lt;p&gt;There’s never been a better time to try Hanami. For this release we’ve made our &lt;a href="https://guides.hanamirb.org/v2.3/introduction/getting-started/"&gt;getting started guide&lt;/a&gt; more concise and easier to follow. Now you can get up and running faster than ever!&lt;/p&gt;
&lt;p&gt;Why don’t you give it a try? Your first Hanami app is just a few commands away:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="text plain"&gt;$ gem install hanami
$ hanami new my_app
$ cd my_app
$ bin/hanami dev
$ open http://localhost:2300
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;We’d love to hear how you go! Come join our &lt;a href="https://discord.gg/KFCxDmk3JQ"&gt;Discord&lt;/a&gt; or &lt;a href="https://discourse.hanamirb.org"&gt;forum&lt;/a&gt; and share your experience with our lovely community.&lt;/p&gt;
&lt;p&gt;And if you’re a certified legend already rocking a Hanami app, make sure to check out the &lt;a href="https://guides.hanamirb.org/v2.3/upgrade-notes/v2.3/"&gt;upgrade notes&lt;/a&gt; for 2.3.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-contributors" aria-hidden="true" class="anchor" id="thank-you-to-our-contributors"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our contributors!&lt;/h2&gt;
&lt;p&gt;Hanami 2.3 is a significant release: it comes courtesy of our &lt;strong&gt;biggest contributors group yet.&lt;/strong&gt; Thank you to all these wonderful humans!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaronmallen"&gt;Aaron Allen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alassek"&gt;Adam Lassek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rickenharp"&gt;Alexander Gräfe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AlexanderZagaynov"&gt;Alexander Zagaynov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/afomera"&gt;Andrea Fomera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/baweaver"&gt;Brandon Weaver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dcr8898"&gt;Damian C. Rossney&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/davidcelis"&gt;David Celis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hanarimawi"&gt;Hana Rimawi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/inouire"&gt;inouire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jaredcwhite"&gt;Jared White&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/josephinehall"&gt;Jojo Hall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/krzykamil"&gt;Krzysztof Piotrowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kyleplump"&gt;Kyle Plump&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mathewdbutton"&gt;Mathew Button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maxemitchell"&gt;Max Mitchell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/minaslater"&gt;Mina Slater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/katafrakt"&gt;Paweł Świątkowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/p8"&gt;Petrik de Heus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parndt"&gt;Philip Arndt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/robyurkowski"&gt;Rob Yurkowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/radar"&gt;Ryan Bigg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cllns"&gt;Sean Collins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/masterT"&gt;Simon Thiboutôt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stephannv"&gt;stephannv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/svoop"&gt;Sven Schwyn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/seven1m"&gt;Tim Morgan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/timriley"&gt;Tim Riley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WToa"&gt;William Tio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wout"&gt;Wout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wuarmin"&gt;wuarmin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/y-yagi"&gt;y-yagi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s always room for more. Our community is &lt;a href="/community"&gt;inclusive and welcoming&lt;/a&gt;, and we’d love to have you join us.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-patrons" aria-hidden="true" class="anchor" id="thank-you-to-our-patrons"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our patrons! &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;
&lt;/h2&gt;
&lt;p&gt;This is also our first major release since launching our &lt;a href="/sponsor"&gt;sponsorship program&lt;/a&gt;. I’d like to extend my deepest thanks to our founding patrons: &lt;a href="https://sidekiq.org"&gt;&lt;strong&gt;Sidekiq&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/baweaver"&gt;&lt;strong&gt;Brandon Weaver&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.honeybadger.io/?utm_source=hanami&amp;amp;utm_medium=paid-referral&amp;amp;utm_campaign=founding-patron"&gt;&lt;strong&gt;Honeybadger&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.fastruby.io/"&gt;&lt;strong&gt;FastRuby.io&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.appsignal.com/"&gt;&lt;strong&gt;AppSignal&lt;/strong&gt;&lt;/a&gt;. Without you, this release wouldn’t have been possible.&lt;/p&gt;
&lt;p&gt;Thank you also to the individuals supporting Hanami through our &lt;a href="https://github.com/sponsors/hanami"&gt;GitHub Sponsors&lt;/a&gt;. There are now 21 of you!&lt;/p&gt;
&lt;p&gt;We’d love for you to become a patron too. &lt;a href="/sponsor"&gt;Learn more here&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Announcing Hanami 2.3 beta2</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/10/17/announcing-hanami-230beta2"/>
    <id>https://hanakai.org/blog/2025/10/17/announcing-hanami-230beta2</id>
    <published>2025-10-17T09:30:00+00:00</published>
    <updated>2025-10-17T09:30:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;Two weeks after &lt;a href="/blog/2025/10/03/announcing-hanami-230beta1"&gt;beta1&lt;/a&gt;, it’s time for 2.3 beta2!&lt;/p&gt;
&lt;p&gt;This will be our last beta, and we’re aiming for the full 2.3 release in two weeks. Read on to see what’s new.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#hanami-run-command" aria-hidden="true" class="anchor" id="hanami-run-command"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;&lt;code&gt;hanami run&lt;/code&gt; command&lt;/h2&gt;
&lt;p&gt;You can now can run your own scripts and code snippets with the &lt;code&gt;hanami run&lt;/code&gt; command!&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="text plain"&gt;$ bundle exec hanami run my_script.rb
$ bundle exec hanami run 'Hanami.app["repos.commit_repo"].all.count'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;
&lt;a href="#improved-action-formats-config" aria-hidden="true" class="anchor" id="improved-action-formats-config"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Improved action formats config&lt;/h2&gt;
&lt;p&gt;Our &lt;a href="//guides/hanami/v2.2/actions/formats-and-mime-types"&gt;previous approach&lt;/a&gt; to action formats config (&lt;code&gt;config.formats&lt;/code&gt; in action classes or &lt;code&gt;config.actions.formats&lt;/code&gt; in app or slice classes) made it too hard to configure and use your own custom formats. We’ve now overhauled this config and made it much more flexible.&lt;/p&gt;
&lt;p&gt;This is an important change and we’d love your help with testing. If you configure formats for your actions, please pull down this beta and give this a go!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;config.formats.register&lt;/code&gt; to register a new format and its media types.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This replaces &lt;code&gt;config.formats.add&lt;/code&gt;. Unlike &lt;code&gt;.add&lt;/code&gt;, it does &lt;em&gt;not&lt;/em&gt; activate the format as “accepted” at the same time. This makes it easier to &lt;code&gt;register&lt;/code&gt; your custom formats in app config or a base action class, while maintaining control over where you apply your format restrictions.&lt;/p&gt;
&lt;p&gt;A simple registration looks like this:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;register&lt;span class="punctuation definition group begin ruby"&gt;(&lt;/span&gt;&lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;json&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation definition group end ruby"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.register&lt;/code&gt; also allows you to register one or more media types for the different stages of request processing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide &lt;code&gt;accept_types:&lt;/code&gt; to accept requests based on specific &lt;code&gt;Accept&lt;/code&gt; types in request headers.&lt;/li&gt;
&lt;li&gt;Provide &lt;code&gt;content_types:&lt;/code&gt; to accept requests based on specific &lt;code&gt;Content-Type&lt;/code&gt; request headers.&lt;/li&gt;
&lt;li&gt;Both the above are are optional. If you do not provide these, then the format’s &lt;em&gt;default&lt;/em&gt; media type (the required second argument) is used for each.&lt;/li&gt;
&lt;li&gt;This default media type is also set as the default &lt;code&gt;Content-Type&lt;/code&gt; response header when requests match that format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, these allow you to register a format like this:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;register&lt;span class="punctuation definition group begin ruby"&gt;(&lt;/span&gt;
  &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;jsonapi&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt;
  &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/vnd.api+json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt;
  &lt;span class="constant other symbol ruby"&gt;accept_types&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="punctuation section array ruby"&gt;[&lt;/span&gt;&lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/vnd.api+json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation section array ruby"&gt;]&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt;
  &lt;span class="constant other symbol ruby"&gt;content_types&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="punctuation section array ruby"&gt;[&lt;/span&gt;&lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/vnd.api+json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="string quoted double ruby"&gt;&lt;span class="punctuation definition string begin ruby"&gt;"&lt;/span&gt;application/json&lt;span class="punctuation definition string end ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation section array ruby"&gt;]&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt;
&lt;span class="punctuation definition group end ruby"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;config.formats.accept&lt;/code&gt; to accept specific formats from an action.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;formats.accept&lt;/code&gt; replaces &lt;code&gt;Action.format&lt;/code&gt; and &lt;code&gt;config.format&lt;/code&gt;. You can access your accepted formats via &lt;code&gt;formats.accepted&lt;/code&gt;, which replaces &lt;code&gt;config.formats.values&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To accept a format:&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;accept &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;html&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;json&lt;/span&gt;
config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;accepted &lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; =&amp;gt; [:html, :json]
&lt;/span&gt;
config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;accept &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;csv&lt;/span&gt; &lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; Accepted formats are additive
&lt;/span&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;accepted &lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; =&amp;gt; [:html, :json, :csv]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The first format you give to &lt;code&gt;accept&lt;/code&gt; will also become the &lt;em&gt;default format&lt;/em&gt; for responses from your action, but &lt;em&gt;only&lt;/em&gt; if you haven’t already configured a default using the approach below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use config.formats.default=` to set an action’s default format.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a new capability. Assign an action’s default format using &lt;code&gt;config.formats.default=&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The default format is used to set the response &lt;code&gt;Content-Type&lt;/code&gt; header when the request does not specify a format via &lt;code&gt;Accept&lt;/code&gt;.&lt;/p&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="source ruby"&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;accept &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;html&lt;/span&gt;&lt;span class="punctuation separator ruby"&gt;,&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;json&lt;/span&gt;

&lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; When no default is already set, the first accepted format becomes default
&lt;/span&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;default &lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; =&amp;gt; :html
&lt;/span&gt;
&lt;span class="comment line number-sign ruby"&gt;&lt;span class="punctuation definition comment ruby"&gt;#&lt;/span&gt; But you can now configure this directly
&lt;/span&gt;config&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;formats&lt;span class="punctuation accessor ruby"&gt;.&lt;/span&gt;default &lt;span class="keyword operator assignment ruby"&gt;=&lt;/span&gt; &lt;span class="constant other symbol ruby"&gt;&lt;span class="punctuation definition constant ruby"&gt;:&lt;/span&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Previous format config methods are deprecated.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The previous format config methods (&lt;code&gt;Action.format&lt;/code&gt;, &lt;code&gt;config.format&lt;/code&gt;, &lt;code&gt;config.formats.add&lt;/code&gt;, &lt;code&gt;config.formats.values&lt;/code&gt;, and &lt;code&gt;config.formats.values=&lt;/code&gt;) continue to work, but are now deprecated and will be removed in Hanami 2.4.&lt;/p&gt;
&lt;p&gt;Switching to the methods above should be straightforward, and they give you significantly more flexibility. We hope you give them a go!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-patrons" aria-hidden="true" class="anchor" id="thank-you-to-our-patrons"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our patrons &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;
&lt;/h2&gt;
&lt;p&gt;Thank you to our &lt;a href="/sponsor"&gt;Hanami patrons&lt;/a&gt; who made this release possible! That’s &lt;a href="https://sidekiq.org"&gt;&lt;strong&gt;Sidekiq&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/baweaver"&gt;&lt;strong&gt;Brandon Weaver&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.honeybadger.io/?utm_source=hanami&amp;amp;utm_medium=paid-referral&amp;amp;utm_campaign=founding-patron"&gt;&lt;strong&gt;Honeybadger&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.fastruby.io/"&gt;&lt;strong&gt;FastRuby.io&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.appsignal.com/"&gt;&lt;strong&gt;AppSignal&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you also to all the community members supporting Hanami through our &lt;a href="https://github.com/sponsors/hanami"&gt;GitHub Sponsors&lt;/a&gt;. There are now more than 20 of you!&lt;/p&gt;
&lt;p&gt;We’d love for you to become a patron too. &lt;a href="/sponsor"&gt;Learn more here.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#improvements--fixes" aria-hidden="true" class="anchor" id="improvements--fixes"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Improvements &amp;amp; fixes&lt;/h2&gt;
&lt;p&gt;We’ve got even more improvements and fixes in this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The router sees a big runtime performance boost for large numbers of routes, addressing a performance regression that was introduced as part of some fixes in Hanami 2.2.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hanami generate action&lt;/code&gt; now accepts a &lt;code&gt;--skip-tests&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hanami generate action&lt;/code&gt; will add routes to slice-specific &lt;code&gt;config/routes.rb&lt;/code&gt; files, if present.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hanami generate&lt;/code&gt; commands now graceully handle names given with mixed cases.&lt;/li&gt;
&lt;li&gt;In new apps, the &lt;code&gt;Types&lt;/code&gt; module now uses &lt;code&gt;Dry.Types(default: :strict)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In new apps, the generated &lt;code&gt;Guardfile&lt;/code&gt; now passes the environment from &lt;code&gt;ENV["HANAMI_ENV"]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The view context no longer includes &lt;code&gt;"settings"&lt;/code&gt; as a default dependency. You can include this yourself if you need it.&lt;/li&gt;
&lt;li&gt;Errors for missing actions in routes now show friendlier, relative file paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this release, we’ve also dropped support for Ruby 3.1. Hanami 2.3 will require Ruby 3.2 or later.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#we-need-your-help" aria-hidden="true" class="anchor" id="we-need-your-help"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;We need your help!&lt;/h2&gt;
&lt;p&gt;We need your help with testing! In addition to the new action formats config, we’re still keen for feedback from people navigating the upgrade to Rack 3, which we enabled &lt;a href="/blog/2025/10/03/announcing-hanami-230beta1"&gt;as part of beta1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have a Hanami app, please try upgrading to 2.3.0.beta2, adopting Rack 3, and improving your action formats. We’d love to hear how you go!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#how-can-i-try-it" aria-hidden="true" class="anchor" id="how-can-i-try-it"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;How can I try it?&lt;/h2&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="text plain"&gt;&amp;gt; gem install hanami --pre
&amp;gt; hanami new my_app
&amp;gt; cd my_app
&amp;gt; bundle exec hanami dev
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;
&lt;a href="#whats-included" aria-hidden="true" class="anchor" id="whats-included"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s included?&lt;/h2&gt;
&lt;p&gt;Today we’re releasing the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hanami v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-assets v2.3.0-beta.2 (npm package)&lt;/li&gt;
&lt;li&gt;hanami-assets v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-cli v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-controller v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-db v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-reloader v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-router v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-rspec v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-utils v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-validations v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-view v2.3.0.beta2&lt;/li&gt;
&lt;li&gt;hanami-webconsole v2.3.0.beta2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the full list of changes, please see each package’s own CHANGELOG.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We have a short list of remaining fixes and improvements to make before our proper 2.3 release. See &lt;a href="https://github.com/orgs/hanami/projects/12/views/1"&gt;this GitHub project&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;We expect to be back with 2.3 in a couple of weeks.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-contributors" aria-hidden="true" class="anchor" id="thank-you-to-our-contributors"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our contributors!&lt;/h2&gt;
&lt;p&gt;Thank you to all these amazing people who contributed to this release!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/afomera"&gt;Andrea Fomera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/baweaver"&gt;Brandon Weaver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kyleplump"&gt;Kyle Plump&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/minaslater"&gt;Mina Slater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cllns"&gt;Sean Collins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stephannv"&gt;stephannv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/timriley"&gt;Tim Riley&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you again for giving this beta a try! We’re looking forward to hearing your feedback. &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Announcing Hanami 2.3 beta1</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/10/03/announcing-hanami-230beta1"/>
    <id>https://hanakai.org/blog/2025/10/03/announcing-hanami-230beta1</id>
    <published>2025-10-03T08:20:00+00:00</published>
    <updated>2025-10-03T08:20:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;After getting set up for &lt;a href="/sponsor"&gt;sponsorship&lt;/a&gt; (we still want to hear from you!), we’re back with a new Hanami release. Today we’re pleased to announce the first beta of Hanami 2.3.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#rack-3-support" aria-hidden="true" class="anchor" id="rack-3-support"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Rack 3 support&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;This one goes up to &lt;s&gt;eleven&lt;/s&gt; three.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With this release, we introduce Rack 3 support to Hanami!&lt;/p&gt;
&lt;p&gt;We now support Rack versions 2 and 3, so you can use whichever version suits your situation. We still encourage you to upgrade Rack when you can, and we’re happy that Hanami is no longer a blocker on this path.&lt;/p&gt;
&lt;p&gt;To upgrade your app to Rack 3, update your Hanami gems to this beta release, then &lt;code&gt;bundle update rack&lt;/code&gt;. You should also check out the &lt;a href="https://github.com/rack/rack/blob/main/UPGRADE-GUIDE.md"&gt;Rack 3 upgrade guide&lt;/a&gt;. Most changes will be handled for you by the Hanami gems, but you may need to update some of your app code if you’re dealing with lower-level request/response details.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-patrons" aria-hidden="true" class="anchor" id="thank-you-to-our-patrons"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our patrons &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;
&lt;/h2&gt;
&lt;p&gt;This is a our first release since launching our &lt;a href="/sponsor"&gt;sponsorship program&lt;/a&gt;. I’d like to extend a very warm thank you to the patrons who made this possible: &lt;a href="https://sidekiq.org"&gt;&lt;strong&gt;Sidekiq&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/baweaver"&gt;&lt;strong&gt;Brandon Weaver&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.honeybadger.io/?utm_source=hanami&amp;amp;utm_medium=paid-referral&amp;amp;utm_campaign=founding-patron"&gt;&lt;strong&gt;Honeybadger&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.fastruby.io/"&gt;&lt;strong&gt;FastRuby.io&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.appsignal.com/"&gt;&lt;strong&gt;AppSignal&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you also to all the community members supporting Hanami through our &lt;a href="https://github.com/sponsors/hanami"&gt;GitHub Sponsors&lt;/a&gt;. There are now 20 of you!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#improvements" aria-hidden="true" class="anchor" id="improvements"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Improvements&lt;/h2&gt;
&lt;p&gt;This beta also brings a range of nice improvements to your Hanami experience:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add your own methods to &lt;code&gt;hanami console&lt;/code&gt; via own modules. Add &lt;code&gt;config.console.include MyModule, AnotherModule&lt;/code&gt; to your app class.&lt;/li&gt;
&lt;li&gt;Prefer Pry to IRB? Make it the default with &lt;code&gt;config.console.engine = :pry&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When you specify &lt;code&gt;'nonce'&lt;/code&gt; in your content security policy, a nonce is automatically added to &lt;code&gt;javascript_tag&lt;/code&gt; and &lt;code&gt;stylesheet_tag&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Access subdomains using &lt;code&gt;Request#subdomains&lt;/code&gt;, and configure your default TLD length with &lt;code&gt;config.actions.default_tld_length&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Redirect to absolute URLs in route definitions: &lt;code&gt;redirect '/example', to: https://example.com, code: 302&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You can now use single-character slice names.&lt;/li&gt;
&lt;li&gt;Run any &lt;code&gt;hanami generate&lt;/code&gt; command inside a slice directory and the slice will automatically be used as the target for the new files.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;hanami db rollback&lt;/code&gt; to easily rollback a database migration.&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;hanami new&lt;/code&gt; will now initialize a Git repository in your new app.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;hanami new&lt;/code&gt; with &lt;code&gt;--skip-view&lt;/code&gt; to skip generating the view layer.&lt;/li&gt;
&lt;li&gt;The default &lt;code&gt;Rakefile&lt;/code&gt; will automatically load custom tasks from the conventional &lt;code&gt;lib/tasks/&lt;/code&gt; location.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;README.md&lt;/code&gt; in newly generated apps now includes some helpful instructions for next steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;a href="#fixes" aria-hidden="true" class="anchor" id="fixes"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Fixes&lt;/h2&gt;
&lt;p&gt;We’ve also fixed a bunch of bugs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow access to autoloaded constants in &lt;code&gt;config/routes.rb&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Support &lt;code&gt;include Deps&lt;/code&gt; in repo classes.&lt;/li&gt;
&lt;li&gt;Avoid false negatives for content type matches in actions.&lt;/li&gt;
&lt;li&gt;Properly show database errors arising from &lt;code&gt;hanami db&lt;/code&gt; commands.&lt;/li&gt;
&lt;li&gt;Skip ENV var processing by Foreman (run via &lt;code&gt;hanami dev&lt;/code&gt; by default) to ensure consistent ENV loading across environemnts.&lt;/li&gt;
&lt;li&gt;Respect app inflections when running &lt;code&gt;hanami generate&lt;/code&gt; commands.&lt;/li&gt;
&lt;li&gt;Prevent &lt;code&gt;generate&lt;/code&gt; commands from overwriting files.&lt;/li&gt;
&lt;li&gt;Convert special characters to underscores in route helper names.&lt;/li&gt;
&lt;li&gt;Include all necessary gems when running &lt;code&gt;hanami new&lt;/code&gt; with the &lt;code&gt;--head&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;a href="#we-need-your-help" aria-hidden="true" class="anchor" id="we-need-your-help"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;We need your help!&lt;/h2&gt;
&lt;p&gt;Our Rack 3 upgrade is one of the more intricate changes we’ve made, especially considering the broad ecosystem that depends on Rack. We need your help to make sure this goes smoothly!&lt;/p&gt;
&lt;p&gt;If you have a Hanami app, please try upgrading to 2.3.0.beta1 and Rack 3, and let us know how you go!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#how-can-i-try-it" aria-hidden="true" class="anchor" id="how-can-i-try-it"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;How can I try it?&lt;/h2&gt;
&lt;div class="pre-wrapper" data-defo-copy-code&gt;
&lt;button type="button" class="pre-wrapper__button" aria-label="Copy"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--copy" height="16" viewbox="0 0 256 256" width="16"&gt; &lt;path d="M172,164a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,164Zm-12-52H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24Zm60-64V216a20,20,0,0,1-20,20H56a20,20,0,0,1-20-20V48A20,20,0,0,1,56,28H90.53a51.88,51.88,0,0,1,74.94,0H200A20,20,0,0,1,220,48ZM100.29,60h55.42a28,28,0,0,0-55.42,0ZM196,52H178.59A52.13,52.13,0,0,1,180,64v8a12,12,0,0,1-12,12H88A12,12,0,0,1,76,72V64a52.13,52.13,0,0,1,1.41-12H60V212H196Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pre-wrapper__icon pre-wrapper__icon--check" height="16" viewbox="-13 0 276 276" width="16"&gt; &lt;path d="M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/button&gt;&lt;pre class="syntax-highlighting"&gt;&lt;code&gt;&lt;span class="text plain"&gt;&amp;gt; gem install hanami --pre
&amp;gt; hanami new my_app
&amp;gt; cd my_app
&amp;gt; bundle exec hanami dev
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;
&lt;a href="#whats-included" aria-hidden="true" class="anchor" id="whats-included"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s included?&lt;/h2&gt;
&lt;p&gt;Today we’re releasing the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hanami v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-assets v2.3.0-beta.1 (npm package)&lt;/li&gt;
&lt;li&gt;hanami-assets v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-cli v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-controller v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-db v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-reloader v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-router v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-rspec v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-utils v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-validations v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-view v2.3.0.beta1&lt;/li&gt;
&lt;li&gt;hanami-webconsole v2.3.0.beta1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the full list of changes, please see each package’s own CHANGELOG.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We have a short list of remaining fixes and improvements to make before a proper 2.3 release. See &lt;a href="https://github.com/orgs/hanami/projects/12/views/1"&gt;this GitHub project&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;I anticipate we’ll do one more beta release, followed by the final 2.3 release.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thank-you-to-our-contributors" aria-hidden="true" class="anchor" id="thank-you-to-our-contributors"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Thank you to our contributors!&lt;/h2&gt;
&lt;p&gt;Thank you to all these amazing people who contributed to this release!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaronmallen"&gt;Aaron Allen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alassek"&gt;Adam Lassek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AlexanderZagaynov"&gt;Alexander Zagaynov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/afomera"&gt;Andrea Fomera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hanarimawi"&gt;Hana Rimawi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/inouire"&gt;inouire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/krzykamil"&gt;Krzysztof Piotrowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kyleplump"&gt;Kyle Plump&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maxemitchell"&gt;Max Mitchell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/katafrakt"&gt;Paweł Świątkowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cllns"&gt;Sean Collins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stephannv"&gt;stephannv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/svoop"&gt;Sven Schwyn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/seven1m"&gt;Tim Morgan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/timriley"&gt;Tim Riley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WToa"&gt;William Tio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wout"&gt;Wout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wuarmin"&gt;wuarmin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/y-yagi"&gt;y-yagi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you again for giving this beta a try! We’re looking forward to hearing your feedback. &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Hanami adopts Contributor Covenant 3.0</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/09/02/hanami-adopts-contributor-covenant-3-0"/>
    <id>https://hanakai.org/blog/2025/09/02/hanami-adopts-contributor-covenant-3-0</id>
    <published>2025-09-02T08:30:00+00:00</published>
    <updated>2025-09-02T08:30:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;Our community is the most precious part of Hanami. When you pick up Hanami, we want to make sure you have a great time. This is why we place our community values front and centre &lt;a href="https://hanamirb.org"&gt;on our home page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We want the Hanami community to be a welcoming place for people who bring kindness, curiosity, and care. A place where people of all backgrounds and experience levels can feel respected, and can share and grow. A place for people to be proud of, and feel safe within.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s also why we govern our community spaces under the &lt;a href="https://www.contributor-covenant.org"&gt;Contributor Covenant&lt;/a&gt; code of conduct. This is the gold standard for community codes of conduct, and it’s served us well &lt;a href="https://github.com/hanami/hanami/commit/54ce22376146efcd8a76c0b281e5bb74a3ff16e1"&gt;for over ten years&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Today we’re delighted to adopt the new &lt;a href="https://www.contributor-covenant.org/version/3/0/code_of_conduct/"&gt;Contributor Covenant 3.0&lt;/a&gt;,&lt;/strong&gt; released just last month. This new version brings &lt;a href="https://ethicalsource.dev/blog/contributor-covenant-3/"&gt;a number of improvements&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Contributor Covenant 3.0 is designed to be more adaptable to different kinds of communities, both online and offline. It is written with clearer, less US-centric language, intended to be easier to understand and translate. The enforcement guidelines section has been reimagined as “Addressing and Repairing Harm,” reflecting an alignment with principles of restorative justice, including finding ways to safely reintegrate someone back into a community after an incident occurs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We’re pleased that this new version is more approachable for our worldwide community. We also welcome the focus on restorative justice. The examples of how people can make genuine amends to grow and rejoin a community are clear and well explained.&lt;/p&gt;
&lt;p&gt;These changes won’t affect how we interact day-to-day in our already lovely community, but do give us better tools for the rare times when conflicts need thoughtful resolution.&lt;/p&gt;
&lt;p&gt;Thank you to the &lt;a href="https://ethicalsource.dev"&gt;Organization for Ethical Source&lt;/a&gt; for their work on this new version!&lt;/p&gt;
&lt;p&gt;You can find our instance of the Contributor Covenant on &lt;a href="https://hanamirb.org/community/#code-of-conduct"&gt;our community page&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Wrapping up our sponsorship drive</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/08/27/wrapping-up-our-sponsorship-drive"/>
    <id>https://hanakai.org/blog/2025/08/27/wrapping-up-our-sponsorship-drive</id>
    <published>2025-08-27T11:45:00+00:00</published>
    <updated>2025-08-27T11:45:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;After six posts (the &lt;a href="/blog/2025/06/03/become-a-hanami-dry-and-rom-patron"&gt;announcement&lt;/a&gt;, our &lt;a href="/blog/2025/06/11/hear-from-our-founding-patrons"&gt;founding patrons&lt;/a&gt;, a &lt;a href="/blog/2025/06/20/field-report-from-riga-and-the-rooftop"&gt;field report&lt;/a&gt;, meeting &lt;a href="/blog/2025/06/26/meet-tim-and-sean"&gt;Tim and Sean&lt;/a&gt;, the &lt;a href="/blog/2025/07/11/hanami-and-the-elephant-in-the-room"&gt;Rails elephant in the room&lt;/a&gt;, and a &lt;a href="/blog/2025/07/24/the-look-of-things-to-come"&gt;cuteness preview&lt;/a&gt;), it’s time to wrap up our sponsorship drive for 2025.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#howd-we-go" aria-hidden="true" class="anchor" id="howd-we-go"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;How’d we go?&lt;/h2&gt;
&lt;p&gt;Thanks to your support, we’ve entered a whole new era for Hanami, Dry and Rom. For the first time ever, Ruby has a &lt;em&gt;second&lt;/em&gt; framework backed by funding!&lt;/p&gt;
&lt;p&gt;Granted, we’re at only 0.2 of a full-time role, but a start is a start! We’re here for the long haul, and going from 0 to &lt;em&gt;something&lt;/em&gt; is one of the most important jumps we will make.&lt;/p&gt;
&lt;p&gt;We have you—the Ruby community—to thank for this.&lt;/p&gt;
&lt;p&gt;Thank you especially to &lt;a href="https://www.mikeperham.com"&gt;Mike Perham&lt;/a&gt; and &lt;a href="https://sidekiq.org"&gt;Sidekiq&lt;/a&gt;, &lt;a href="https://github.com/baweaver"&gt;Brandon Weaver&lt;/a&gt;, Joshua Wood and &lt;a href="https://www.honeybadger.io/?utm_source=hanami&amp;amp;utm_medium=paid-referral&amp;amp;utm_campaign=founding-patron"&gt;Honeybadger&lt;/a&gt;, Ernesto Tagwerker and &lt;a href="https://www.fastruby.io/"&gt;FastRuby&lt;/a&gt;, and Roy Tomeij and &lt;a href="https://www.appsignal.com/"&gt;AppSignal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These are our &lt;a href="/blog/2025/06/11/hear-from-our-founding-patrons"&gt;founding patrons&lt;/a&gt;, and without their support, this whole thing would never have got off the ground. They’ve committed $26k towards our first year of paid maintenance.&lt;/p&gt;
&lt;p&gt;These people are visionaries, going out of their way to support a brighter, better Ruby. Just look at how Brandon describes it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Ruby diversity is our greatest strength, whether that be the people, the ideas, or the technologies we use. Ruby is not just one framework, nor is it just one person, it is a community of passionate people pushing the boundaries of what’s possible not just as individuals, but as a collective. I am happy to continue to fund efforts building upon that vision of the future.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Who &lt;em&gt;wouldn’t&lt;/em&gt; want this for Ruby? We’re doing everything we can to make this real.&lt;/p&gt;
&lt;p&gt;We’ve also been buoyed by new support from fellow community members. We’ve been delighted to welcome 15 new community patrons via our &lt;a href="https://github.com/sponsors/hanami"&gt;GitHub Sponsors&lt;/a&gt;. These are individuals who’re putting their own money towards Hanami, and together they’re contributing $260/month. Thank you!&lt;/p&gt;
&lt;p&gt;We’ve also established &lt;a href="https://rubycentral.org/news/ruby-central-announces-open-source-fiscal-sponsorship-program-hanami-support/"&gt;a partnership with Ruby Central&lt;/a&gt; as our fiscal host. Ruby Central gives us a very attractive fee structure (5% vs the 10% that Open Collective charges) and they have already handled the funds for most of our business patrons. This means more of your money goes directly to our work on tools for Rubyists.&lt;/p&gt;
&lt;p&gt;Ruby Central went out of their way to set this up for us, and I couldn’t think of a better partner for this. We share the same vision for Ruby’s future, and I’m excited to collaborate with them for many years to come!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After all of this, how did we go? We’ve raised $29k (so far!). This is short of our initial $40k target, but fortunately, it’s still enough to support me at 1 day/week for this first year of paid maintenance.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#were-ready-are-you" aria-hidden="true" class="anchor" id="were-ready-are-you"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;We’re ready. Are you?&lt;/h2&gt;
&lt;p&gt;While our sponsorship drive may be coming to an end, we’re ready to bring in new supporters at any time.&lt;/p&gt;
&lt;p&gt;Does your business already depend on our gear? (I’m sure there are a lot of you out there, with our billion gem downloads and counting across Hanami, Dry and Rom). Or do you want to step up and count yourself among the brave few willing to forge a healthier, kinder future for Ruby? If so, then come &lt;a href="/sponsor"&gt;talk to us&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Establishing our sponsorship was &lt;a href="/blog/2024/12/10/state-of-hanami-december-2024"&gt;one of our most important goals for 2025&lt;/a&gt;, and I’m very happy we’ve managed to get that done. While it did take a lot of time and brain space, we’ve still managed several other initiatives:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upcoming release:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moving towards a Hanami 2.3 release. Rack 3 support will be the centrepiece here, but this will bring in a range of small improvements and fixes too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Brand and community:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preparing new branding for our projects, along with a way to bring them together as a unified family. &lt;a href="/blog/2025/07/24/the-look-of-things-to-come"&gt;You’ve seen a preview of this already&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Building our brand new website, which will provide a one-stop shop for everything Hanami, Dry and Rom. Guides, docs, news, community info and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Project maintenance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Catching up on &lt;em&gt;housekeeping&lt;/em&gt;. First order of business is rolling out a tool to keep our 50+ GitHub repos in sync.&lt;/li&gt;
&lt;li&gt;Working on new contributor guidelines that will make it clear how you can become a maintainer, and empower our existing maintainers to take our gems to the next level.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;One more thing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Personally, I’ve (finally!) found some time to work on my open source Hanami example app, Decaf Sucks. My current focus is &lt;a href="https://github.com/decafsucks/decafsucks/pull/32"&gt;adding streamlined Rodauth integration&lt;/a&gt;, something that feels completely “Hanami-native” and can serve as the foundation for an eventual rodauth-hanami gem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With sponsorships in place, I can’t wait to bring you all of the above!&lt;/p&gt;
&lt;p&gt;Exciting stuff is on the way. If you want to help out or follow along, come say hi in &lt;a href="https://discord.gg/KFCxDmk3JQ"&gt;chat&lt;/a&gt; or &lt;a href="https://discourse.hanamirb.org"&gt;our forum&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>The look of things to come</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/07/24/the-look-of-things-to-come"/>
    <id>https://hanakai.org/blog/2025/07/24/the-look-of-things-to-come</id>
    <published>2025-07-24T12:50:00+00:00</published>
    <updated>2025-07-24T12:50:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;It’s week 6 of our sponsorship drive!&lt;/p&gt;
&lt;p&gt;Let’s make sure you’re all caught up. So far, we have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/blog/2025/06/03/become-a-hanami-dry-and-rom-patron"&gt;Launched the sponsorship drive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/2025/06/11/hear-from-our-founding-patrons"&gt;Heard from our founding patrons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/2025/06/20/field-report-from-riga-and-the-rooftop"&gt;Shared a podcast and field report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/2025/06/26/meet-tim-and-sean"&gt;Met Tim and Sean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/2025/07/11/hanami-and-the-elephant-in-the-room"&gt;And addressed elephant in the room, Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s a lot of words across those posts. So today I want to share something different, something &lt;em&gt;visual&lt;/em&gt;. Behold, cuteness!&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/assets/2025-07-24-the-look-of-things-to-come/new-logos-preview.webp" alt="A preview of our new logos" title="A preview of our new logos" width="1600" height="701"&gt;&lt;/p&gt;
&lt;p&gt;Here you have your very own preview of the new faces we’re creating for Hanami, Dry and Rom.&lt;/p&gt;
&lt;p&gt;I’m &lt;em&gt;so&lt;/em&gt; excited for this. These logos will unify our projects while allowing each to maintain its own identity. They’re also the visual representation of &lt;a href="/blog/2025/07/11/hanami-and-the-elephant-in-the-room#it-all-comes-back-to-people"&gt;the culture we’re building&lt;/a&gt;, of kindness, curiosity and care — and also, delight! Ruby is fun, after all!&lt;/p&gt;
&lt;p&gt;We’ll have more to share on this in due course, but if there’s one thing I already know, it’s that the future is looking bright (and cute!). We’d love to have you join in. &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/p&gt;
&lt;p&gt;A huge thank you to &lt;a href="https://aaronmoodie.com"&gt;Aaron Moodie&lt;/a&gt; for his work in bringing this to life!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#sponsorship-updates" aria-hidden="true" class="anchor" id="sponsorship-updates"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Sponsorship updates&lt;/h2&gt;
&lt;p&gt;Since our last update, we’ve had a slew of community patrons &lt;a href="https://github.com/sponsors/hanami"&gt;join via GitHub Sponsors&lt;/a&gt;. Thank you for your support, &lt;a href="https://github.com/aaronmallen"&gt;Aaron Allen&lt;/a&gt;, &lt;a href="https://github.com/PericlesTheo"&gt;Pericles Theodorou&lt;/a&gt;, &lt;a href="https://github.com/hedselu"&gt;Robert Pawlas&lt;/a&gt;, &lt;a href="https://github.com/konung"&gt;Nick Gorbikoff&lt;/a&gt; and &lt;a href="https://github.com/jaredsmithse"&gt;Jared Smith&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;We’d love for you to join them and become a patron. &lt;a href="/sponsor"&gt;Learn more here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’re nearly at the end of our inaugural sponsorship drive. In my next post, I’ll come back to wrap everything up. See you then!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Hanami and the elephant in the room</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/07/11/hanami-and-the-elephant-in-the-room"/>
    <id>https://hanakai.org/blog/2025/07/11/hanami-and-the-elephant-in-the-room</id>
    <published>2025-07-11T18:30:00+00:00</published>
    <updated>2025-07-11T18:30:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;It’s week 5 of our sponsorship drive! By now you’ve &lt;a href="/blog/2025/06/03/become-a-hanami-dry-and-rom-patron"&gt;already&lt;/a&gt; &lt;a href="/blog/2025/06/11/hear-from-our-founding-patrons"&gt;heard&lt;/a&gt; the &lt;a href="/blog/2025/06/20/field-report-from-riga-and-the-rooftop"&gt;many&lt;/a&gt; &lt;a href="/blog/2025/06/26/meet-tim-and-sean"&gt;reasons&lt;/a&gt; to &lt;a href="/sponsor"&gt;become a patron&lt;/a&gt; of Hanami, Dry and Rom. You’ve also seen me talk about such things &lt;a href="https://www.rubyevents.org/speakers/tim-riley"&gt;on conference stages&lt;/a&gt; over the years.&lt;/p&gt;
&lt;p&gt;Thing is, I’m a fairly restrained person, and I always try to be thoughtful and positive. Sometimes I wonder what this means for my &lt;em&gt;cut-through&lt;/em&gt;, especially when so far I’ve tried to stay focused on our gear and its benefits, rather than the elephant in the room — Ruby on Rails.&lt;/p&gt;
&lt;p&gt;Today I’ll share my reasons again, but this time directly acknowledging Rails, and trying not to pull any punches. So, let’s imagine ourselves in the hallway track at one of those conferences, having a chat, and you ask…&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#ruby-has-rails-i-use-rails-why-should-i-support-you" aria-hidden="true" class="anchor" id="ruby-has-rails-i-use-rails-why-should-i-support-you"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Ruby has Rails. I use Rails! Why should I support you?&lt;/h2&gt;
&lt;p&gt;This is about creating a healthy future for Ruby. This is good for &lt;em&gt;everyone&lt;/em&gt; who cares about Ruby. Rails users should care about this too.&lt;/p&gt;
&lt;p&gt;A healthy future for Ruby is a more diverse one. Monocultures are fragile and bad for people. We want to make it so both Rails and Hanami become part of a broader range of offerings for Rubyists new and old. This will help Ruby grow, because we’ll have the tools and communities to suit a wider range of needs and wants.&lt;/p&gt;
&lt;p&gt;For this to work, these other tools and communities can’t all remain the tiniest of tiny niches. They need to be attractive and self-sustaining. They need a certain critical mass.&lt;/p&gt;
&lt;p&gt;This is where we are with Hanami, Dry and Rom. We’ve put ten years into constructing this ecosystem. It’s already complete and capable. We have a turnkey framework and a whole bunch of useful standalone gems. We have an active and growing community of contributors and users. With a bit of help, we can cross over this threshold and turn this into something that can really change Ruby for the better.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#thats-all-well-and-good-but-how-does-it-help-me-now" aria-hidden="true" class="anchor" id="thats-all-well-and-good-but-how-does-it-help-me-now"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;That’s all well and good. But how does it help me now?&lt;/h2&gt;
&lt;p&gt;We’re already helping thousands of Rails developers thanks to our &lt;a href="https://dry-rb.org/"&gt;Dry&lt;/a&gt; gems (a billion downloads and counting!). These bring structure and precision to your app’s business logic. To get a taste, check out &lt;a href="https://dry-rb.org/gems/dry-validation"&gt;dry-validation&lt;/a&gt;, &lt;a href="https://dry-rb.org/gems/dry-types"&gt;dry-types&lt;/a&gt;/&lt;a href="https://dry-rb.org/gems/dry-struct"&gt;dry-struct&lt;/a&gt; and &lt;a href="https://dry-rb.org/gems/dry-operation"&gt;dry-operation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you’re in a Rails app and you aren’t using these tools, or if you haven’t yet played with Hanami, I think you should give them a try!&lt;/p&gt;
&lt;p&gt;Why? Because they’ll stretch your brain in new and helpful ways. You’ll practice different patterns and see new ways of working with Ruby. The experience will make you a better developer.&lt;/p&gt;
&lt;p&gt;Better how? You’ll see how separation of concerns and object composition form the foundation of good software practice. You’ll see the freeing benefits of working with immutable objects and clear data flows. You’ll see how apps can be clearly layered rather than blended to the point where you’re concerning yourself with database queries while writing view code.&lt;/p&gt;
&lt;p&gt;I’m certain you’ll come out of the experience with some new ideas for improving your day-to-day Rails apps.&lt;/p&gt;
&lt;p&gt;You might even decide you want more of this in your future, in your apps, or even as a contributor. I know this can happen, because I lived it.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#i-know-this-matters-because-its-why-im-still-here" aria-hidden="true" class="anchor" id="i-know-this-matters-because-its-why-im-still-here"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;I know this matters because it’s why I’m still here&lt;/h2&gt;
&lt;p&gt;I got lucky. I found Ruby very early on. And I loved it. Ruby and me, we just clicked.&lt;/p&gt;
&lt;p&gt;But ten years ago, I began feeling disillusioned in my work writing Rails apps. I felt I’d stopped growing and learning as a software developer.&lt;/p&gt;
&lt;p&gt;I knew I needed to try something different to break out of that rut, to expose myself to new ideas. But I also didn’t want to leave Ruby, because Ruby felt like home.&lt;/p&gt;
&lt;p&gt;Instead, I looked around for the people doing things differently &lt;em&gt;within&lt;/em&gt; Ruby. I tell you, it felt like a wilderness! But I did find some folks. Peter Solnica and his projects. Jeremy Evans with Roda. And of course, Luca Guidi in his early days with Hanami.&lt;/p&gt;
&lt;p&gt;From there I started cobbling things together and building and shipping completely different kinds of apps in Ruby. And I learnt so much along the way! Actual &lt;em&gt;software design&lt;/em&gt; things, more than just colouring in the MVC lines.&lt;/p&gt;
&lt;p&gt;Hanami, Dry and Rom are why I’m still with Ruby today. They let me write the Ruby I want to write. The Ruby that fits the way I think. The Ruby that helps me build apps I feel confident to maintain.&lt;/p&gt;
&lt;p&gt;Thanks to our work, it’s no longer a wilderness out there! Today if you want or need something different, you can install a gem and start playing and learning in minutes.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#it-all-comes-back-to-people" aria-hidden="true" class="anchor" id="it-all-comes-back-to-people"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;It all comes back to people&lt;/h2&gt;
&lt;p&gt;A big reason many of us click with Ruby is the idea of “programmer happiness” that Matz imbued into the language. Matz created Ruby for &lt;em&gt;people&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But our experience with Ruby doesn’t start and end with the language itself. It’s further defined by the tools we use on top of it, and the communities we inhabit around it.&lt;/p&gt;
&lt;p&gt;With Hanami, Dry and Rom, our goal is to provide healthy alternatives at every level. We’re here to offer more than just a new flavour of technical tools. We care even more about the community that we’re building around them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We want this to be a welcoming place for people who bring kindness, curiosity, and care.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We want this to be a welcoming place for people who bring kindness, curiosity, and care. A place where people of all backgrounds and experience levels can feel respected, and can share and grow. A place people can feel proud of, and can feel safe within.&lt;/p&gt;
&lt;p&gt;This means being clear on what we won’t tolerate. It’s why we put “No nazis, no transphobes, no racists, no bigotry of any kind” front and centre on our website and in all our community spaces.&lt;/p&gt;
&lt;p&gt;So if you’re a Rails dev tired of the &lt;a href="https://web.archive.org/web/20221121092605/https://world.hey.com/dhh/the-waning-days-of-dei-s-dominance-9a5b656c"&gt;bile&lt;/a&gt; &lt;a href="https://web.archive.org/web/20250121025347/https://world.hey.com/dhh/mega-a0f62cd4"&gt;coming&lt;/a&gt; &lt;a href="https://web.archive.org/web/20250120071809/https://world.hey.com/dhh/failed-integration-and-the-fall-of-multiculturalism-77296314"&gt;from&lt;/a&gt; &lt;a href="https://web.archive.org/web/20250630061232/https://world.hey.com/dhh/the-parental-dead-end-of-consent-morality-e4e8a8ee"&gt;dear&lt;/a&gt; &lt;a href="https://web.archive.org/web/20250417082450/https://world.hey.com/dhh/bad-therapy-08849dc9"&gt;leader’s&lt;/a&gt; &lt;a href="https://web.archive.org/web/20250618025856/https://world.hey.com/dhh/cold-reading-an-adhd-affliction-44163793"&gt;bully&lt;/a&gt; &lt;a href="https://web.archive.org/web/20230115183046/https://world.hey.com/dhh/we-must-say-no-to-these-people-e0fb301c"&gt;pulpit&lt;/a&gt;, now you have another place you can invest your energy, knowing it will go towards something that feels right, like the Ruby that called to you in the beginning. Perhaps it’s time you gave it a shot?&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#support-your-future-with-ruby" aria-hidden="true" class="anchor" id="support-your-future-with-ruby"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Support your future with Ruby&lt;/h2&gt;
&lt;p&gt;So if you’re currently on Rails, those are your reasons for supporting our work with Hanami, Dry and Rom: we’re helping to create a healthy thriving future for you as well as &lt;em&gt;all of Ruby&lt;/em&gt;, Rails included.&lt;/p&gt;
&lt;p&gt;We offer essential variety to Ruby: gems to help your Rails apps today, opportunities to learn and grow, a framework for when you want the next level, and a caring community to back it all up.&lt;/p&gt;
&lt;p&gt;Our community has had its ups and downs, but right now we’re riding a fresh wave of energy and growth. If you love Ruby, this is where you can learn, share, and belong, now and for years to come.&lt;/p&gt;
&lt;p&gt;When you sponsor our work, you’re not just supporting our projects, you’re investing in your own future. As you grow and your needs change, we can make sure Ruby grows with you.&lt;/p&gt;
&lt;p&gt;What are you waiting for? Let’s do this! &lt;svg class="emoji-logo emoji-logo--hanami inline" height="1em" width="1em" viewbox="0 0 164 159" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;path fill-rule="evenodd" clip-rule="evenodd" d="m39.3087 98.5899c-3.805.37-7.7441-.02-11.6091-1.28l-7.8299-2.54c-15.09004-4.91-23.36005-21.14-18.45705-36.23s21.13505-23.36 36.22405-18.46l7.8309 2.55c3.864 1.25 7.281 3.25 10.145 5.79-1.524-3.51-2.369-7.3799-2.369-11.4399v-8.2301c0-15.87 12.8821-28.75003733 28.7481-28.75003733s28.7483 12.88003733 28.7483 28.75003733v8.2301c0 4.06-.845 7.9299-2.368 11.4399 2.863-2.54 6.28-4.54 10.145-5.79l7.83-2.55c15.09-4.9 31.321 3.37 36.224 18.46s-3.367 31.32-18.457 36.23l-7.83 2.54c-3.865 1.26-7.804 1.65-11.609 1.28 3.293 1.9401 6.25 4.5801 8.638 7.8601l4.84 6.663c9.326 12.837 6.476 30.829-6.36 40.155-12.837 9.327-30.829 6.477-40.1553-6.359l-4.84-6.661c-2.388-3.288-3.978-6.913-4.806-10.645-.828 3.732-2.418 7.357-4.806 10.645l-4.8391 6.661c-9.326 12.836-27.319 15.686-40.156 6.359-12.836-9.326-15.6859-27.318-6.3589-40.155l4.839-6.663c2.388-3.28 5.345-5.92 8.638-7.8601z" fill="#FF6C89"&gt;&lt;/path&gt; &lt;path d="m81.9919 50.5298c18.2971 0 33.1521 14.8601 33.1521 33.1601 0 18.2901-14.855 33.1481-33.1521 33.1481-18.297 0-33.1521-14.858-33.1521-33.1481 0-18.3 14.8551-33.1601 33.1521-33.1601z" fill="#FFC9C4"&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Meet Tim and Sean</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/06/26/meet-tim-and-sean"/>
    <id>https://hanakai.org/blog/2025/06/26/meet-tim-and-sean</id>
    <published>2025-06-26T18:15:00+00:00</published>
    <updated>2025-06-26T18:15:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;It’s week 4 of our &lt;a href="/blog/2025/06/03/become-a-hanami-dry-and-rom-patron"&gt;sponsorship drive&lt;/a&gt;! This week is your chance to get to know the people you’ll be supporting:&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/assets/2025-06-26-meet-tim-and-sean/sean-and-tim.webp" alt="Sean and Tim at RubyConf 2024" title="Sean and Tim at RubyConf 2024" width="1280" height="1280"&gt;&lt;/p&gt;
&lt;p&gt;That’s Sean on the left, me on the right. Now let’s get into it!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#meet-tim" aria-hidden="true" class="anchor" id="meet-tim"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Meet Tim&lt;/h2&gt;
&lt;h3&gt;
&lt;a href="#tell-us-a-bit-about-yourself" aria-hidden="true" class="anchor" id="tell-us-a-bit-about-yourself"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Tell us a bit about yourself&lt;/h3&gt;
&lt;p&gt;I’m a software developer living in Canberra, Australia with my wife and two children.&lt;/p&gt;
&lt;p&gt;I’ve been toying with computers since I was a kid. After years of playing newsagency-bought shareware games, teenage me found Linux (thank you &lt;a href="https://archive.org/details/TheLinuxPocketbook/TheLinuxPocketbookfrontCover.jpg"&gt;APC Mag Pocketbook&lt;/a&gt;). After another few years, mostly spent reinstalling distros and theming Openbox, I eventually found Ruby! That was in 2002. I’ve been lucky to work with it ever since.&lt;/p&gt;
&lt;h3&gt;
&lt;a href="#whats-your-story-with-hanami" aria-hidden="true" class="anchor" id="whats-your-story-with-hanami"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s your story with Hanami?&lt;/h3&gt;
&lt;p&gt;My path towards Hanami started 10 years ago. Back then I was helping to run &lt;a href="https://www.icelab.com.au"&gt;Icelab&lt;/a&gt;, a design and development agency here in Australia. Our team would build apps for our clients in their entirety, and go on to maintain them thereafter. Our tool of choice was Rails, and it had served us well.&lt;/p&gt;
&lt;p&gt;After shipping and maintaining dozens of Rails apps over the years, I felt like I had begun to stagnate as a developer. I was no longer growing and learning in the way I wanted to. The code I’d been writing no longer felt right for me.&lt;/p&gt;
&lt;p&gt;I knew I needed some kind of change to break out of the rut and begin a new stage of growth. But I loved Ruby, and didn’t want to leave. So instead I looked around for people who were doing things &lt;em&gt;differently&lt;/em&gt; with Ruby. I found &lt;a href="https://roda.jeremyevans.net"&gt;Roda&lt;/a&gt; from &lt;a href="https://github.com/jeremyevans"&gt;Jeremy Evans&lt;/a&gt;. I found &lt;a href="https://github.com/solnic"&gt;Peter Solnica&lt;/a&gt;. It was this that set me off on my journey to Hanami.&lt;/p&gt;
&lt;p&gt;In 2015, I was part of the team that founded the &lt;a href="https://dry-rb.org"&gt;Dry&lt;/a&gt; project. I spent the following years building production apps at Icelab composed of Dry, &lt;a href="https://rom-rb.org"&gt;Rom&lt;/a&gt;, and Roda. This was exactly the experience I hoped for! We built great things, and I learnt so much along the way.&lt;/p&gt;
&lt;p&gt;A few years later, the Dry and Hanami teams joined together to build the next version of Hanami. This is where I’ve focused my energy since. I drove most of the development towards &lt;a href="/blog/2022/11/22/announcing-hanami-200"&gt;2.0&lt;/a&gt;, &lt;a href="/blog/2024/02/27/hanami-210"&gt;2.1&lt;/a&gt; and &lt;a href="/blog/2024/11/05/hanami-220"&gt;2.2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m very proud of the experience we’ve created with Hanami. We provide essential diversity to the Ruby community. Today, anyone who reaches that same moment of &lt;em&gt;needing something different&lt;/em&gt; doesn’t need to feel like they’re in the wilderness, and possibly leave Ruby entirely. They now have an easy step to take: &lt;code&gt;gem install hanami&lt;/code&gt;. Within minutes they can be playing and learning.&lt;/p&gt;
&lt;h3&gt;
&lt;a href="#what-are-you-looking-forward-to-for-the-future" aria-hidden="true" class="anchor" id="what-are-you-looking-forward-to-for-the-future"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What are you looking forward to for the future?&lt;/h3&gt;
&lt;p&gt;I’m excited to set Hanami up for a successful second decade! We’ve spent years preparing a good foundation with version 2. Now we get to build upon it.&lt;/p&gt;
&lt;p&gt;In the near term, this means making &lt;a href="/blog/2024/12/10/state-of-hanami-december-2024"&gt;these goals&lt;/a&gt; happen: unify Hanami, Dry and Rom, help our users be more successful, and fundraise for sustainable maintenance. You’ve already seen the launch of our fundraising, and we’re already making big strides towards the others. I can’t wait to share more later this year.&lt;/p&gt;
&lt;p&gt;Together, these efforts will help us find our critical mass, across all parts of our community: users, contributors, and financial supporters. And the more people we bring together, the more their ideas and passion can help make Hanami (and Dry and Rom) better for everyone, all while having fun and learning along the way!&lt;/p&gt;
&lt;p&gt;Looking a little further ahead, there are a couple of other bits I’m particularly excited to drive: a first-class extensions API for Hanami, and the establishment of a clear and trustworthy governance structure for our projects.&lt;/p&gt;
&lt;p&gt;There’s lots to do, and it’s occasionally overwhelming, but I’m happy to be here. The future is bright!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#meet-sean" aria-hidden="true" class="anchor" id="meet-sean"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Meet Sean&lt;/h2&gt;
&lt;h3&gt;
&lt;a href="#tell-us-a-bit-about-yourself-1" aria-hidden="true" class="anchor" id="tell-us-a-bit-about-yourself-1"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Tell us a bit about yourself&lt;/h3&gt;
&lt;p&gt;I’m an &lt;a href="https://seancollins.tech/"&gt;independent contractor&lt;/a&gt; who lives in Denver, Colorado. I’ve been working with Ruby for over a dozen years. I’ve also done some purely functional programming with Elm. I’m interested in pragmatic software architecture, helping codebases stay healthy as they grow.&lt;/p&gt;
&lt;h3&gt;
&lt;a href="#whats-your-story-with-hanami-1" aria-hidden="true" class="anchor" id="whats-your-story-with-hanami-1"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What’s your story with Hanami&lt;/h3&gt;
&lt;p&gt;I moved to Colorado in 2015 and the timing was auspicious: Rocky Mountain Ruby took place shortly after I arrived. On the first day, I participated in a workshop about “Component-Based Rails Applications”, which used Rails Engines to split up large codebases. This was novel to me, managing scope and thinking about your dependencies from a higher level. I tried that approach on a couple projects but it was difficult: I was constantly fighting against the framework, and few gems supported Engines because they were used so rarely.&lt;/p&gt;
&lt;p&gt;A couple months later, at the Boulder Ruby meetup, a speaker mentioned a new Ruby web framework called “Lotus.” It supported modularity as a first-class feature. Beyond that, it broke things into more layers than Rails did, and encouraged writing small classes with limited responsibilities. This was exactly what I had been looking for! A more measured approach to writing large Ruby apps.&lt;/p&gt;
&lt;p&gt;I started contributing to the project: first documentation fixes, then with a generator. It was later renamed to Hanami and I joined the core team for the 1.0 launch. My level of involvement has fluctuated over the years, but I’ve been more involved again since early last year. I’m excited and energized by the community interest increasing as we are promoting &lt;a href="/sponsor"&gt;our sponsorship drive&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;
&lt;a href="#what-are-you-looking-forward-to-for-the-future-1" aria-hidden="true" class="anchor" id="what-are-you-looking-forward-to-for-the-future-1"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;What are you looking forward to for the future?&lt;/h3&gt;
&lt;p&gt;I’m excited about the potential that AI-assisted development holds for Hanami. I know this is controversial but I really think AI can help speed up Hanami’s adoption and reduce much of the friction users have faced in the past.&lt;/p&gt;
&lt;p&gt;In particular, AI can help us address some of the framework’s current challenges, while also amplifying its architectural strengths.&lt;/p&gt;
&lt;p&gt;Challenges, mitigated by AI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller knowledge base. There’s less information available on the web about Hanami than Rails: complete apps, blog posts, Stack Overflow questions, and more. This means there’s less training data available for LLMs to be aware of Hanami. However, Hanami’s simple APIs and more modular architecture means documentation and source code can be brought into the LLMs context window. That means you can ask questions and get tailored answers that apply to your specific project. That said, hallucinations are still a real concern, so AI isn’t a substitute for understanding the framework yourself. At best, it’s an accelerant and can help you find the documentation you need.&lt;/li&gt;
&lt;li&gt;Fewer third-party gems. Hanami has a smaller ecosystem of ready-made gems compared to Rails. Over the years, I’ve heard this as a sticking point for why people have trouble succeeding with Hanami. Now in the age of AI, many people are generating the code they used to pull in as a dependency, in the style that matches the rest of their codebase. You can generate bespoke code that you can bring into your codebase (after you review it!!) instead of adding a dependency.&lt;/li&gt;
&lt;li&gt;More boilerplate. Hanami encourages writing classes that are small, with a tight scope of responsibility. This means Hanami projects have more files and more code, requiring switching between files more. When you’re the one typing everything out, this can be annoying. When AI is writing and modifying the code, this is less of an issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Advantages in the AI era:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Functional, immutable style. Hanami enables and encourages a more functional and immutable style of writing Ruby. Instead of internal state determining behavior, code’s flow can often be inferred lexically, which makes it easier for LLMs (and humans) to reason about.&lt;/li&gt;
&lt;li&gt;Modularity with Slices. The framework’s architectural boundaries (via Slices) reduce cross-cutting concerns, making it easier for different humans and AI agents to work in parallel without unintended side effects. Agents can be made to ignore everything but the Slice they’re working on (and its dependencies), to keep them focused on the code that matters.&lt;/li&gt;
&lt;li&gt;Explicitness and structure. Hanami leans towards being explicit, instead of adding a lot of implicit ‘magic’ behind-the-scenes. This is similar to Python and Django, which LLMs tend to perform well with. That explicitness pays dividends in both AI-generated and human-reviewed code. It also has a cost, with more lines of code, but when those lines are written by the computer, they’re less costly to write (though still need to be reviewed carefully).&lt;/li&gt;
&lt;li&gt;Scalability of complexity. As individual developers become more productive with AI, the ability to manage complexity becomes more important. If developers start reliably writing 10 times more code, then codebases will naturally grow much faster. Hanami’s modularity and built-in tools for architecting large codebases will be invaluable in those situations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking ahead, I also see opportunities where we can leverage AI to help us audit, fix, and maintain our documentation. This could free us up to work on other activities, and increase the quality of our documentation.&lt;/p&gt;
&lt;p&gt;To be clear: we’re not at the point where AI agents can write Hanami apps as well as they can write Rails apps. Rails has been more exposed to the world, so LLMs have “seen” it more. But I believe we can close that gap to make Hanami a fully viable alternative to Rails. Beyond that, I can imagine a future where Hanami’s modularity, explicitness, and functional/immutable style help it become the preferred framework for writing Ruby apps.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#sponsorship-updates" aria-hidden="true" class="anchor" id="sponsorship-updates"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Sponsorship updates&lt;/h2&gt;
&lt;p&gt;(What is all of this? &lt;a href="/sponsor"&gt;Read our sponsorhip site to learn more.&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Since &lt;a href="/blog/2025/06/20/field-report-from-riga-and-the-rooftop"&gt;week 3&lt;/a&gt;, we’ve had one new person become a community patron and support our work on Hanami, Dry and Rom. Thank you very much, &lt;a href="https://github.com/mathewdbutton"&gt;Mathew Button&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Bit by bit, we get closer. If you’re a human being who cares about a diverse, thriving Ruby, we’d love for you to join Matthew and &lt;a href="https://github.com/sponsors/hanami"&gt;all our community patrons&lt;/a&gt;. And if you’re a collection of human beings in a business, we’d love to hear from you too!&lt;/p&gt;
&lt;p&gt;As of this week, we’re still sitting at $27.5k:&lt;/p&gt;
&lt;p&gt;🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;$27.5k of $70k&lt;/strong&gt; — 39% to our goal…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Next week, I think it’s time I address the 800-pound elephant in the room. I’ll see you then.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Field report from Riga and the Rooftop</title>
    <link rel="alternate" href="https://hanakai.org/blog/2025/06/20/field-report-from-riga-and-the-rooftop"/>
    <id>https://hanakai.org/blog/2025/06/20/field-report-from-riga-and-the-rooftop</id>
    <published>2025-06-20T13:30:00+00:00</published>
    <updated>2025-06-20T13:30:00+00:00</updated>
    <author>
      <name>Tim Riley</name>
    </author>
    <content type="html">&lt;p&gt;It’s week 3 of our &lt;a href="/blog/2025/06/03/become-a-hanami-dry-and-rom-patron"&gt;sponsorship drive&lt;/a&gt;! This week is a special one, because I’ve been out in the commuity, and I have a field report to share!&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#tim-on-rooftop-ruby" aria-hidden="true" class="anchor" id="tim-on-rooftop-ruby"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Tim on Rooftop Ruby&lt;/h2&gt;
&lt;p&gt;Earlier this month I had the pleasure of sitting down &lt;a href="https://www.rooftopruby.com/2108545/episodes/17321855-44-hanami-and-chippy-buddies-with-tim-riley"&gt;for a proper chat&lt;/a&gt; (not just &lt;a href="https://www.rooftopruby.com/2108545/episodes/16928379-41-there-s-no-r-in-naur"&gt;a cameo&lt;/a&gt;) with my friends Collin and Joel on &lt;a href="https://www.rooftopruby.com/2108545"&gt;Rooftop Ruby&lt;/a&gt;. It was a wide-ranging affair, featuring not just the usual serving of English &lt;em&gt;gastronomy&lt;/em&gt;, but also the hows and whys behind our sponsorship drive, and where we might take things in the future. It was a good one. &lt;a href="https://www.rooftopruby.com/2108545/episodes/17321855-44-hanami-and-chippy-buddies-with-tim-riley"&gt;&lt;strong&gt;Listen now!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Huge thanks to Collin and Joel for making this happen. I had very limited time to squeeze in this recording, and they were extremely accommodating.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#hanami-on-the-baltic-shore" aria-hidden="true" class="anchor" id="hanami-on-the-baltic-shore"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Hanami on the Baltic shore&lt;/h2&gt;
&lt;p&gt;Last week I had another fun Ruby experience, travelling all the way from Australia to Latvia to attend the wonderful &lt;a href="https://balticruby.org"&gt;Baltic Ruby&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;We had a couple of Hanami events at the conference. The first was part of Baltic Ruby’s &lt;em&gt;OSS Expo&lt;/em&gt;, an unstructured afternoon where conference-goers and open source groups can come together. In our case, we had multiple folks try Hanami for the first time (and even fix some documentation bugs), fellow contributor &lt;a href="https://github.com/krzykamil"&gt;Krzysztof Piotrowski&lt;/a&gt; continue his work on a &lt;code&gt;db rollback&lt;/code&gt; command, and &lt;a href="https://ismaelcelis.com"&gt;Ismael Celis&lt;/a&gt; created &lt;a href="https://bsky.app/profile/ismaelcelis.com/post/3lrj5ltfvlc2a"&gt;the world’s first event-sourced calculator on Hanami&lt;/a&gt;. &lt;em&gt;No notes.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:af5ndzzxe7p5vbpmotcxmt6n/app.bsky.feed.post/3lrj5ltfvlc2a" data-bluesky-cid="bafyreid5smcxf3urush7pb2xt4jf74jcnodqakqju5qmxypjicqehurvlm" data-bluesky-embed-color-mode="system"&gt;
&lt;p lang="en"&gt;Today at @balticruby.bsky.social I built what I think is the first ever event-sourced calculator built in Hanami, with @timriley.info 's help. No notes.&lt;br&gt;&lt;br&gt;&lt;a href="https://bsky.app/profile/did:plc:af5ndzzxe7p5vbpmotcxmt6n/post/3lrj5ltfvlc2a?ref_src=embed"&gt;[image or embed]&lt;/a&gt;&lt;/p&gt;— Ismael Celis (&lt;a href="https://bsky.app/profile/did:plc:af5ndzzxe7p5vbpmotcxmt6n?ref_src=embed"&gt;@ismaelcelis.com&lt;/a&gt;) &lt;a href="https://bsky.app/profile/did:plc:af5ndzzxe7p5vbpmotcxmt6n/post/3lrj5ltfvlc2a?ref_src=embed"&gt;Jun 13, 2025 at 10:17 pm&lt;/a&gt;
&lt;/blockquote&gt;&lt;script async src="https://embed.bsky.app/static/embed.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;We even had a familiar face stop by for a chat!&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/assets/2025-06-20-field-report-from-riga-and-the-rooftop/oss-expo.webp" alt="Matz joins the Hanami table at Baltic Ruby" title="Matz joins the Hanami table at Baltic Ruby" width="1600" height="1200"&gt;&lt;/p&gt;
&lt;p&gt;While not technically part of the OSS expo, during the conference we also found some help from friend-of-the-framework &lt;a href="https://www.headius.com"&gt;Charles Nutter&lt;/a&gt;! Charles reviewed the hanami/hanami test suite and helped identify &lt;a href="https://github.com/hanami/hanami/pull/1524"&gt;how we can get to green on JRuby&lt;/a&gt;. Thank you Charles for your help! I think Hanami on &lt;a href="https://www.jruby.org"&gt;JRuby&lt;/a&gt; could make for a formidable combo of performance and code clarity, and I’m excited to make this part of our standard offering.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#a-new-talk-from-tim" aria-hidden="true" class="anchor" id="a-new-talk-from-tim"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;A new talk from Tim&lt;/h2&gt;
&lt;p&gt;I had the honour of delivering Baltic Ruby’s closing keynote. This time I talked about my life with Ruby and how a “black sheep” feeling led to the Hanami, Dry and Rom we have today. I also publicly launched our sponsorship drive and shared a delicious teaser about one of the next steps for ecosystem.&lt;/p&gt;
&lt;blockquote class="mastodon-embed" data-embed-url="https://ruby.social/@marcoroth/114682136016966529/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0 0 20px; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"&gt; &lt;a href="https://ruby.social/@marcoroth/114682136016966529" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"&gt; &lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewbox="0 0 79 75"&gt;&lt;path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"&gt;&lt;/path&gt;&lt;/svg&gt; &lt;div style="color: #787588; margin-top: 16px;"&gt;Post by @marcoroth@ruby.social&lt;/div&gt; &lt;div style="font-weight: 500;"&gt;View on Mastodon&lt;/div&gt; &lt;/a&gt; &lt;/blockquote&gt; &lt;script data-allowed-prefixes="https://ruby.social/" async src="https://ruby.social/embed.js"&gt;&lt;/script&gt;
&lt;p&gt;The talk was titled &lt;em&gt;What I Talk About When I Talk About Ruby&lt;/em&gt;, and we had Haruki Murakami serve as both &lt;a href="https://en.wikipedia.org/wiki/What_I_Talk_About_When_I_Talk_About_Running"&gt;inspiration&lt;/a&gt; and spirit guide across the journey. This was another new narrative direction for me, after &lt;a href="https://www.rubyevents.org/talks/livin-la-vida-hanami"&gt;Ricky Martin&lt;/a&gt; and &lt;a href="https://www.rubyevents.org/talks/keynote-quest-of-the-rubyist-by-tim-riley"&gt;Ultima IV&lt;/a&gt;, and I think it turned out great. Thank you to &lt;a href="https://www.linkedin.com/in/sergyenko/"&gt;Sergey&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/krynitsky"&gt;Ali&lt;/a&gt; for the opportunity!&lt;/p&gt;
&lt;p&gt;In another first, this talk even had a &lt;em&gt;soundtrack&lt;/em&gt;, with sweeping musical accompaniment provided by the conference’s live band. Folks, this is why you go to in-person conferences.&lt;/p&gt;
&lt;p&gt;For the rest of you, &lt;a href="https://www.rubyevents.org/talks/keynote-what-i-talk-about-when-i-talk-about-ruby"&gt;the talk’s RubyEvents page&lt;/a&gt; is already up, and we’ll be sure to share this again once the video is live.&lt;/p&gt;
&lt;h2&gt;
&lt;a href="#sponsorship-updates" aria-hidden="true" class="anchor" id="sponsorship-updates"&gt;&lt;span aria-hidden="true" class="anchor"&gt;&lt;/span&gt;&lt;/a&gt;Sponsorship updates&lt;/h2&gt;
&lt;p&gt;(What is all of this? &lt;a href="https://sponsor.hanamirb.org"&gt;Read our sponsorhip site to learn more.&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;In the week since our &lt;a href="/blog/2025/06/11/hear-from-our-founding-patrons"&gt;last update&lt;/a&gt;, we’ve had one person become a community patron and support our work on Hanami, Dry and Rom. Thank you very much, &lt;a href="https://github.com/whysthatso"&gt;Andreas Wagner&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;This means we’re still sitting at $27.5k:&lt;/p&gt;
&lt;p&gt;🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;$27.5k of $70k&lt;/strong&gt; — 39% to our goal…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Our first milestone is $40k. That’s not far off! If we can find a couple more business patrons, and maybe a dozen or so community patrons, we’ll get there! I’m sure we can get there. Can you help us?&lt;/p&gt;</content>
  </entry>
</feed>
