Let’s chat about the new release of Hanami 2.0 Web Framework and what you can use it for. Let's learn how you can start with it, and some examples from an application that is already making use of Hanami in production.
Hanami 2.0 and You
WNB.rb March 2023 Meetup
Continuing on our dry-rb journey
github.com/timriley github.com/solnic github.com/jodosha
All in dry-rb + Hanami
What is it?
Modern web framework for Ruby
- Focused on maintainability, testability, and scaling
- Create applications that are systems of well-formed components
with clear dependencies.
- Anyone work on a really big Rails app?
- Let’s dive in on what a Hanami project looks like, and it’s beneﬁts
Hanami 2.X != Hanami 1.X
Getting started project structure
Gemﬁle The application’s gem dependencies, installed using bundler.
Guardﬁle Supports code reloading in development.
README.md The application’s readme document.
Rakeﬁle Support for running rake tasks.
app/ This is the directory where you’ll put the majority of your application’s
conﬁg/ A directory for your application’s conﬁguration, including things like
routes, settings and Puma conﬁguration.
conﬁg.ru A Rack conﬁg ﬁle.
lib/ A directory for supporting code.
spec/ The application’s RSpec test suite.
Maintainability - Hanami Container
● Zeitwork for loading
● Code autoloading helps you work with minimal fuss
● Autoload not just application code but dependencies which means
faster boot times
○ Doesn’t have to eager load every constant ever at boot time…unlike Rails
● App core itself is special
○ Can use the app object itself to load and return any individual component
● Hanami console, like a supercharged Rails console
Helps remove rigid dependencies (so Sandi Metz approved ™)
- Dependency injection is easy
- include Deps["key"], the Deps mixin allows a component to use
any other component in its container as a dependency
- Easier to code up tests too! Just inject your mocks
Deps - friendly dependency injection helper
Deps code example
No dependency injection == tightly coupled
Using the Deps mixin, no attr_reader or initializer boilerplate needed
You don’t have to go
all in on Hanami…
Hanami-api HTTP framework
Extremely fast, lightweight Ruby framework for HTTP APIs
Ideal mini framework to build HTTP APIs and microservices
Want to try it for yourself?
Use the Getting Started guide or check
out Picnic, our example project
Scaling - Hanami Slices
Draw boundaries between its major areas of concern.
Built-in facility for organizing your code, encouraging maintainable
boundaries, and creating operational ﬂexibility.
Just like a miniature Hanami app in your Hanami app!
Slices == the way to keep your application from ballooning
Slices in action
● General-purpose framework for developing Command Line
Interface (CLI) applications
● Commands as objects that can be registered
Sometimes you want the DB helpers that rails has…
● Create Action
$ bundle exec hanami generate action
● Create Database Migration
$ bundle exec rake
● Create a whole app
$ hanami new picnic
● Or a smaller part of the app, a slice
$ hanami generate slice api
● And in the slice
$ hanami generate action food.show --slice api
My favorite things about Hanami
● Blazing fast console
● Slices can deploy out as their own containers (mini contained
● Great for APIs
● Deps really is a great way to make it easy to create reusable
components that are easy to test
● Dry::CLI is a joy to compose together developer centric tasks
Room for improvement with Hanami
● ROM is a learning curve vs
● Frontend integration is not
there yet…dry-view integration
is not available yet
● Dry-rb and understanding the
functional programming is still
necessary to get all the beneﬁts
Hanami in action
DRY::CLI + Hanami makes creating tools to help devs easy
Hanami in action
● No noticeable difference between brand new hanami app vs
Full app > < Example App
Hanami in action
- Build Time
- Averaging 5-6 minutes
- How it has sped up new
- Deployed 15 actions
spanning 3 different
- Test Time
- Running each slice full
test suite is quick
Who am I?
🌽 lifetime learner from Omaha, NE
📚 likes to read too much
🥙🍜🍛 eats food that probably took too long to prepare
Professionally solving problems on the Identity team at WP Engine
Thank you to my awesome teammates
For all you taught me about Hanami and vim (yes I can exit now)
Hanami Official Site: https://hanamirb.org/
Hanami 2.0 Announcement: https://hanamirb.org/blog/2022/11/22/announcing-hanami-200/
Introducing Hanami::API https://hanamirb.org/blog/2020/02/26/introducing-hanami-api/
Hanami API GitHub: https://github.com/hanami/api
Highlights of Hanami 2.0: https://discourse.hanamirb.org/t/highlights-of-hanami-2-0/728
Hanami 2.0 Guide: https://guides.hanamirb.org/v2.0/introduction/getting-started/
Hanami 2.0 Container and Components:
Hanami 2.0.3 Release: https://hanamirb.org/blog/2023/02/01/hanami-203/
Dry-rb Home: https://dry-rb.org/
Hanami Discourse: https://discourse.hanamirb.org/
Introducing dry-ﬁles: https://dry-rb.org/news/2021/05/04/introducing-dry-ﬁles/
Hanami 2.0 and You Slides: https://christine-seeman.com/2023-talks/