Bootstrap 6 Alpha 1 ships with a browser floor that will make developers wince
Bootstrap's first alpha of a full overhaul is out, and it stops supporting browsers you've been using for years.
Mark Otto has announced the first alpha release of Bootstrap 6.0.0 today. It's the first alpha of what the project calls a complete redesign built around Sass modules, native browser APIs, ESM-only JavaScript, and modern CSS. Install command as you'd expect.
npm i bootstrap@6.0.0-alpha.1
If you haven't run the migration guide yet, you probably should before touching a production build.
A browser floor that separates 2025 from 2022
The part that'll draw the most heat is the new minimum versions. Bootstrap 5 targets Chrome and Edge 60, Firefox 60, and Safari 12. Bootstrap 6 pushes those to Chrome and Edge 130+, Firefox 132+, and Safari 18+.
That's roughly a half-decade gap on Chrome.
No fallbacks. No prefixes. No polyfills below that floor. Bootstrap 6 leans on light-dark(), :has(), container queries, oklch(), color-mix(), and the native <dialog> element instead. It'll also ship a v7 sooner than past major releases, since features like CSS Anchor Positioning and full "pretty text" aren't ready yet.
It's a bold call for a system with 1.75 billion installs since 2011. You don't get there without leaving older browsers behind.
For the record, the project notes that co-maintainer Julien Deramond is departing after years on the team. The v6 branch itself drew from about 19 named contributors plus the wider community. Bootstrap 5 stays supported until an end-of-life date is announced, and v5.4.0 ships first.
Everything else is moving
Customization now flows through CSS variables living in "token maps." Nearly every Sass variable from Bootstrap 5 is now a token. The old @import is gone, replaced by the @use and @forward module system. defaults() merges instead of replacing, so you only redeclare what actually changes.
Next comes the class naming. Bootstrap 5 infixes like .d-md-none become Tailwind-style prefixes like .md:d-none. The pattern holds across grid, state variants, gutters, containers, and drawers.
Careful with one detail. The prefix doesn't tell you which kind of query you're getting. Utilities and grid use viewport queries, but stacks, CSS Grid columns, and navbar expansion use container queries. Assume the wrong one and your layouts will break.
The JavaScript side gets a rougher deal. There's no UMD bundle anymore and no window.bootstrap global. Your <script> tags need type="module", CommonJS require() calls have to migrate, and jQuery support is dead. The source is now TypeScript with declarations built into the package, so you can delete @types/bootstrap. show() and hide() now return promises, which means await finally replaces the old shown.bs.* event dance.
Components are where it gets visible. Modal becomes Dialog, built on native <dialog>. Offcanvas becomes Drawer. Dropdown becomes Menu. Accordion now runs on <details> and <summary>, so basic open and close needs no JavaScript at all.
Buttons dropped their old names too. .btn-primary is now class="btn-solid theme-primary", which reads as more ceremony than most folks want.
There's a long list of new pieces as well: Stepper, Avatar, Chip input, OTP input, password strength, combobox, and Prose among them.
For what it's worth, the practical hit is probably the prefix system and the ESM-only JavaScript, both of which break code in ways that aren't always obvious from a migration guide.
The direction is defensible though. Dropping polyfills and leaning on native APIs cuts a meaningful chunk of shipped bytes. The question is whether the floor jump forces too many upgrades at once.
Bootstrap 6 Alpha 1 is installable now. The full migration guide and a v5-to-v6 skill for coding agents sit in the project's docs. Head here to get started.
