The biggest change in 1.5.0 is the asset pipeline: the old Yarn + Laravel Mix setup is deprecated in favor of a single Bun install that's faster, simpler, and drops NodeJS entirely. Plus, other new features like table partitioning, a new Redis extension for LuckyCache, per-action request body limits, security fixes, and more!
Lucky v1.5.0 is out, and it’s packed. The biggest change is a brand new asset pipeline built on top of Bun, replacing the Yarn and Laravel Mix setup we’ve shipped with since day one. Along with that, there’s a lot of exciting features and fixes to cover.
Read through the CHANGELOG for all of the changes and read below for a few highlights.
See the UPGRADE_NOTES.
You can also view the changes using LuckyDiff.
This is a massive change to the framework. Since the beginning, Lucky has shipped using Yarn with Laravel Mix
as the default asset manager and builder system. Back in 2017 this was a widely used workflow. But as many already
know, the Javascript ecosystem moves faster than anyone can keep up with. By 2026, we had so many options to choose
from that were easier to configure, and faster at building, it was difficult to decide which to use.
We originally wanted to build a pluggable system to allow you to decide which system you wanted, but that added so much extra complexity, and had the added downside of extra levels of testing and support. That option may be something we look at again in the future, but for now we wanted something we can easily support.
Bun was chosen because of its speed and simplicity. By using Bun, we no longer have a dependency on NodeJS, Yarn, or LaravelMix/Vite. It’s a single install that gives us full flexibility to use TypeScript, modern CSS, and still keep our Type-Safe asset handling with no additional plug-ins or dependencies. Assets now build in a fraction of the time, automatic browser reloading happens magically, and cache-buster fingerprints on production assets (including images, fonts, and more) all exist without the need for extra configuration.
This is just the start, but if there’s anything missing, take a look at Lucky.js and open an issue to discuss.
The release system has been fixed allowing us to release 1.5.0 to Scoop on Windows. With each release of Crystal and Lucky, native Windows support is getting better. Lucky is already fully usable on Windows, but in some cases, it can take a little extra work. The latest release moves us closer to a smooth out-of-the-box experience.
Our previous cookie encryption had a small bug that allowed, in a small number of cases, cookies to be decrypted by a 3rd party. This bug was fixed. However, it is considered a breaking change. Any cookie that was encrypted before Lucky 1.5.0 will fail to decrypt. To solve this, you will just need your users to generate new cookies.
@russ gave us a nice new feature with migrations allowing you to easily create a table partition.
Avram::Migrator::CreateTableStatement.new(:events).build do
add id : Int64
add type : Int32
add message : String
add_timestamps
composite_primary_key :id, :created_at
partition_by :created_at, type: :range
end
This allows you to start partitioning your tables by :range, :list, or :hash on
whichever column you’d like.
LuckyCache received a few updates for the first time in 3 years. A small memory leak was fixed as well as support for Arrays.
Along with that, a new LuckyCache::RedisStore shard was created by @rmarronnier as a plugin giving you a new place to store your cache.
require "lucky_cache_redis_store"
LuckyCache.configure do |settings|
settings.storage = LuckyCache::RedisStore.new(
Redis::Client.new(host: "localhost", port: 6379),
prefix: "myapp:cache:"
)
settings.default_duration = 5.minutes
end
Take a look at the RedisStore shard
Lucky has supported middleware that allows you to limit the maximum size of incoming requests for a few years. Thanks to @watzon, we now have a way to customize the limit on a per-action basis!
Maybe your global restriction is set to 10MB, but you have a specific endpoint where you need to allow larger uploads. In that case you can, increase the limit on that specific action.
class Api::Videos::Create < Lucky::Action
set_request_body_limit 100_000_000 # 100MB
post "/videos" do
# ...
json({result: "ok"})
end
end
I would like to shout-out @akadusei for the help and advice given during this release. They provide so many useful tools for the Lucky community through their business, GrottoPress.
I’d also love to give an extra special shout-out to @wout for all of the amazing work done on this release. Wout has been an integral part of this community by providing excellent shards such as Rosetta for language translations, and the new Latch for file uploads as well as all of the original work to integrate Vite and now Bun. Check out their venture Fluck.
And lastly, thanks to all of the other contributors who help to shape this framework and make it special.
If you haven’t already, give us a star on GitHub, and be sure to follow us on BlueSky.
Learn tips and tricks with LuckyCasts.
If you have any questions, or just want to chat, please join us on Discord.