Micro-slices in Hanami
by Paweł Świątkowski
29 Jul 2025
Slices are my favourite architectural feature in Hanami. They allude to the vertical slices architecture and let you host cross-functional “mini-apps” within your main Hanami projectThe feature itself is present from early days of Hanami, perhaps from the times when it was still called Lotus. Back then it was called apps
..
A typical slice file structure (generated by Hanami slice generator) would look like this:
slices
└── admin
├── action.rb
├── actions
├── assets
│ ├── css
│ │ └── app.css
│ ├── images
│ │ └── favicon.ico
│ └── js
│ └── app.js
├── db
│ ├── relation.rb
│ ├── repo.rb
│ └── struct.rb
├── operation.rb
├── relations
├── repos
├── structs
├── templates
│ └── layouts
│ └── app.html.erb
├── view.rb
└── views
└── helpers.rb
14 directories, 11 files
This is a great foundation to build a comprehensive, large slice, such as an admin panel. However, it feels a bit overwhelming for smaller-scope things.
Yesterday, while spelunking through Hanami internals, looking for a way to distribute a slice as a gemUnfortunately, I think it’s not easily done right now., I stumbled upon another way to define a slice. It is not described in the Guides, but is documented in the code - so I treat it as official.
The trick is this:
- Drop a file into
config/slices
(a directory that doesn’t exist in a stock Hanami app) - That’s it. No subdirectory army required.
Let’s build one.
The tutorial part
We will start by creating a new Hanami app and creating a dir and a file.
hanami new myapp
cd myapp
mkdir config/slices
touch config/slices/healthcheck.rb
Now we will put an ultra-simple slice inside:
module Healthcheck
class Slice < Hanami::Slice
end
class Routes < Hanami::Routes
get "/", to: ->(_env) { [200,
{"Content-Type" => "application/json"},
['{"status": "ok"}']] }
end
end
Finally, we mount this in our main app, in config/routes.rb
:
module Myapp
class Routes < Hanami::Routes
slice :healthcheck, at: "/health"
end
end
Now if we start the app, we can check that it works:
$ curl -i localhost:2300/health
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 16
{"status": "ok"}
Our micro-slice is up and running.
Why reach for micro-slices
As shown above, this is a great way to create a very focused, small slice, without all the ceremony of creating a directory in the slices
directory. It might be useful if you mainly organize the slices by domain boundaries, but still need a couple of “technical” (non-domain) ones, for example to expose some metrics or to have an admin dashboard.
In absence of a good way to have externally packaged slices supported in Hanami… yet. I would like, at some point, to find time to try to solve this., it might pave the way to ship a “slice builder” in a gem.
Imagine shipping an “admin slice DSL” from a gem.
# config/slices/admin.rb
module Admin
extend GemifiedAdminPanelSliceBuilder
admin do
section "E-Commerce" do
page "Orders", schema: ECommerce::Schemas::Order
page "Products", schema: ECommerce::Schemas::Product
page "Shipping methods", schema: ECommerce::Schemas::ShippingMethod
end
end
end
The gem isn’t the admin slice — it just gives you a way to build one. This is still day-dreaming, but micro-slices show a legit path towards this goal.
Meanwhile, we can all enjoy our micro-slices, if needed.