Releases: bullet-train-co/bullet_train
v1.32.0
Possible Breaking Changes
Upgrade ruby 3.4.5 => 3.4.7
This release upgrades ruby to verison 3.4.7. You'll need to install it locally via whatever runtime manager you use (asdf is a good one if you're looking for recommendations) and then run bundle install to install all the gems for the new version.
Upgrade node 22.18.0 => 22.20.0
This release upgrades node to version 22.20.0. You'll need to install it locally via whatever runtime manager you use (asdf is a good one if you're looking for recommendations) and then do the following to install yarn and all the JS dependencies:
npm install -g yarn
corepack enable
yarn install
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [js] Update all Yarn dependencies (2025-10-16) by @depfu[bot] in #2251
- [ruby] Update all Bundler dependencies (2025-10-17) by @depfu[bot] in #2252
- [ruby] Update all Bundler dependencies (2025-10-18) by @depfu[bot] in #2253
- [ruby] Update all Bundler dependencies (2025-10-22) by @depfu[bot] in #2254
- [ruby] Update all Bundler dependencies (2025-10-23) by @depfu[bot] in #2256
- [js] Update all Yarn dependencies (2025-10-23) by @depfu[bot] in #2257
- [ruby] Update all Bundler dependencies (2025-10-24) by @depfu[bot] in #2258
- [ruby] Update all Bundler dependencies (2025-10-25) by @depfu[bot] in #2259
- [ruby] Update all Bundler dependencies (2025-10-26) by @depfu[bot] in #2260
- [ruby] Update all Bundler dependencies (2025-10-27) by @depfu[bot] in #2261
- Super scaffolding should generate code that passes standardrb by @jagthedrummer in #2262
- [js] Update Node.js 22.18.0 → 22.20.0 by @depfu[bot] in #2230
- [ruby] Update Ruby 3.4.5 → 3.4.7 by @depfu[bot] in #2247
- BT-Core version bump: - 1.32.0 by @jagthedrummer in #2263
Full Changelog: v1.31.0...v1.32.0
v1.31.0
New feature - Color scheme selector
We've added a new appearance switcher under the Account Details link in the User menu. This allows users to choose between "Always Light", "Always Dark", and "Same as System" to set their preference for light or dark mode.
By default the switcher will appear for users, and will default to "Same as System".
How to force one particular color scheme
If you want to remove the appearance switcher and force your app to use either light or dark mode you can edit config/initializers/theme.rb and set the force_color_scheme_to option.
# Force the color scheme to :light or :dark.
# Defaults to nil, which offers users the ability to choose their preference in Account Details.
BulletTrain::Themes::Light.force_color_scheme_to = :lightUpdate your custom CSS
If you have custom CSS that is responding to dark mode you should switch from using media queries to using a .dark class selector. The .dark class will be applied to the main <html> element if the user has selected dark mode, or if they have selected "Same as System" and the system is in dark mode, or if you have set force_color_scheme_to = :dark.
If your custom CSS has @media (prefers-color-scheme: dark) {} blocks, replace them with .dark { } nested blocks instead.
Update app/views/account/users/edit.html.erb
If you've ejected the main edit form for users, you'll need to add the appearance selector to that form. Between the profile form and the two factor authentication form you can add this block:
<% unless BulletTrain::Themes::Light.force_color_scheme_to.presence %>
<%= render 'account/shared/box', divider: true do |box| %>
<% box.t title: '.preferences.header', description: '.preferences.description' %>
<% box.body.render "account/users/color_form", user: @user %>
<% end %>
<% end %>Here's the corresponding update in the core repo.
Update app/views/themes/light/layouts/_head.html.erb
If you've ejected app/views/themes/light/layouts/_head.html.erb (NOT the default app/views/layouts/_head.html.erb that comes with the starter repo) you should update it to include the following reference:
<%= render 'shared/layouts/head/color_scheme_preference' unless BulletTrain::Themes::Light.force_color_scheme_to.presence %>Here's the corresponding update in the core repo.
Responding to dark mode changes in custom JavaScript
See the new docs for details about how to respond to color scheme changes in your JavaScript code.
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-10-15) by @depfu[bot] in #2248
- Theme config: add example property
force_color_scheme_toby @pascallaliberte in #2243 - Use
Gem::Specificationinstead of relying on shelling out tobundle showby @jagthedrummer in #2246 - BT-Core version bump: - 1.31.0 by @jagthedrummer in #2249
Full Changelog: v1.30.1...v1.31.0
v1.30.1
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-10-05) by @depfu[bot] in #2235
- [ruby] Update all Bundler dependencies (2025-10-07) by @depfu[bot] in #2236
- [ruby] Update all Bundler dependencies (2025-10-08) by @depfu[bot] in #2237
- [ruby] Update all Bundler dependencies (2025-10-09) by @depfu[bot] in #2238
- [ruby] Update all Bundler dependencies (2025-10-10) by @depfu[bot] in #2239
- [ruby] Update all Bundler dependencies (2025-10-11) by @depfu[bot] in #2240
- [ruby] Update all Bundler dependencies (2025-10-12) by @depfu[bot] in #2241
- [ruby] Update all Bundler dependencies (2025-10-13) by @depfu[bot] in #2242
- [ruby] Update all Bundler dependencies (2025-10-14) by @depfu[bot] in #2244
- Bump sha.js from 2.4.11 to 2.4.12 in /zapier by @dependabot[bot] in #2216
- BT-Core version bump: - 1.30.1 by @jagthedrummer in #2245
Full Changelog: v1.30.0...v1.30.1
v1.30.0
Potentially breaking change - Updated sortable_controller.js from bullet_train-sortable to no longer require dragula and jquery
We've updated sortable_controller.js to no longer require dragula and jquery. This eliminates dragula (which is largely abandoned) and 5 other sub-dependencies from yarn.lock (unfortunately we still use jquery in a couple of other places). The new controller also offers a better user experience by adding drag handles and improving the visual styling of dragged items.
If you're using a sortable model and haven't heavily customized the UI around it then things should Just Work. You should get drag handles added to your tables automatically by the controller. If you'd like to customize the handles you can add them to your templates. For details see the "Drag Handles" section at the bottom of the "Super Scaffolding with the --sortable option" page in the docs.
If you have heavily customized the sortable UI, or if you're relying heavily on the sortable:* events dispatched by the controller then you may have some breakage. There are two options for resolving the trouble.
-
Update your app to work with the new controller. - Check out the new docs for sortable models, especially the sections about "Events" and "Drag Handles", and update your app accordingly. Feel free to raise any troubles as GitHub issues and/or in Discord.
-
Continue to use the old
dragulabased controller. - We don't ship that controller anymore because doing so would prevent us from being able to removedragulaas a dependency. See the documentation for thedragulacontroller for full details. The short version is:- Add
dragulaandjqueryto your app:yarn add dragula jquery - Copy the old controller into your app at
app/javascript/controllers/dragule-sortable_controller.js. - Update
app/views/account/*/_index.html.erband change instances ofdata-controller="sortable"to bedata-controller="dragula-sortable". If you're responding to any of the events emitted by the controller they will also need to be changed fromsortabletodragula-sortable.
- Add
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- fix small SETUP_GITHUB issue by @grymoire7 in #2200
- Update all Bundler dependencies (2025-09-13) by @depfu[bot] in #2201
- [ruby] Update all Bundler dependencies (2025-09-14) by @depfu[bot] in #2202
- [ruby] Update all Bundler dependencies (2025-09-15) by @depfu[bot] in #2203
- [ruby] Update all Bundler dependencies (2025-09-16) by @depfu[bot] in #2204
- [ruby] Update all Bundler dependencies (2025-09-17) by @depfu[bot] in #2206
- [js] Update all Yarn dependencies (2025-09-19) by @depfu[bot] in #2210
- [ruby] Update all Bundler dependencies (2025-09-19) by @depfu[bot] in #2211
- [ruby] Update all Bundler dependencies (2025-09-20) by @depfu[bot] in #2212
- [js] Update all Yarn dependencies (2025-09-21) by @depfu[bot] in #2215
- [ruby] Update all Bundler dependencies (2025-09-22) by @depfu[bot] in #2217
- [ruby] Update all Bundler dependencies (2025-09-23) by @depfu[bot] in #2218
- [js] Update all Yarn dependencies (2025-09-24) by @depfu[bot] in #2220
- [ruby] Update all Bundler dependencies (2025-09-24) by @depfu[bot] in #2221
- [js] Update all Yarn dependencies (2025-09-26) by @depfu[bot] in #2223
- [ruby] Update all Bundler dependencies (2025-09-27) by @depfu[bot] in #2224
- [js] Update all Yarn dependencies (2025-09-28) by @depfu[bot] in #2225
- [ruby] Update all Bundler dependencies (2025-09-29) by @depfu[bot] in #2226
- [ruby] Update all Bundler dependencies (2025-09-30) by @depfu[bot] in #2227
- [ruby] Update all Bundler dependencies (2025-10-01) by @depfu[bot] in #2229
- [ruby] Update all Bundler dependencies (2025-10-02) by @depfu[bot] in #2231
- Run
corepack enableas part of the setup script by @jagthedrummer in #2232 - Remove
dragulaas an application dependency by @jagthedrummer in #2228 - BT-Core version bump: - 1.30.0 by @jagthedrummer in #2234
New Contributors
- @grymoire7 made their first contribution in #2200
Full Changelog: v1.29.0...v1.30.0
v1.29.0
Potentially breaking change - upgrade puma to 7.0.0
See the puma release notes for details.
Potentially breaking change - replace sprockets-rails with propshaft
This release removes sprockets-rails and replaces it with propshaft, the new iteration of the Rails assets pipeline. This is a necessary stepping-stone in making the transition to using importmaps for easier asset deployment.
Things to know about this change
The biggest things to know about the move to propshaft are:
- Replace asset helpers in CSS (like
asset_pathetc...) with standardurl()references css.erbandjs.erbfiles will not be processed byerb- Assets will not be gzipped
Keep reading for additional details about each of these items.
See the propshaft migration docs for more info about this change and/or check out the propshaft PR for a deep dive into the differences between files produced by propshaft vs sprockets.
Replace asset helpers with standard url() references.
The biggest change is that asset helpers (like asset_path, asset_url, image_url, etc.) are no longer needed. Instead you can use url and pass an absolute path to the asset in question. It will automatically be fingerprinted by propshaft.
- background: image_url('hero.jpg');
+ background: url('/hero.jpg');css.erb and js.erb files will not be processed by erb
propshaft is a simpler pipeline than sprockets and it does not come with erb processing.
If you were using erb processing to reference fonts like this:
src: url("<%= font_path('your-custom-font.woff2') %>")Then you can just use url directly like this instead:
src: url('/assets/fonts/your-custom-font.woff2')After replacing any erb tags you should rename any .css.erb or .js.erb files to just .css or .js to avoid confusion.
If you're doing other "ruby stuff" within the erb blocks of those files you'll need to move that stuff into a <style> or <script> tag within an html.erb template.
Assets will not be gzipped
Previously sprockets would automatically produce gzipped versions of all compressible assets. Many webservers/CDNs can dynamically compress assets as they're being served, so this may not be an issue.
If you need your assets to be compressed you can add the propshaft-compressor gem to your Gemfile. (We're not including this gem by default to keep our dependencies as small and simple as possible.)
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-08-22) by @depfu[bot] in #2180
- [ruby] Update all Bundler dependencies (2025-08-26) by @depfu[bot] in #2181
- [ruby] Update all Bundler dependencies (2025-08-28) by @depfu[bot] in #2182
- Update the gitpod Dockerfile ruby version by @jagthedrummer in #2183
- Remove
bundle execwhen callingovermindby @jagthedrummer in #2184 - [ruby] Update all Bundler dependencies (2025-08-29) by @depfu[bot] in #2185
- [ruby] Update all Bundler dependencies (2025-08-31) by @depfu[bot] in #2186
- [ruby] Update all Bundler dependencies (2025-09-01) by @depfu[bot] in #2187
- [ruby] Update all Bundler dependencies (2025-09-02) by @depfu[bot] in #2188
- Quieter CI by @jagthedrummer in #2191
- [ruby] Update all Bundler dependencies (2025-09-03) by @depfu[bot] in #2192
- [ruby] Update all Bundler dependencies (2025-09-04) by @depfu[bot] in #2194
- [ruby] Update puma 6.6.1 → 7.0.0 (major) by @depfu[bot] in #2195
- Replace
sprockets-railswithpropshaftby @jagthedrummer in #1910 - Temporary fix for the release process by @jagthedrummer in #2197
- BT-Core version bump: - 1.29.0 by @jagthedrummer in #2198
Full Changelog: v1.28.0...v1.29.0
v1.28.0
New Feature / Potentially Breaking Change - Docker!
We've added a Dockerfile and a dev.Dockerfile that take advantage of some official bullet_train Docker images that we've begun to publish. If you already have a Dockerfile or dev.Dockerfile in your app you'll want to pay attention to this upgrade to make sure it doesn't clobber anything for you. See the Bullet Train Docker documentation for more information.
After updating you should either run bin/configure-scripts/update_configs.rb to update the included convenience scripts in bin/docker-dev to use your application name instead of untitled_application, or you can make those changes manually if you'd rather.
This is our first pass at adding official Docker support, and it's unlikely that we got everything perfect, so please let us know how it goes for you and help us smooth off the rough edges.
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-08-21) by @depfu[bot] in #2177
- Add a
Dockerfileanddev.Dockerfilethat uses BT images by @jagthedrummer in #2102 - BT-Core version bump: - 1.28.0 by @jagthedrummer in #2178
Full Changelog: v1.27.0...v1.28.0
v1.27.0
Possible Breaking Changes
Upgrade ruby 3.4.4 => 3.4.5
This release upgrades ruby to verison 3.4.5. You'll need to install it locally via whatever runtime manager you use (asdf is a good one if you're looking for recommendations) and then run bundle install to install all the gems for the new version.
Upgrade node 22.16.0 => 22.18.0
This release upgrades node to version 22.18.0. You'll need to install it locally via whatever runtime manager you use (asdf is a good one if you're looking for recommendations) and then do the following to install yarn and all the JS dependencies:
npm install -g yarn
corepack enable
yarn install
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-07-31) by @depfu[bot] in #2158
- Pin @redocly/cli to the 1.x line by @jagthedrummer in #2161
- [ruby] Update all Bundler dependencies (2025-08-02) by @depfu[bot] in #2162
- [ruby] Update all Bundler dependencies (2025-08-04) by @depfu[bot] in #2163
- [ruby] Update all Bundler dependencies (2025-08-05) by @depfu[bot] in #2166
- 🚨 [security] [ruby] Update rails 8.0.2 → 8.0.2.1 (minor) by @depfu[bot] in #2172
- [js] Update all Yarn dependencies (2025-08-14) by @depfu[bot] in #2173
- [js] Update all Yarn dependencies (2025-08-15) by @depfu[bot] in #2174
- Fix invitation test class names by @pascallaliberte in #2165
- [ruby] Update all Bundler dependencies (2025-08-19) by @depfu[bot] in #2167
- [js] Update Node.js 22.16.0 → 22.18.0 by @depfu[bot] in #2169
- [ruby] Update Ruby 3.4.4 → 3.4.5 by @depfu[bot] in #2151
- BT-Core version bump: - 1.27.0 by @jagthedrummer in #2175
Full Changelog: v1.26.1...v1.27.0
v1.26.1
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-07-15) by @depfu[bot] in #2143
- [ruby] Update all Bundler dependencies (2025-07-16) by @depfu[bot] in #2145
- [ruby] Update all Bundler dependencies (2025-07-17) by @depfu[bot] in #2146
- [ruby] Update all Bundler dependencies (2025-07-18) by @depfu[bot] in #2147
- [ruby] Update all Bundler dependencies (2025-07-19) by @depfu[bot] in #2148
- [ruby] Update all Bundler dependencies (2025-07-21) by @depfu[bot] in #2149
- [js] Update all Yarn dependencies (2025-07-21) by @depfu[bot] in #2150
- [js] Update all Yarn dependencies (2025-07-24) by @depfu[bot] in #2155
- [ruby] Update all Bundler dependencies (2025-07-23) by @depfu[bot] in #2154
- [ruby] Update all Bundler dependencies (2025-07-29) by @depfu[bot] in #2157
- BT-Core version bump: - 1.26.1 by @jagthedrummer in #2159
Full Changelog: v1.26.0...v1.26.1
v1.26.0
New feature: Webhook Deactivation System
1.26.0 introduces a new feature for deactivating webhooks that have been failing consistently. This feature is disabled by default. There are some lines in config/environments/development.rb and config/environments/production.rb that you can uncomment and customize in order to activate the feature.
NOTE: This features requires some database migrations to the webhooks_outgoing_endpoints, webhooks_outgoing_deliveries, and webhooks_outgoing_delivery_attempts tables. If your app is particularly large or busy some of these tables may be very large and the migrations may take a while to run. You may want to do a test on a similarly sized database to see if you need to handle these migrations in a different way than normal.
See the "Endpoint Deactivation" section of the Outgoing Webhooks documentation for additional details.
What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- [ruby] Update all Bundler dependencies (2025-07-03) by @depfu[bot] in #2136
- [ruby] Update all Bundler dependencies (2025-07-04) by @depfu[bot] in #2137
- [ruby] Update all Bundler dependencies (2025-07-05) by @depfu[bot] in #2138
- [ruby] Update all Bundler dependencies (2025-07-07) by @depfu[bot] in #2139
- [js] Update all Yarn dependencies (2025-07-09) by @depfu[bot] in #2140
- Webhook deactivation system by @Riddlerrr in #2114
- BT-Core version bump: - 1.26.0 by @jagthedrummer in #2142
New Contributors
- @Riddlerrr made their first contribution in #2114
Full Changelog: v1.25.1...v1.26.0
v1.25.1
New feature - Outgoing Webhook Signatures
Note
The new webhook signature feature was added in 1.25.0 but we're duplicating mention of it here since 1.25.1 was released so closely to 1.25.0. Many people may go directly to 1.25.1 and we want to highlight this new feature. The only change in 1.25.1 is the addition of a link to the documentation about webhook security.
The 1.25.0 release adds a new security feature to Outgoing Webhooks. Now they will include a few additional headers in the outgoing HTTP request. See the "Security" section of the Incoming Webhook docs for more details.
When upgrading your app you'll see some lines like this added to config/environments/development.rb, config/environments/production.rb, and config/environments/test.rb:
config.outgoing_webhooks[:webhook_headers_namespace] = "X-Webhook-Untitled-Application"You should update them to use the name of your application instead of Untitled-Application:
config.outgoing_webhooks[:webhook_headers_namespace] = "X-Webhook-Your-App-Name"What's changed in bullet_train-core
Also check the corresponding release for the bullet_train-core repo:
https://github.com/bullet-train-co/bullet_train-core/releases
What's Changed
- BT-Core version bump: - 1.25.1 by @jagthedrummer in #2135
Full Changelog: v1.25.0...v1.25.1

