Kemal 0.24.0 released!
Kemal is a Fast, Effective, Simple web framework written in Crystal.
Hello everyone,
Kemal 0.24.0 is here ![]()
This release brings support for Crystal 0.26.0 and adds new features. There are also some breaking changes.
New and Shiny Exception Page
Thanks to the awesome exception_page shard, we got a new and shiny exception page implemented by @mamantoha ![]()

Custom Port Bindings
You can now bind a single Kemal server to multiple ports. Thanks to @straight-shoota ![]()
Kemal.run do |config|
server = config.server.not_nil!
server.bind_tcp "127.0.0.1", 3000
server.bind_tcp "0.0.0.0", 3001
end
Breaking changes
- Removed
env.params.files. You can use Crystal’s built-inHTTP::FormData.parseinstead
post "/upload" do |env|
HTTP::FormData.parse(env.request) do |upload|
filename = file.filename
if !filename.is_a?(String)
"No filename included in upload"
else
file_path = ::File.join [Kemal.config.public_folder, "uploads/", filename]
File.open(file_path, "w") do |f|
IO.copy(file.tmpfile, f)
end
"Upload OK"
end
end
- From now on to access dynamic url params in a WebSocket route you have to use:
ws "/:id" do |socket, context|
id = context.ws_route_lookup.params["id"]
end
- Removed
_methodmagic param fromenv.params.body.
Thanks for using and supporting Kemal. You can check the full CHANGELOG here.
P.S: You can support Kemal development via Patreon ![]()
Happy Crystalling ![]()
