# Hanami 3.0 released

**URL:** <https://discourse.hanakai.org/t/hanami-3-0-released/1496>\
**Category:** releases\
**Created:** [July 1, 2026, 1:19am UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496 "2026-07-01T01:19:54Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![hanakai-bot](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/hanakai-bot/32/1119_2.png) [@hanakai-bot](https://discourse.hanakai.org/u/hanakai-bot)\
**Post date:** [July 1, 2026, 1:19am UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/1 "2026-07-01T01:19:55Z")

</div>

## hanami 3.0

### Added

- Integrate hanami-mailer gem when bundled. ([@timriley](https://github.com/timriley) in [#1597](https://github.com/hanami/hanami/pull/1597), [#1600](https://github.com/hanami/hanami/pull/1600), [#1606](https://github.com/hanami/hanami/pull/1606), [#1609](https://github.com/hanami/hanami/pull/1609))

- Integrate i18n gem when bundled. ([@timriley](https://github.com/timriley) in [#1562](https://github.com/hanami/hanami/pull/1562), [#1589](https://github.com/hanami/hanami/pull/1589), [#1590](https://github.com/hanami/hanami/pull/1590), [#1591](https://github.com/hanami/hanami/pull/1591), [#1592](https://github.com/hanami/hanami/pull/1592), [#1593](https://github.com/hanami/hanami/pull/1593))

- Wrap the configured app logger with `Hanami::UniversalLogger`, to provide a consistent logging interface regardless of the underlying logger. The app can now be depended upon to support (1) structured logging via keyword args passed to log methods, and (2) tagged logging via `#tagged`. ([@timriley](https://github.com/timriley) in [#1567](https://github.com/hanami/hanami/pull/1567), [#1568](https://github.com/hanami/hanami/pull/1568), [#1608](https://github.com/hanami/hanami/pull/1608))

- Allow the built-in logger to be further configured in a `config/providers/logger.rb` provider file, useful for calling arbitrary methods on the logger, like adding backends. ([@timriley](https://github.com/timriley) in [#1608](https://github.com/hanami/hanami/pull/1608))

- Support `HANAMI_LOG_LEVEL` env var to set the log level (e.g. `HANAMI_LOG_LEVEL=warn bundle exec hanami server`). Takes precedence over `config.logger.level` set in `config/app.rb`. ([@cllns](https://github.com/cllns) in [#1580](https://github.com/hanami/hanami/pull/1580))

- Add `config.db.log_level` setting, for changing the log level for SQL logs. ([@katafrakt](https://github.com/katafrakt) in [#1587](https://github.com/hanami/hanami/pull/1587))

- New setting `:default_template_engine` that sets which template engine should be used by default when doing `hanami generate`. ([@katafrakt](https://github.com/katafrakt) in [#1564](https://github.com/hanami/hanami/pull/1564))

- Add `Hanami::Settings::CompositeStore`, which can be used to chain setting lookups from multiple stores. ([@aaronmallen](https://github.com/aaronmallen) in [#1572](https://github.com/hanami/hanami/pull/1572))

- Add `Hanami::Slice.with_slices`, returning the slice and all its nested slices. ([@timriley](https://github.com/timriley) in [#1604](https://github.com/hanami/hanami/pull/1604))

### Changed

- Default to memoizing all components, except in test env. Opt out for some or all components via `config.no_memoize`. ([@timriley](https://github.com/timriley) in [#1573](https://github.com/hanami/hanami/pull/1573), [#1599](https://github.com/hanami/hanami/pull/1599))
- Colorize logs by default in development env. ([@timriley](https://github.com/timriley) in [#1566](https://github.com/hanami/hanami/pull/1566))
- Emit structured log entries for SQL queries, formatted consistently with request logs. ([@timriley](https://github.com/timriley) in [#1569](https://github.com/hanami/hanami/pull/1569))
- Syntax highlight SQL in logs when the rouge gem is bundled. ([@timriley](https://github.com/timriley) in [#1570](https://github.com/hanami/hanami/pull/1570), [#1607](https://github.com/hanami/hanami/pull/1607))
- Colorize web request logs. ([@timriley](https://github.com/timriley) in [#1571](https://github.com/hanami/hanami/pull/1571))
- Change default log level for SQL (and other database) statements from `:info` to `:debug`. ([@katafrakt](https://github.com/katafrakt) in [#1595](https://github.com/hanami/hanami/pull/1595))
- Raise a helpful error message when the `Slice.call` Rack entrypoint is called and no routes are available. ([@sandbergja](https://github.com/sandbergja) in [#1586](https://github.com/hanami/hanami/pull/1586))
- Apply extensions to hanami-action gem rather than hanami-controller (which is now retired). ([@cllns](https://github.com/cllns) in [#1582](https://github.com/hanami/hanami/pull/1582))
- Redesign the new app welcome screen to match our new Hanakai visuals. ([@makenosound](https://github.com/makenosound) in [#1598](https://github.com/hanami/hanami/pull/1598))
- Require Ruby 3.3 or newer.

### Removed

- Remove default body parsing middleware. This functionality has moved into Hanami Action. ([@timriley](https://github.com/timriley) in [#1575](https://github.com/hanami/hanami/pull/1575))

[Compare v2.3.2 … v3.0.0](https://github.com/hanami/hanami/compare/v2.3.2...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:49pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/2 "2026-07-24T23:49:41Z")

</div>

## hanami-utils 3.0.0

### Changed

- Require Ruby 3.3 or newer.

[Compare v2.3.0 … v3.0.0](https://github.com/hanami/hanami-utils/compare/v2.3.0...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-utils/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:50pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/3 "2026-07-24T23:50:19Z")

</div>

## hanami-router 3.0.0

### Added

- Add `#permanent_redirect` and `#temporary_redirect` helpers for 301 and 302 responses. ([@cllns](https://github.com/cllns) in [#302](https://github.com/hanami/hanami-router/pull/302))

### Changed

- **BREAKING:** `#redirect` now requires an explicit `code:` argument. Use `#permanent_redirect` or `#temporary_redirect` for the common cases, and pass `code:` to `#redirect` for less common codes (e.g. `303`, `307`, `308`). ([@cllns](https://github.com/cllns) in [#302](https://github.com/hanami/hanami-router/pull/302))
- Upgrade mustermann to 3.1 and remove mustermann-contrib dependency. ([@rkh](https://github.com/rkh) in [#300](https://github.com/hanami/hanami-router/pull/300))
- Require Ruby 3.3 or newer.

### Fixed

- Only parse the request body into params when the content type is `application/x-www-form-urlencoded`. Previously, with no body parser middleware in use, posting a multipart upload (or other non-form body) could raise `Rack::QueryParser::InvalidParameterError`. ([@cllns](https://github.com/cllns) and [@timriley](https://github.com/timriley) in [#305](https://github.com/hanami/hanami-router/pull/305))
- Allow URL generation (via `#path`) to work with array variables. ([@inouire](https://github.com/inouire) in [#304](https://github.com/hanami/hanami-router/pull/304))

[Compare v2.3.1 … v3.0.0](http://github.com/hanami/hanami-router/compare/v2.3.1...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-router/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:51pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/4 "2026-07-24T23:51:01Z")

</div>

## hanami-view 3.0.0

### Added

- Track the currently-rendering template name. ([@timriley](https://github.com/timriley) in [#277](https://github.com/hanami/hanami-view/pull/277))

### Changed

- **BREAKING:** Default to undecorated exposures. ([@timriley](https://github.com/timriley) in [#274](https://github.com/hanami/hanami-view/pull/274))

- Cache the view’s resolved configuration as a frozen `Data` snapshot (via dry-configurable’s `#to_data`) at initialization, avoiding repeated config lookups on the rendering hot path for improved memory usage and speed. ([@cllns](https://github.com/cllns) in [#276](https://github.com/hanami/hanami-view/pull/276))

- Require Ruby 3.3 or newer.

### Fixed

- Allow the gem to be eager loaded by Zeitwerk when the optional haml and slim gems are not installed. ([@timriley](https://github.com/timriley) in [#279](https://github.com/hanami/hanami-view/pull/279))
- Use our own Haml template engine even when the haml gem is required before hanami-view. ([@timriley](https://github.com/timriley) in [#279](https://github.com/hanami/hanami-view/pull/279))

[Compare v2.3.1 … v3.0.0](https://github.com/hanami/view/compare/v2.3.1...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-view/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:51pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/5 "2026-07-24T23:51:36Z")

</div>

## hanami-action 3.0.0

### Added

- Parse request bodies based on formats config. ([@timriley](https://github.com/timriley) in [#500](https://github.com/hanami/hanami-action/pull/500), [#503](https://github.com/hanami/hanami-action/pull/503), [#511](https://github.com/hanami/hanami-action/pull/511), [#519](https://github.com/hanami/hanami-action/pull/519), [@cllns](https://github.com/cllns) in [#508](https://github.com/hanami/hanami-action/pull/508))

- Support additional `Cache-Control` directives in `response.cache_control`: `:immutable`, `:must_understand`, `stale_while_revalidate:` and `stale_if_error:`. ([@timriley](https://github.com/timriley) in [#522](https://github.com/hanami/hanami-action/pull/522))

- Full JRuby support. ([@katafrakt](https://github.com/katafrakt) in [#498](https://github.com/hanami/hanami-action/pull/498))

### Changed

- Renamed gem from hanami-controller to hanami-action. You should now `require "hanami-action"` or `require "hanami/action"`. ([@timriley](https://github.com/timriley) in [#507](https://github.com/hanami/hanami-action/pull/507), [@cllns](https://github.com/cllns) in [`df365b5`](https://github.com/hanami/hanami-action/commit/df365b5))

- Check for the dry-validation gem (instead of hanami-validations, which is now retired) before loading `Action.params` and `Action.contract` support. ([@timriley](https://github.com/timriley) in [#505](https://github.com/hanami/hanami-action/pull/505))

- Raise `ArgumentError` from `response.cache_control` for unknown directives, instead of silently dropping them. ([@timriley](https://github.com/timriley) in [#522](https://github.com/hanami/hanami-action/pull/522))

- Cache the action’s resolved configuration as a frozen `Data` snapshot (via dry-configurable’s `#to_data`) at initialization, avoiding repeated config lookups on the request hot path for improved memory usage and speed. Required bumping `dry-configurable` to `~> 1.4`. ([@cllns](https://github.com/cllns) in [#512](https://github.com/hanami/hanami-action/pull/512))

- Cut per-request allocations on the `Hanami::Action#call` hot path, roughly halving allocations and increasing throughput ~1.5–2.5x per action invocation. A minimal action drops from 51 to 16 allocations (69% fewer, 2.45x faster); an action with formats negotiating an `Accept` header drops from 95 to 61 allocations (36% fewer, 1.55x faster). ([@cllns](https://github.com/cllns) in [#514](https://github.com/hanami/hanami-action/pull/514))

- Require Ruby 3.3 or newer.

### Removed

- Removed deprecated format config methods: `Action.format`, `config.format`, `config.formats.add`, `config.formats.values`. ([@timriley](https://github.com/timriley) in [#504](https://github.com/hanami/hanami-action/pull/504))

- Removed `Hanami::Action::Params.params` and support for defining a contract by subclassing `Hanami::Action::Params`. If you are subclassing `Hanami::Action::Params`, take your params block and move it into a `Dry::Validation::Contract` subclass. Then pass this contract class to `Hanami::Action.params` or `Hanami::Action.contract`. ([@timriley](https://github.com/timriley) in [#513](https://github.com/hanami/hanami-action/pull/513))

## 

[Compare v2.3.2 … v3.0.0](https://github.com/hanami/hanami-action/compare/v2.3.2...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-action/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:52pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/6 "2026-07-24T23:52:08Z")

</div>

## hanami-mailer 3.0.0

### Changed

- Rewrite the gem. ([@timriley](https://github.com/timriley))
- Require Ruby 3.3 or newer.

[Compare v1.3.3 … v3.0.0](https://github.com/hanami/hanami-mailer/compare/v1.3.3...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-mailer/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:52pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/7 "2026-07-24T23:52:55Z")

</div>

## hanami-assets 3.0.0

### Added

- Add specification for compliant asset bundlers. ([@timriley](https://github.com/timriley) in [#150](https://github.com/hanami/hanami-assets/pull/150))

### Changed

- Require Ruby 3.3 or newer.

[Compare v2.3.0 … v3.0.0](https://github.com/hanami/assets/compare/v2.3.0...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-assets/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:53pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/8 "2026-07-24T23:53:18Z")

</div>

## hanami-assets 3.0.0 (npm)

## Added

- Detect newly added entry points while in watch mode. ([@timriley](https://github.com/timriley) in [#48](https://github.com/hanami/hanami-assets-js/pull/48))
- Detect changes to static files while in watch mode. ([@timriley](https://github.com/timriley) in [#46](https://github.com/hanami/hanami-assets-js/pull/46))

### Changed

- Skip `.DS_Store` files during build and watch. ([@kyleplump](https://github.com/kyleplump) in [#37](https://github.com/hanami/hanami-assets-js/pull/37))

- **Breaking:** Make esbuild a peer dependency. ([@timriley](https://github.com/timriley) in [#51](https://github.com/hanami/hanami-assets-js/pull/51))

- Bump minimum supported esbuild to `0.28.1`. ([@timriley](https://github.com/timriley) in [#51](https://github.com/hanami/hanami-assets-js/pull/51))

- Require Node.js v22 or newer. ([@timriley](https://github.com/timriley) in [#47](https://github.com/hanami/hanami-assets-js/pull/47))

[Compare v2.3.3 … v3.0.0](https://github.com/hanami/hanami-assets-js/compare/v2.3.3...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-assets-js/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:53pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/9 "2026-07-24T23:53:50Z")

</div>

## hanami-cli 3.0.0

### Added

- Include `hanami-mailer` in the default `Gemfile`, include sample mailer env vars in `.env`, and generate a base `Mailer` class for the app and each slice (`app/mailer.rb` and `mailer.rb` in slices). Use `hanami new --skip-mailer` to opt out. ([@timriley](https://github.com/timriley) in [#420](https://github.com/hanami/hanami-cli/pull/420), [#425](https://github.com/hanami/hanami-cli/pull/425))
- Add `generate mailer` command. ([@timriley](https://github.com/timriley) in [#426](https://github.com/hanami/hanami-cli/pull/426))
- Add `i18n` gem to the default `Gemfile`, and generate a placeholder `config/i18n/en.yml` for the app and each generated slice. ([@timriley](https://github.com/timriley) in [#409](https://github.com/hanami/hanami-cli/pull/409))
- Add `--name` option to `hanami new`, to specify a custom module namespace while using the positional argument as the directory path. For example, `hanami new my_bookshelf --name=bookshelf` creates the app in `my_bookshelf/` with `Bookshelf` as the module name. ([@aaronmallen](https://github.com/aaronmallen) in [#387](https://github.com/hanami/hanami-cli/pull/387))
- Add `--test` option to `hanami new` to specify which test framework to use. Supports `rspec` (default) and `minitest`. ([@timriley](https://github.com/timriley) in [#399](https://github.com/hanami/hanami-cli/pull/399))
- Add `generate provider` command. ([@timriley](https://github.com/timriley) in [#419](https://github.com/hanami/hanami-cli/pull/419))
- Add `--template-engine` option to `hanami generate` and `hanami new` to specify which template engine should be used for generated template files. Supports `erb`, `haml` and `slim`. ([@katafrakt](https://github.com/katafrakt) in [#280](https://github.com/hanami/hanami-cli/pull/280), [#389](https://github.com/hanami/hanami-cli/pull/389), [#390](https://github.com/hanami/hanami-cli/pull/390))
- Add `--force` option to all generators (except migration), which will override existing files instead of exiting early ([@katafrakt](https://github.com/katafrakt) in [#397](https://github.com/hanami/hanami-cli/pull/397))
- Add a `--skip-test-db` flag to `hanami db` commands. By default, running a `db` command in development also re-runs against the test database to keep the two in sync; passing `--skip-test-db` operates on the development database only. ([@adamlassek](https://github.com/adamlassek) in [#430](https://github.com/hanami/hanami-cli/pull/430))

### Changed

- In generated `Gemfile`, depend on dry-validation rather than hanami-validations. Hanami Validations will no longer be used; Hanami Action now checks for Dry Validation directly. ([@timriley](https://github.com/timriley) in [#401](https://github.com/hanami/hanami-cli/pull/401))
- In generated `package.json`, include `esbuild` as a direct dependency. `esbuild` is now a peer dependency of `hanami-assets`, which requires the app to depend on it directly. ([@timriley](https://github.com/timriley) in [#428](https://github.com/hanami/hanami-cli/pull/428))
- Check for the hanami-action gem rather than hanami-controller (now retired) across various commands. ([@cllns](https://github.com/cllns) in [#402](https://github.com/hanami/hanami-cli/pull/402))
- Include rouge gem in generated `Gemfile` to enable SQL syntax highlighting in logs. ([@kyleplump](https://github.com/kyleplump) in [#405](https://github.com/hanami/hanami-cli/pull/405))
- When `--gem-source=gem.coop` is used, Hanami and Dry gems are installed from their respective namespaces on gem.coop ([@katafrakt](https://github.com/katafrakt) in [#424](https://github.com/hanami/hanami-cli/pull/424))
- Require Puma 7.1 or later, and remove unneeded `preload_app!` in generated `config/puma.rb`. Preloading is now enabled by default in Puma’s cluster mode. ([@joshuay03](https://github.com/joshuay03) in [#372](https://github.com/hanami/hanami-cli/pull/372))
- In generated `.env`, include a link the guide explaining how these files are loaded. ([@timriley](https://github.com/timriley) in [#425](https://github.com/hanami/hanami-cli/pull/425))
- In generated files, update all [guides.hanamirb.org](http://guides.hanamirb.org) links to [hanakai.org](http://hanakai.org). ([@yosangwon](https://github.com/yosangwon) in [#407](https://github.com/hanami/hanami-cli/pull/407))
- Require dry-cli 1.4 or later, allowing for simplified argument handling in hanami-rspec callback methods. ([@timriley](https://github.com/timriley) in [#408](https://github.com/hanami/hanami-cli/pull/408))
- Link to new [hanakai.org](http://hanakai.org) site in generated `README.md`. ([@katafrakt](https://github.com/katafrakt) in [#423](https://github.com/hanami/hanami-cli/pull/423))
- Require Ruby 3.3 or newer.

### Fixed

- Skip generating duplicate routes when running `generate action`. ([@sandbergja](https://github.com/sandbergja) in [#417](https://github.com/hanami/hanami-cli/pull/417))
- Don’t overwrite libpq ENV vars with empty strings derived from certain DATABASE\_URLs. ([@StantonMatt](https://github.com/StantonMatt) in [#414](https://github.com/hanami/hanami-cli/pull/414))
- Remove duplicate text in `middleware` and `routes` command usage output. ([@katafrakt](https://github.com/katafrakt) in [#406](https://github.com/hanami/hanami-cli/pull/406))

[Compare v2.3.5 … v3.0.0](https://github.com/hanami/cli/compare/v2.3.5...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-cli/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:54pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/10 "2026-07-24T23:54:12Z")

</div>

## hanami-db 3.0.0

### Changed

- Require Ruby 3.3 or newer.

[Compare v2.3.0 … v3.0.0](https://github.com/hanami/hanami-db/compare/v2.3.0...3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-db/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:54pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/11 "2026-07-24T23:54:41Z")

</div>

## hanami-rspec 3.0.0

[View release on GitHub](https://github.com/hanami/hanami-rspec/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:55pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/12 "2026-07-24T23:55:06Z")

</div>

## hanami-minitest 3.0.0

### Added

- Create the gem. ([@timriley](https://github.com/timriley))

* * *

[View release on GitHub](https://github.com/hanami/hanami-minitest/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:55pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/13 "2026-07-24T23:55:26Z")

</div>

## hanami-webconsole 3.0.0

### Changed

- Update to binding\_of\_caller 2.0, which formally supports Ruby 4.0. Remove our internal workarounds for this. ([@rvmtz](https://github.com/rvmtz) in [#14](https://github.com/hanami/hanami-webconsole/pull/14))
- Require Ruby 3.3 or newer.

[Compare v2.3.3 … v3.0.0](https://github.com/hanami/hanami-webconsole/compare/v2.3.3...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-webconsole/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:55pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/14 "2026-07-24T23:55:55Z")

</div>

## hanami-reloader 3.0.0

### Changed

- Require Ruby 3.3 or newer.

[Compare v2.3.0 … v3.0.0](https://github.com/hanami/reloader/compare/v2.3.0...v3.0.0)

* * *

[View release on GitHub](https://github.com/hanami/hanami-reloader/releases/tag/v3.0.0)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:56pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/15 "2026-07-24T23:56:19Z")

</div>

## hanami-utils 3.0.1

### Changed

- Allow BigDecimal versions 3 or 4. ([@sandbergja](https://github.com/sandbergja) in [#419](https://github.com/hanami/hanami-utils/pull/419))

[Compare v3.0.0 … v3.0.1](https://github.com/hanami/hanami-utils/compare/v3.0.0...v3.0.1)

* * *

[View release on GitHub](https://github.com/hanami/hanami-utils/releases/tag/v3.0.1)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:56pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/16 "2026-07-24T23:56:42Z")

</div>

## hanami-action 3.0.1

Adding an improvement that was originally intended for 3.0.0.

### Added

- Support additional `Cache-Control` directives in `response.cache_control`: `:immutable`, `:must_understand`, `stale_while_revalidate:` (requires a duration) and `stale_if_error:` (requires a duration). ([@timriley](https://github.com/timriley) in [#522](https://github.com/hanami/hanami-action/pull/522))

### Changed

- `response.cache_control` raises `ArgumentError` for unknown directives instead of silently dropping them. ([@timriley](https://github.com/timriley) in [#522](https://github.com/hanami/hanami-action/pull/522))

[Compare v3.0.0 … v3.0.1](https://github.com/hanami/hanami-action/compare/v3.0.0...v3.0.1)

* * *

[View release on GitHub](https://github.com/hanami/hanami-action/releases/tag/v3.0.1)

---

<div class="post-metadata">

**Author:** ![timriley](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/timriley/32/621_2.png) [@timriley](https://discourse.hanakai.org/u/timriley)\
**Post date:** [July 24, 2026, 11:57pm UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/17 "2026-07-24T23:57:03Z")

</div>

## hanami 3.0.1

### Fixed

- Only configure template for mailer classes if hanami-view is bundled. ([@katafrakt](https://github.com/katafrakt) in [#1611](https://github.com/hanami/hanami/pull/1611))

[Compare v3.0.0 … v3.0.1](https://github.com/hanami/hanami/compare/v3.0.0...v3.0.1)

* * *

[View release on GitHub](https://github.com/hanami/hanami/releases/tag/v3.0.1)

---

<div class="post-metadata">

**Author:** ![hanakai-bot](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/hanakai-bot/32/1119_2.png) [@hanakai-bot](https://discourse.hanakai.org/u/hanakai-bot)\
**Post date:** [August 14, 2026, 6:08am UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/18 "2026-08-14T06:08:36Z")

</div>

## hanami-view 3.0.1

### Fixed

- Report the calling template as the current template name inside blocks passed to `render`, instead of the partial the block is yielded into. ([@timriley](https://github.com/timriley) in [#281](https://github.com/hanami/hanami-view/pull/281))

- Look up bare-named partials in the directory containing the template that renders them, instead of a same-named directory at the root. ([@timriley](https://github.com/timriley) in [#282](https://github.com/hanami/hanami-view/pull/282))

[Compare v3.0.0 … v3.0.1](https://github.com/hanami/view/compare/v3.0.0...v3.0.1)

* * *

[View release on GitHub](https://github.com/hanami/hanami-view/releases/tag/v3.0.1)

---

<div class="post-metadata">

**Author:** ![hanakai-bot](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/hanakai-bot/32/1119_2.png) [@hanakai-bot](https://discourse.hanakai.org/u/hanakai-bot)\
**Post date:** [August 21, 2026, 12:44am UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/19 "2026-08-21T00:44:26Z")

</div>

## hanami-view 3.0.2

### Fixed

- Ensure `Hanami::View::ERB::Engine` is still used for `.html.erb` templates with Tilt 2.9. ([@timriley](https://github.com/timriley) in [#284](https://github.com/hanami/hanami-view/pull/284))

[Compare v3.0.1 … v3.0.2](https://github.com/hanami/view/compare/v3.0.1...v3.0.2)

* * *

[View release on GitHub](https://github.com/hanami/hanami-view/releases/tag/v3.0.2)

---

<div class="post-metadata">

**Author:** ![hanakai-bot](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.hanakai.org/hanakai-bot/32/1119_2.png) [@hanakai-bot](https://discourse.hanakai.org/u/hanakai-bot)\
**Post date:** [August 21, 2026, 3:57am UTC](https://discourse.hanakai.org/t/hanami-3-0-released/1496/20 "2026-08-21T03:57:42Z")

</div>

## hanami 3.0.2

### Fixed

- Prefer response exposures over request params when preparing input for the view as part of an action auto-rendering. ([@timriley](https://github.com/timriley) in [#1620](https://github.com/hanami/hanami/pull/1620))

[Compare v3.0.1 … v3.0.2](https://github.com/hanami/hanami/compare/v3.0.1...v3.0.2)

* * *

[View release on GitHub](https://github.com/hanami/hanami/releases/tag/v3.0.2)
