<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://bridgetownrb.com/" version="1.3.4">Bridgetown</generator><link href="https://www.bridgetownrb.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.bridgetownrb.com/" rel="alternate" type="text/html" /><updated>2025-09-16T10:56:22-07:00</updated><id>https://www.bridgetownrb.com/feed.xml</id><title type="html">Bridgetown [v1]</title><subtitle>Bridgetown is a next-generation, progressive site generator &amp; fullstack framework, powered by Ruby.</subtitle><entry><title type="html">Bridgetown, the Hybrid Ruby Web Framework, Turns Five Today</title><link href="https://www.bridgetownrb.com/news/bridgetown-turns-five-today/" rel="alternate" type="text/html" title="Bridgetown, the Hybrid Ruby Web Framework, Turns Five Today" /><published>2025-04-02T16:18:11-07:00</published><updated>2025-04-02T16:18:11-07:00</updated><id>repo://posts.collection/_posts/2025/2025-04-02-bridgetown-turns-five-today.md</id><content type="html" xml:base="https://www.bridgetownrb.com/news/bridgetown-turns-five-today/">&lt;p&gt;&lt;strong&gt;Happy Birthday Bridgetown!&lt;/strong&gt; Five years ago today, a project was born to create &lt;em&gt;a new kind&lt;/em&gt; of web framework—certainly one unlike any previously seen in the Ruby community. (More on that in a moment.) I will confess, I’m as astonished as anyone we’re still going strong five years later!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bridgetownrb.com/news/happy-birthday-bridgetown/&quot;&gt;This time last year I reminisced quite a bit&lt;/a&gt; and also looked forward to &lt;strong&gt;all-systems-go&lt;/strong&gt; development of Bridgetown 2.0, and today we are preparing what might be the last beta of the 2.0 cycle before its final release.&lt;/p&gt;

&lt;p&gt;But beyond a fist pump in the air and a dash of nostalgia, I’d like to reflect on the astonishing truth that Bridgetown is, well, still the only game in (our) town. I included in the title of this post “the Hybrid Ruby Web Framework” because that’s our not-so-secret sauce that for some reason continues to escape notice for a lot of people.&lt;/p&gt;

&lt;p&gt;Bridgetown isn’t &lt;em&gt;just&lt;/em&gt; a static site generator. Bridgetown isn’t &lt;em&gt;just&lt;/em&gt; a dynamic application server. &lt;strong&gt;It’s both.&lt;/strong&gt; And as time passes, the lines between those two worlds—pre-built and built-on-demand—will blur, and we’ll continue to press forward on solutions which allow your static pages to refresh portions of the page on-demand with live content. We’re super-thrilled with the amount of progress we’ve made on polishing our server architecture, as well as some companion projects simmering on the back burner to make interactive feature development feel unlike anything you’ve experienced in Ruby.&lt;/p&gt;

&lt;p&gt;At the same time, we see Bridgetown as playing a significant role in elevating the exposure of Ruby web frameworks in general past a certain &lt;em&gt;train-themed&lt;/em&gt; option some people think is the &lt;em&gt;only&lt;/em&gt; Ruby framework available. There’s a lot of educational work to be done to show that &lt;strong&gt;Ruby has range&lt;/strong&gt; and we can forge new paths. Along those lines, we want to show how Bridgetown can be used alongside other frameworks, most notably &lt;a href=&quot;https://hanamirb.org&quot;&gt;Hanami&lt;/a&gt;. While Bridgetown is itself a complete framework, there’s no reason you couldn’t use Hanami for your application server code and Bridgetown for a static portion such as a company blog. Could those live side-by-side in the same repo, perhaps even sharing some common assets? &lt;strong&gt;Stay tuned.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyway, back to work on getting v2.0 out the door. Once again, thank you to all who support this project and contribute to make it better. &lt;em&gt;Excelsior!&lt;/em&gt;&lt;/p&gt;</content><author><name>Jared White</name></author><category term="news" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Countdown to Production! Bridgetown 2.0 Beta 4 is Here</title><link href="https://www.bridgetownrb.com/release/countdown-to-production-release/" rel="alternate" type="text/html" title="Countdown to Production! Bridgetown 2.0 Beta 4 is Here" /><published>2025-01-16T00:00:00-08:00</published><updated>2025-01-16T00:00:00-08:00</updated><id>repo://posts.collection/_posts/2025/2025-01-16-countdown-to-production-release.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/countdown-to-production-release/">&lt;p&gt;The &lt;strong&gt;Bridgetown progressive web framework&lt;/strong&gt; is racing to the 2.0 finish line. While we don’t have a specific process for offering “release candidates”, we consider this Beta 4 release to be essentially an RC. Feature development is now frozen, and the only additional updates we anticipate will be major bug fixes only.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.0.0.beta4&quot;&gt;Read the release notes&lt;/a&gt;, &lt;a href=&quot;https://edge.bridgetownrb.com&quot;&gt;review our “edge” documentation&lt;/a&gt;, and &lt;a href=&quot;https://edge.bridgetownrb.com/docs/installation/upgrade&quot;&gt;take a look at our 2.0 upgrade guide&lt;/a&gt; if you’re coming from Bridgetown 1.x. If you’re new to the Bridgetown 2.0 release cycle, &lt;a href=&quot;https://edge.bridgetownrb.com/blog/future&quot;&gt;read our Road to Bridgetown 2.0 series&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of the goodies in Beta 4:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We continue to make progress in improving full build performance. While our &lt;strong&gt;Fast Refresh&lt;/strong&gt; feature makes development an order of magnitude faster in most cases, we also want our complete build cycles to go more quickly.&lt;/li&gt;
  &lt;li&gt;In previous releases, our primary goal was to ensure Bridgetown could “scale up” to large, ambitious application architectures. Now we’re also looking at opportunities to “scale down”. In the latest beta, we support Bridgetown running in a folder with only a &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; and some source files. That’s it. No &lt;code class=&quot;highlighter-rouge&quot;&gt;config&lt;/code&gt; folder, no &lt;code class=&quot;highlighter-rouge&quot;&gt;Rakefile&lt;/code&gt;, no &lt;code class=&quot;highlighter-rouge&quot;&gt;config.ru&lt;/code&gt;…you get the picture. And in a follow-up feature in Bridgetown 2.1, we’ll support source folders located elsewhere on the file system as well as Markdown files with no front matter present. If that makes you think &lt;em&gt;wiki!&lt;/em&gt;, well, you’re exactly right. ☺️&lt;/li&gt;
  &lt;li&gt;The first beta of Bridgetown 2.0 introduced the &lt;code class=&quot;highlighter-rouge&quot;&gt;RodaCallable&lt;/code&gt; mixin for allowing any PORO (Plain Old Ruby Object) to respond to a Roda route. Now, we’ve introduced the &lt;code class=&quot;highlighter-rouge&quot;&gt;Viewable&lt;/code&gt; mixin for allowing any Ruby view component to provide HTML rendering for a route. Daisy-chain callable &amp;amp; viewable objects and you essentially have the “View-Controller” part of &lt;strong&gt;MVC&lt;/strong&gt; solved. We believe this will unlock opportunities to build ever larger and more robust web applications with Bridgetown.&lt;/li&gt;
  &lt;li&gt;We’ve introduced an entirely new Bundled Configuration to add &lt;code class=&quot;highlighter-rouge&quot;&gt;minitest&lt;/code&gt; to your projects, and the tests will be equally adept at validating the output of statically-generated content as well as server-side routes. Yes that’s right: use the exact same testing infrastructure to test static and dynamic endpoints equally—complete with an elegant DSL for making requests and parsing either HTML or JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re also plugging away at new documentation around all of these features and more besides, and going forward the bulk of our efforts to get a final 2.0 release out the door will be the docs.&lt;/p&gt;

&lt;p&gt;As always, if you run into any issues trying out Bridgetown 2.0 beta, &lt;a href=&quot;/community&quot;&gt;please hop into our community channels&lt;/a&gt; and let us know how we can help. We welcome your feedback and ideas! In addition, you can &lt;a href=&quot;https://bsky.app/profile/bridgetownrb.com&quot;&gt;follow us on Bluesky&lt;/a&gt; as well as &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;in the fediverse&lt;/a&gt; to stay current on the latest news.&lt;/p&gt;</content><author><name>Jared White</name></author><category term="release" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bridgetown 2024: Year in Review</title><link href="https://www.bridgetownrb.com/news/2024-year-in-review/" rel="alternate" type="text/html" title="Bridgetown 2024: Year in Review" /><published>2024-12-30T00:00:00-08:00</published><updated>2024-12-30T00:00:00-08:00</updated><id>repo://posts.collection/_posts/2024/2024-12-30-2024-year-in-review.md</id><content type="html" xml:base="https://www.bridgetownrb.com/news/2024-year-in-review/">&lt;p&gt;This year has been a pivotal one for the &lt;strong&gt;Bridgetown web framework&lt;/strong&gt;. We started off 2024 on some conceptual shaky ground, uncertain about the direction Bridgetown should head in next, but over the spring and summer we really hit our stride and are finishing out the year in a strong position.&lt;/p&gt;

&lt;p&gt;Another meaty beta release of Bridgetown 2.0 is just around the corner, and we expect the final Bridgetown v2 production release to land in early Q1 2025—unlocking a new wave of innovation in the Ruby-powered web development space.&lt;/p&gt;

&lt;p&gt;Our message for 2025 is a simple one: Bridgetown is ready to be &lt;strong&gt;your #1 go-to framework&lt;/strong&gt; for ambitious small-to-midsize web applications. We’re not just for blogs. We’re not just for marketing pages. We’re for powerful, database-driven, interactive software across a variety of industries and use cases. We’re flipping the script: instead of asking “why Bridgetown?” you’ll be asking “why not?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some stats for Bridgetown in 2024:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;6 releases, 3 in the 2.0 beta line&lt;/li&gt;
  &lt;li&gt;15 contributors across all the releases&lt;/li&gt;
  &lt;li&gt;Grew by roughly 200 stars on &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;574 members in &lt;a href=&quot;https://discord.gg/4E6hktQGz4&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;409 followers on &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;Mastodon&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;And now we’re on &lt;a href=&quot;https://bsky.app/profile/bridgetownrb.com&quot;&gt;Bluesky&lt;/a&gt; too!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll have a slew of exciting announcements to make about the broader Bridgetown ecosystem in 2025 as v2 heads out the door, so be sure to subscribe and join in all the right places. If you’ve been thinking to yourself “somebody really needs to shake up the Ruby landscape with a fresh vision for how web applications are architected and deployed—and how to strengthen the open source community with safety and inclusiveness” — don’t worry, we’ve got some good stuff cooking.&lt;/p&gt;

&lt;p&gt;In the meantime, we thank you for your continued interest and support of the Bridgetown project and want to wish you a very &lt;strong&gt;Happy New Year&lt;/strong&gt;! &lt;em&gt;Go Ruby!&lt;/em&gt;&lt;/p&gt;</content><author><name>Jared White</name></author><category term="news" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Performance Boost with Bridgetown 2.0 Beta 3</title><link href="https://www.bridgetownrb.com/release/bridgetown-2.0-beta-3-with-better-performance/" rel="alternate" type="text/html" title="Performance Boost with Bridgetown 2.0 Beta 3" /><published>2024-11-18T00:00:00-08:00</published><updated>2024-11-18T00:00:00-08:00</updated><id>repo://posts.collection/_posts/2024/2024-11-18-bridgetown-2.0-beta-3-with-better-performance.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/bridgetown-2.0-beta-3-with-better-performance/">&lt;p&gt;The third beta of Bridgetown 2.0 is here! &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.0.0.beta3&quot;&gt;Read the release notes&lt;/a&gt;, &lt;a href=&quot;https://edge.bridgetownrb.com&quot;&gt;review our “edge” documentation&lt;/a&gt;, and you will likely want to &lt;a href=&quot;https://edge.bridgetownrb.com/docs/installation/upgrade&quot;&gt;take a look at our 2.0 upgrade guide&lt;/a&gt; if you’re coming from Bridgetown 1.x. If you’re new to the Bridgetown 2.0 release cycle, &lt;a href=&quot;https://edge.bridgetownrb.com/blog/future&quot;&gt;read our Road to Bridgetown 2.0 series&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of the goodies in Beta 3:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not often we’re able to see a major performance gain with a single fix. Thankfully, &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/pull/915&quot;&gt;with this PR in place&lt;/a&gt;, we’ve seen full build performance gains of 15-25%…possibly even higher. Huge thanks to Maxime Lapointe for the awesome detective work.&lt;/p&gt;

&lt;p&gt;A bug resulting in Liquid templates not working as expected with the new fast refresh feature has been resolved.&lt;/p&gt;

&lt;p&gt;Sites using multiple locales (aka i18n) are now better supported by fast refresh. If you encounter any additional issues seeing updated content after making changes to your content files, please file an issue and let us know.&lt;/p&gt;

&lt;p&gt;You can now switch to ESModules (ESM) and away from CommonJS for your projects! Run &lt;code class=&quot;highlighter-rouge&quot;&gt;bin/bridgetown esbuild update&lt;/code&gt; to install the latest frontend configuration. You may need to edit some of your JS files manually in order to remove outdated &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt; statements and use &lt;code class=&quot;highlighter-rouge&quot;&gt;import&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;Finally, we’ve been doing a lot of behind-the-scenes work to improve API-level documentation as well as guide-level documentation. For example, you can read up on &lt;a href=&quot;https://edge.bridgetownrb.com/docs/template-engines/erb-and-beyond#streamlined&quot;&gt;our new all-Ruby syntax for HTML templates: Streamlined&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As always, if you run into any issues trying out Bridgetown 2.0 beta, &lt;a href=&quot;/community&quot;&gt;please hop into our community channels&lt;/a&gt; and let us know how we can help. We welcome your feedback and ideas! In addition, you can &lt;a href=&quot;https://bsky.app/profile/bridgetownrb.com&quot;&gt;follow us now on Bluesky&lt;/a&gt; as well as &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;in the fediverse&lt;/a&gt; to stay current on the latest news.&lt;/p&gt;</content><author><name>Jared White</name></author><category term="release" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">It’s Finally Here! Bridgetown 2.0 Beta 1</title><link href="https://www.bridgetownrb.com/release/its-here-bridgetown-2.0-beta-1/" rel="alternate" type="text/html" title="It’s Finally Here! Bridgetown 2.0 Beta 1" /><published>2024-08-02T00:00:00-07:00</published><updated>2024-08-02T00:00:00-07:00</updated><id>repo://posts.collection/_posts/2024/2024-08-02-its-here-bridgetown-2.0-beta-1.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/its-here-bridgetown-2.0-beta-1/">&lt;p&gt;I’m pleased to announce the first beta release of &lt;strong&gt;Bridgetown 2.0&lt;/strong&gt;, the premier static site generator 🤝 full-stack web framework &lt;strong&gt;powered by Ruby&lt;/strong&gt;. Many thanks to everyone who contributed! And if you’re wondering &lt;em&gt;hey, where’s the new code name?&lt;/em&gt; …that is forthcoming. We’re going to have a little fun playing with the branding on this one, so stay tuned. 😎&lt;/p&gt;

&lt;p&gt;In the meantime, Bridgetown 2.0 is really all about two major initiatives: removing many deprecations from the 1.x line all while tightening up internals and providing a high quality &amp;amp; stable API, and raising baselines with improved defaults to enable a clear vision for the next several years of Bridgetown development.&lt;/p&gt;

&lt;p&gt;We’ve written about many of these initiatives previously on the blog—see these posts for reference:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/future/road-to-bridgetown-2.0-escaping-burnout/&quot;&gt;Part 1 (Stuck in Burnout Marsh)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/future/road-to-bridgetown-2.0-new-baselines/&quot;&gt;Part 2 (New Baselines)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/news/happy-birthday-bridgetown/&quot;&gt;Happy 4th Birthday, Bridgetown!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/future/road-to-bridgetown-2.0-fast-refresh/&quot;&gt;Part 3 (Fast Refresh)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What follows is a simplified list of updates as noted in our &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/blob/main/CHANGELOG.md&quot;&gt;changelog&lt;/a&gt;. (You can also &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/compare/1-3-stable...main&quot;&gt;browse a 1.3…2.0 diff&lt;/a&gt; if you’re &lt;em&gt;really&lt;/em&gt; curious what’s going on.)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://edge.bridgetownrb.com&quot;&gt;Our “edge” documentation is available here&lt;/a&gt;, and you will likely want to &lt;a href=&quot;https://edge.bridgetownrb.com/docs/installation/upgrade&quot;&gt;take a look at our 2.0 upgrade guide&lt;/a&gt; if you’re an existing user of Bridgetown. For example, there are new minimum versions of both Ruby and Node for the v2 release cycle.&lt;/p&gt;

&lt;p&gt;(Note that some of the new features/enhancements would benefit from detailed documentation which is still underway. We’ll have things more fleshed out by the final 2.0 release.)&lt;/p&gt;

&lt;h3 id=&quot;whats-been-added&quot;&gt;What’s Been Added&lt;/h3&gt;

&lt;p&gt;We’ve made it possible for &lt;strong&gt;Roda routes&lt;/strong&gt; to &lt;a href=&quot;https://edge.bridgetownrb.com/docs/routes#callable-objects-for-rendering-within-blocks&quot;&gt;render “callable” objects&lt;/a&gt; (docs) in a very straightforward manner. In MVP parlance, you can now designate your own “controller” objects to handle any requests, or utilize “view” objects to provide particular kinds of output (and out of the box, resources themselves can be returned directly as responses).&lt;/p&gt;

&lt;p&gt;Plus, we’ve &lt;strong&gt;simplified front matter data access&lt;/strong&gt; using new syntax across the system (in Ruby-based templates you can omit &lt;code class=&quot;highlighter-rouge&quot;&gt;data.&lt;/code&gt; in many cases, e.g. &lt;code class=&quot;highlighter-rouge&quot;&gt;title&lt;/code&gt; instead of &lt;code class=&quot;highlighter-rouge&quot;&gt;data.title&lt;/code&gt;), and for Roda rendering in particular it’s now &lt;em&gt;much&lt;/em&gt; cleaner to &lt;a href=&quot;https://edge.bridgetownrb.com/docs/routes#file-based-dynamic-routes&quot;&gt;pass data along to templates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Live reloading in development is &lt;strong&gt;dramatically faster&lt;/strong&gt; on average now with the Fast Refresh feature (see the referenced post above for more on how that works).&lt;/p&gt;

&lt;p&gt;There’s now a go-to inflector to handle various &lt;strong&gt;string conversions&lt;/strong&gt; (aka &lt;code class=&quot;highlighter-rouge&quot;&gt;folder_name/file_path.rb&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;FolderName::RubyFilePath&lt;/code&gt;) &lt;a href=&quot;https://edge.bridgetownrb.com/docs/configuration/initializers#inflector&quot;&gt;using dry-inflector&lt;/a&gt; (docs).&lt;/p&gt;

&lt;p&gt;We’ve added support for new &lt;a href=&quot;https://serbea.dev&quot;&gt;Serbea 2.0&lt;/a&gt; template features, including the &lt;code class=&quot;highlighter-rouge&quot;&gt;pipe&lt;/code&gt; helper which can be used even in ERB templates. And in addition, we now have a &lt;strong&gt;pure Ruby template syntax via Streamlined&lt;/strong&gt;. Documentation is forthcoming, but &lt;a href=&quot;https://github.com/bridgetownrb/streamlined/blob/b5d7e5bab0589b3f581c8a709f970870fa8da327/test/test_streamlined.rb#L32&quot;&gt;you can take a peak at what authoring HTML using Streamlined looks like&lt;/a&gt;. This is Bridgetown’s official answer to techniques like &lt;code class=&quot;highlighter-rouge&quot;&gt;content_tag&lt;/code&gt; in Rails or gems like Phlex, and it takes a great deal of inspiration from JavaScript’s tagged template literals.&lt;/p&gt;

&lt;h3 id=&quot;whats-changed&quot;&gt;What’s Changed&lt;/h3&gt;

&lt;p&gt;Bridgetown now &lt;strong&gt;defaults to using ERB&lt;/strong&gt; in new site projects, rather than the previous default of Liquid. You can choose Liquid (or any supported template engine) when you create a new site, but without specifying a particular option Bridgetown will assume ERB.&lt;/p&gt;

&lt;p&gt;The config &lt;strong&gt;YAML file is now optional&lt;/strong&gt;—in fact, in new Bridgetown projects only the &lt;code class=&quot;highlighter-rouge&quot;&gt;config/initializers.rb&lt;/code&gt; file is generated as the primary form of configuration. In addition, previous support for &lt;code class=&quot;highlighter-rouge&quot;&gt;.toml&lt;/code&gt; files has been removed. We’ll be upgrading our documentation to point out these new defaults.&lt;/p&gt;

&lt;p&gt;We’ve significantly refactored the &lt;a href=&quot;https://edge.bridgetownrb.com/docs/routes#file-based-dynamic-routes&quot;&gt;file-based routes plugin&lt;/a&gt; under the hood for more robust behavior and continuing improvements over time to support &lt;strong&gt;advanced full-stack applications&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As promised, an initial batch of first-party framework code (i.e., &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/tree/main/bridgetown-foundation&quot;&gt;bridgetown-foundation&lt;/a&gt;) to &lt;strong&gt;replace Active Support-based dependencies&lt;/strong&gt; has landed. And we’re making use of the new &lt;a href=&quot;https://github.com/bridgetownrb/inclusive&quot;&gt;Inclusive gem&lt;/a&gt; to package and import utility code.&lt;/p&gt;

&lt;p&gt;Our &lt;code class=&quot;highlighter-rouge&quot;&gt;start&lt;/code&gt; command now uses Rackup (and &lt;a href=&quot;https://github.com/rack/rack&quot;&gt;Rack 3&lt;/a&gt;) instead of directly interfacing with Puma. This &lt;strong&gt;paves the way for future developments&lt;/strong&gt; such as supporting other Rack-compatible application servers in addition to Puma.&lt;/p&gt;

&lt;p&gt;The way we handle front matter has been extracted into &lt;strong&gt;standalone loaders&lt;/strong&gt;. This will make it easier to maintain our front matter loaders over time as well as offer the possibility of supporting new front matter formats in the future.&lt;/p&gt;

&lt;h3 id=&quot;whats-been-removed&quot;&gt;What’s Been Removed&lt;/h3&gt;

&lt;p&gt;We’ve removed legacy code dealing with permalinks, along with a variety of other previously-deprecated code paths. We’ve also &lt;strong&gt;removed Cucumber&lt;/strong&gt;, rewriting our integrated feature tests to consolidate around Minitest exclusively. And our Webpack integration is at last done away with, in lieu of a complete focus on esbuild. &lt;strong&gt;End of an era!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bridgetown 2.0 is generally “feature complete” at this point&lt;/strong&gt;, although one or two small enhancements waiting in the wings might sneak in before the final release. In general however, we’re focusing on fixing bugs and tightening up reliability over the next few weeks as we transition from beta status to production.&lt;/p&gt;

&lt;p&gt;Beyond that, the team is working on additional ecosystem functionality with gems such as &lt;strong&gt;Lifeform&lt;/strong&gt; (form rendering) and &lt;strong&gt;Authtown&lt;/strong&gt; (accounts and logins) which can be used on Bridgetown projects. Our &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown_sequel&quot;&gt;Sequel gem&lt;/a&gt; for database access is already out the door. And for server-side rendering of web components in Ruby with a companion library offering client-side interactivity…well, that too is forthcoming. 😁&lt;/p&gt;

&lt;p&gt;As always, if you run into any issues trying out Bridgetown 2.0 beta, &lt;a href=&quot;/community&quot;&gt;please hop into our community channels&lt;/a&gt; and let us know how we can help. And if you’re new to Ruby, we’re happy to recommend other resources and communities which can give you a leg up. We try our best to follow the Ruby language motto: &lt;strong&gt;MINASWAN&lt;/strong&gt;. (Matz Is Nice And So We Are Nice…Matz being &lt;a href=&quot;https://en.wikipedia.org/wiki/Yukihiro_Matsumoto&quot;&gt;Yukihiro Matsumoto&lt;/a&gt;, the creator of Ruby.)&lt;/p&gt;</content><author><name>Jared White</name></author><category term="release" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Road to Bridgetown 2.0, Part 3 (Fast Refresh)</title><link href="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-fast-refresh/" rel="alternate" type="text/html" title="Road to Bridgetown 2.0, Part 3 (Fast Refresh)" /><published>2024-05-01T09:44:34-07:00</published><updated>2024-05-01T09:44:34-07:00</updated><id>repo://posts.collection/_posts/2024/2024-05-01-road-to-bridgetown-2.0-fast-refresh.md</id><content type="html" xml:base="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-fast-refresh/">&lt;p&gt;So before I get right into it, I’m happy to report that &lt;strong&gt;Bridgetown 2.0 development progress is proceeding at a rapid pace!&lt;/strong&gt; Many of the features talked about in the previous rounds (&lt;a href=&quot;https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-escaping-burnout/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-new-baselines/&quot;&gt;here&lt;/a&gt;) are well underway, alongside some significant quality of life DX improvements which will make this release really sizzle. Plus I’m looking forward to blogging about some of the underlying particulars soon at the recently rebooted &lt;a href=&quot;https://www.fullstackruby.dev&quot;&gt;Fullstack Ruby&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right, now to the topic at hand. I’ll get this out of the way: the &lt;strong&gt;Fast Refresh&lt;/strong&gt; feature—a default setting for the development server coming in v2.0—is &lt;em&gt;not&lt;/em&gt; like &lt;a href=&quot;https://vitejs.dev/guide/features.html#hot-module-replacement&quot;&gt;HMR&lt;/a&gt; (Hot Module Replacement), a popular strategy for JavaScript frameworks to make reloading changed code speedy during development. This is in part because—aside from any actual JavsScript files you may have for your frontend—Bridgetown doesn’t use JavaScript.&lt;/p&gt;

&lt;p&gt;Bridgetown uses Ruby, and to be precise, is based on “old-school” principles of static site generation. (Unless we’re talking about dynamic routes served via Roda…we’ll save that for a future discussion!) The way it works is you have a repo with a &lt;strong&gt;wide variety of input files&lt;/strong&gt;—Markdown, CSV, HTML templates, images, other assets—and a &lt;strong&gt;build process transforms all of those input files&lt;/strong&gt; in a variety of ways and then outputs them in formats suitable for a functioning website. In that sense, to “reload” a site after making a file change means to go through that &lt;em&gt;entire build process again&lt;/em&gt;. For a small site, a full rebuild might be relatively quick…or it might be quite slow if you have &lt;strong&gt;hundreds or thousands of pages and assets&lt;/strong&gt; to deal with.&lt;/p&gt;

&lt;h3 id=&quot;where-weve-been&quot;&gt;Where We’ve Been&lt;/h3&gt;

&lt;p&gt;Bridgetown’s progenitor, Jekyll, offers a limited scope of understanding around the types of content &amp;amp; code to rebuild on-demand as it doesn’t come with any frontend pipeline and doesn’t provide any “live reload” functionality at all for the browser—nor will Jekyll reload Ruby extensions in a repo when you change that code. However, what Jekyll does have—as do many SSGs out there—that Bridgetown hasn’t had to date is an optional &lt;strong&gt;“incremental” regeneration process&lt;/strong&gt;—that is, a change to a content file (Markdown, etc.) doesn’t necessarily require rebuilding the entire site from scratch. But even that can come with &lt;a href=&quot;https://jekyllrb.com/docs/configuration/incremental-regeneration/&quot;&gt;limitations&lt;/a&gt;, and in many cases a change to a file doesn’t trigger the neccessary downstream changes elsewhere—aka you might revise a headline in Markdown file over here, and over there a template which references said headline would still display the old content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stuff like that really grinds my gears.&lt;/strong&gt; It’s why Bridgetown hasn’t offered an incremental regeneration feature or fast refresh or whatever you want to call it. &lt;strong&gt;Trust is the issue.&lt;/strong&gt; I want to feel confident that the content I’m viewing in development is as &lt;em&gt;accurate&lt;/em&gt; as possible, and to a certain degree, you can’t ever trust that what you’re seeing is actually correct when anything less that a &lt;em&gt;full, from-scratch rebuild&lt;/em&gt; has occured.&lt;/p&gt;

&lt;p&gt;Nevertheless, it’s admittedly a serious UX fail when sites get larger and larger and you suddenly realize that when you &lt;strong&gt;fix a typo in a Markdown file&lt;/strong&gt; you now have to wait &lt;strong&gt;8 seconds&lt;/strong&gt; before you see that fix appear in the browser. &lt;em&gt;Unacceptable!&lt;/em&gt; In an ideal world, you wouldn’t have to wait 8 seconds. Hopefully you wouldn’t even need to wait 800 milliseconds. The refresh would occur as close to “instantaneously” as possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s the goal with Fast Refresh in Bridgetown 2.0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How did we accomplish this feat? Read on…&lt;/p&gt;

&lt;h3 id=&quot;signals-of-course-&quot;&gt;Signals (Of Course 😏)&lt;/h3&gt;

&lt;p&gt;The concept of &lt;a href=&quot;https://www.spicyweb.dev/videos/2024/signals-are-eating-the-web/&quot;&gt;Signals has taken the frontend world by storm&lt;/a&gt;, and that shift has started to ripple outward into other computing contexts as well. So what are signals? In a nutshell, &lt;strong&gt;signals&lt;/strong&gt; are &lt;em&gt;reactive variables&lt;/em&gt;—aka values which, when mutated, cause all subscribers to be notified. If you’re familar with the simpler pattern of observables, you know you have to set up subscriptions by hand—a tedious and sometimes error-prone endeavor. Signals instead are regularly paired with &lt;strong&gt;effects&lt;/strong&gt;—functions which will automatically subscribe to any signals referenced within the function when executed. Later, whenever those signal values change, the effect functions re-execute—&lt;em&gt;like magic!&lt;/em&gt; ✨&lt;/p&gt;

&lt;p&gt;For a deep dive into this topic from the Ruby perspective, check out &lt;a href=&quot;https://www.fullstackruby.dev/podcast/8/&quot;&gt;Episode 9 of Fullstack Ruby&lt;/a&gt;. TL;DR: thanks to the &lt;a href=&quot;https://github.com/whitefusionhq/signalize&quot;&gt;Signalize gem&lt;/a&gt; which I wrote as a direct port of Preact Signals, we can use signals in Ruby. And the reason this is such a game-changer for Bridgetown?&lt;/p&gt;

&lt;p&gt;By placing &lt;strong&gt;resource data into signals&lt;/strong&gt;, and &lt;strong&gt;transformation steps inside of effects&lt;/strong&gt;, we can track via effects which resources or generated pages would need to be updated due to signals changing. In other words, during the initial full build, we’re assembling a &lt;em&gt;dependency graph&lt;/em&gt; in real-time of which pages should be rebuilt later. That way during a refresh, instead of a simplistic incremental regeneration acting on one piece of source data and leaving that data stale on other parts of the site—or just doing the full rebuild which can take a long time—we can instead only rebuild 5 interdependent pages, or 10 pages, or even 50 pages…but probably not 200! (Plus we also get to skip a lot of other slow code reloading logic and so forth whenever it’s simply not necessary…which is the majority of the time!)&lt;/p&gt;

&lt;h3 id=&quot;the-devils-in-the-details&quot;&gt;The Devil’s in the Details&lt;/h3&gt;

&lt;p&gt;This process is fairly straightforward if the changed file in question is indeed a resource. We can build up the resource (which could be a page at a URL or it could be a data file) + dependency graph, and simply regenerate those resources. But things get tricky when “generated pages” are involved such as using prototype pages or pagination. For those cases, we need to backtrack to an original resource and re-extract all the necessary data for the generated pages which follow.&lt;/p&gt;

&lt;p&gt;All of the places where reactive data can end up are vital to the integrity of the Fast Refresh process. Think of all the contexts where content cohesion is crucial:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you &lt;strong&gt;change the name of a person&lt;/strong&gt; in &lt;code class=&quot;highlighter-rouge&quot;&gt;_data/authors.yml&lt;/code&gt;, all of their blog posts should update.&lt;/li&gt;
  &lt;li&gt;If you &lt;strong&gt;change the title of a document&lt;/strong&gt;, a sidebar with a list of those documents should update whichever pages include that sidebar.&lt;/li&gt;
  &lt;li&gt;If you &lt;strong&gt;update a blog post description&lt;/strong&gt;, “page 4” in an archive somewhere should update with that new description.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing all that is pretty challenging if you have to trace all those dependencies by hand (either under the hood with complex automagical logic, or with specific directives users must understand and maintain themselves…eww!).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thankfully…signals to the rescue.&lt;/strong&gt; And we’re not simply tracking resource&amp;lt;-&amp;gt;resource connections, but connections between templates and rendered components. If I update a single component template, but that template is only referenced by one or a few resources (or layouts used by those resources), why should the entire site get rebuilt? Let’s just rebuild the resources which directly render that component. Even layouts factor into this: if you edit a layout, only the resources which use that layout will be regenerated.&lt;/p&gt;

&lt;p&gt;For the most part, Fast Refresh will require no changes to existing site repos. It’ll “just work”. But we do have a new mechanism in particular for handling site-wide data which can prove quite interesting. Instead of reaching for &lt;code class=&quot;highlighter-rouge&quot;&gt;site.data&lt;/code&gt;, reach for &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals&lt;/code&gt;. All of the keys will be shortcuts for setting/getting signal values—aka &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals.authors&lt;/code&gt; is shorthand for &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals.authors_signal.value&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals.authors.value = ...&lt;/code&gt; is shortchand for &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals.authors_signal.value = ...&lt;/code&gt;. This means you can save and access site data throughout various plugins/templates, and any changes made to data files will propagate accordingly during Fast Refresh.&lt;/p&gt;

&lt;p&gt;All of this serves to ensure that when you update a file, it’s often rebuilt so quickly that by the time you switch from your editor back over to the site in the browser, &lt;em&gt;it’s already been refreshed.&lt;/em&gt; (We also have increased speed overall thanks to revisions to our Rack/Roda integration!) I’ve been experiencing this rapid round-tripping a lot over the past few weeks, and it’s pretty freakin’ cool. 😎⚡️&lt;/p&gt;

&lt;h3 id=&quot;escape-hatch&quot;&gt;Escape Hatch&lt;/h3&gt;

&lt;p&gt;The version of Fast Refresh shipping in Bridgetown 2.0 will be good, but it won’t be perfect. There are times it may get tangled up in the web of its own dependencies, or fail to account for a particular type of change, and you’ll need to reboot the dev server—or in the worst case, temporarily switch off fast refresh in your config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast Refresh will get top priority for bug fixes for the forseeable future&lt;/strong&gt;, which is one of the reasons we’re releasing it switched on by default. We &lt;em&gt;want&lt;/em&gt; as many people as possible to test this right out of the gate, so we can fix edge cases as quickly as possible. My own experience has been that even with an occasional hiccup, &lt;strong&gt;the quality of life improvement with the increased refresh speed more than makes up for those annoyances&lt;/strong&gt;. Most of the time, &lt;em&gt;it rocks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’ll also be shipping a bonus feature: a way for you to hook into Bridgetown’s live reload JavaScript process to control what happens for that browser reload. For users of frontend libraries like Swup, htmx, Turbo, etc. which can swap or even morph page DOM as part of navigation, you could use those to pull in the updated HTML for an &lt;em&gt;even slicker experience&lt;/em&gt;. 😎&lt;/p&gt;

&lt;h3 id=&quot;performance-is-a-feature-too&quot;&gt;Performance is a Feature Too&lt;/h3&gt;

&lt;p&gt;One of the goals of Bridgetown 2.0 (and 2.1 and beyond) is to reframe how we look at opportunities to increase framework performance. There’s never been a desire among the core team to shave a few ms off of a synthetic benchmark, or to gain paltry bits of performance at the expense of great DX.&lt;/p&gt;

&lt;p&gt;But if we can identify clear wins around simplifying code steps, creating modular configurations, streamlining algorithms, and encouraging certain architectures over others so as to improve the performance of both static generation and dynamic routes meaningfully, we’re ready to dive in. If you would like to contribute a test site we can use to benchmark Bridgetown 1.x vs 2.x as we fine-tune this release, please get in touch! Our hope is to gradually build up our release QA process to include regression testing…aka a full site build with each new Bridgetown release should be the same or faster, &lt;em&gt;definitely&lt;/em&gt; not slower.&lt;/p&gt;

&lt;p&gt;OK, that does it for Fast Refresh! &lt;strong&gt;Stay tuned for the next installment of the “Road to Bridgetown 2.0” series&lt;/strong&gt; all about where we’re going with our &lt;strong&gt;Roda&lt;/strong&gt; and &lt;strong&gt;Sequel&lt;/strong&gt; integrations. &lt;em&gt;Spoiler alert:&lt;/em&gt; Bridgetown 2.0 will completely support Rack-native, fullstack, database-driven application requirements where even your &lt;em&gt;index&lt;/em&gt; file can be a dynamic route if you so choose. Have your static website cake &lt;em&gt;and&lt;/em&gt; eat your dynamic server too? 🍰 &lt;strong&gt;Yep!&lt;/strong&gt; 😁&lt;/p&gt;</content><author><name>Jared White</name></author><category term="future" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Happy 4th Birthday, Bridgetown!</title><link href="https://www.bridgetownrb.com/news/happy-birthday-bridgetown/" rel="alternate" type="text/html" title="Happy 4th Birthday, Bridgetown!" /><published>2024-04-02T08:09:29-07:00</published><updated>2024-04-02T08:09:29-07:00</updated><id>repo://posts.collection/_posts/2024/2024-04-02-happy-birthday-bridgetown.md</id><content type="html" xml:base="https://www.bridgetownrb.com/news/happy-birthday-bridgetown/">&lt;p&gt;Four years ago today, I wrote in my Day One journal:&lt;/p&gt;

&lt;sl-alert variant=&quot;primary&quot; open=&quot;&quot;&gt;
  &lt;sl-icon slot=&quot;icon&quot; library=&quot;remixicon&quot; name=&quot;system/information&quot; style=&quot;font-size:1.25em&quot;&gt;&lt;/sl-icon&gt;
  &lt;p&gt;“I forked &lt;strong&gt;Jekyll&lt;/strong&gt; today and turned it into &lt;strong&gt;Bridgetown&lt;/strong&gt;, so I’m now privately the maintainer of a Webpack-aware, Ruby-based static site generator for the modern JAMstack era. How cool (and crazy) is that?!?!”&lt;/p&gt;
&lt;/sl-alert&gt;

&lt;p&gt;The first public website launch and release of Bridgetown 0.10 &lt;a href=&quot;/news/time-to-visit-bridgetown/&quot;&gt;happened a few weeks later&lt;/a&gt;, and the rest as they say is history. As always, a &lt;strong&gt;hearty thank you&lt;/strong&gt; to all our &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown#special-thanks-to-our-github-sponsors--&quot;&gt;sponsors&lt;/a&gt; and &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/graphs/contributors&quot;&gt;70+ contributors&lt;/a&gt; who have helped this open source project flourish in ways I never could have imagined.&lt;/p&gt;

&lt;h2 id=&quot;some-hindsight-is-2020-thoughts&quot;&gt;Some “hindsight is 20/20 thoughts”&lt;/h2&gt;

&lt;p&gt;I know we all sort of cringe thinking about Webpack today (&lt;em&gt;esbuild forever!&lt;/em&gt;), but back then it was still a Big Deal and represented a major frontend shift towards using ESM, pulling in packages from NPM for both JavaScript and CSS libraries/frameworks, and compiling using JavaScript-based tools. Having a pre-configured frontend pipeline that Just Works™ come ready to roll with your site generator was (and is) nothing to sneeze at.&lt;/p&gt;

&lt;p&gt;It’s interesting to look at my original notes on what was most urgent to add to whatever might emerge from this fork: Webpack (as mentioned), Components (not just basic includes/partials), Internationalization (i18n), and easier third-party API integration were top of the list. A promising start! But a lot of what I love today about Bridgetown hadn’t quite been conceived of yet. &lt;strong&gt;Much has happened in only four years!&lt;/strong&gt; (You can find a more in-depth &lt;a href=&quot;/docs/migrating/features-since-jekyll&quot;&gt;list of post-Jekyll features and changes here&lt;/a&gt; if you’re curious.)&lt;/p&gt;

&lt;p&gt;One major direction for Bridgetown I imagined in those earlier days that we ended up totally shifting away from is a tight integration with Rails. Aside from my &lt;a href=&quot;/future/road-to-bridgetown-2.0-escaping-burnout/&quot;&gt;own perspective on Rails shifting&lt;/a&gt;, it turns out a significant level of interest in the potential architecture such a marriage might produce never materialized. I could do a deep dive some day into why that might be, but the good news (and a direction I never would have foreseen in 2020!) is that we pivoted into a tight integration with &lt;a href=&quot;/docs/routes&quot;&gt;Roda&lt;/a&gt;. That proved to be a &lt;strong&gt;huge boon&lt;/strong&gt; for the framework—with a lot of newer features being heavily inspired by the “Roda way” like the new &lt;a href=&quot;/docs/configuration/initializers&quot;&gt;Initializers&lt;/a&gt; system—and &lt;strong&gt;I’m ready to push that all to the max this year&lt;/strong&gt;. I see no reason why, with just a tad more DX polish, a combined Bridgetown + Roda couldn’t be then used to build &lt;em&gt;substantial&lt;/em&gt; web applications serving thousands of customers. I look forward to spreading the message that Bridgetown is far more than “just” a static-site generator (as we clearly say right on our homepage!) by promoting solid integrations with &lt;a href=&quot;http://rodauth.jeremyevans.net&quot;&gt;Rodauth&lt;/a&gt; and &lt;a href=&quot;http://sequel.jeremyevans.net&quot;&gt;Sequel&lt;/a&gt; to round out our server-side offerings. (We’re basically just living in the JECU—the Jeremy Evans Cinematic Universe—at this point! 😅)&lt;/p&gt;

&lt;h2 id=&quot;in-closing&quot;&gt;In closing…&lt;/h2&gt;

&lt;p&gt;We’re currently in the midst of the Bridgetown v2 development cycle, and I’ll be posting Part 3 of our blog series on the topic shortly. In the meantime, &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;follow us on Mastodon&lt;/a&gt; to stay on top of the latest news. &lt;strong&gt;Thank you once again for all of your support over the past four years&lt;/strong&gt;. The Bridgetown community is now larger than any one of us, and I can’t wait to see what the next four years have in store for Rubyists everywhere.&lt;/p&gt;</content><author><name>Jared White</name></author><category term="news" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Road to Bridgetown 2.0, Part 2 (New Baselines)</title><link href="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-new-baselines/" rel="alternate" type="text/html" title="Road to Bridgetown 2.0, Part 2 (New Baselines)" /><published>2024-02-29T08:14:56-08:00</published><updated>2024-02-29T08:14:56-08:00</updated><id>repo://posts.collection/_posts/2024/2024-02-29-road-to-bridgetown-2.0-new-baselines.md</id><content type="html" xml:base="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-new-baselines/">&lt;blockquote style=&quot;text-align:center; margin-inline: 1.25vw&quot;&gt;
  &lt;p&gt;“And blood-black nothingness began to spin…a system of cells interlinked within cells interlinked within cells interlinked within one stem…and dreadfully distinct against the dark, a tall white fountain played.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OK OK, not that &lt;a href=&quot;https://www.youtube.com/watch?v=1h-seEowtDw&quot;&gt;baseline&lt;/a&gt;. 😜&lt;/p&gt;

&lt;p&gt;Rather, what we’re talking about are &lt;strong&gt;technology baselines&lt;/strong&gt;. Minimum language version requirements. Language syntaxes. Tool dependencies. That sort of thing.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Bridgetown 2.0&lt;/strong&gt; release cycle lets us reset some of these baselines, moving the framework into a more modern era without sacrificing developer experience or causing major upgrade headaches. For the most part, you should be able to keep your projects running with few (if any) changes. But of course, with a little spit and polish, you’ll be able to take full advantage of improvements lower in the stack.&lt;/p&gt;

&lt;p&gt;Let’s step through the various baselines we’ll be providing in Bridgetown 2.0.&lt;/p&gt;

&lt;h3 id=&quot;ruby-31&quot;&gt;Ruby 3.1&lt;/h3&gt;

&lt;p&gt;Bridgetown 3.1 will require a &lt;strong&gt;minimum Ruby version of 3.1&lt;/strong&gt;. Our policy is that for each major version number increment (in this case, v2), we will move the minimum Ruby version to two yearly releases prior to the current one. Since today’s Ruby version is 3.3, that allows us to support Ruby 3.1 and 3.2 as well.&lt;/p&gt;

&lt;p&gt;Because we’re moving from the past minimum of Ruby 2.7 to 3.1, this opens up a whole new world of Ruby v3 syntax and functionality being made available to the Bridgetown ecosystem. I wrote about &lt;a href=&quot;https://www.fullstackruby.dev/ruby-3-fundamentals/2021/01/06/everything-you-need-to-know-about-destructuring-in-ruby-3/&quot;&gt;some of my favorite Ruby 3.1 features&lt;/a&gt; over two years ago! And even more has happened since with the releases of Ruby 3.2 and 3.3. (YJIT, anyone?)&lt;/p&gt;

&lt;p&gt;We suspect many Bridgetown projects are already on Ruby 3, and for those still using Ruby 2.7, the upgrade process to switch to at least 3.1 should be fairly smooth.&lt;/p&gt;

&lt;h3 id=&quot;node-20&quot;&gt;Node 20&lt;/h3&gt;

&lt;p&gt;Until recently, for a good window of time it seemed like the particular version of Node you happened to be running wasn’t a huge deal since Bridgetown’s use of Node has been almost exclusively relegated to compiling frontend assets.&lt;/p&gt;

&lt;p&gt;While that will continue to be the case, we are making some specific, intentional changes to &lt;em&gt;how&lt;/em&gt; Bridgetown integrates with Node. In order to streamline these efforts, it makes sense to standardize on newer versions of Node.&lt;/p&gt;

&lt;p&gt;As of the time of this writing Node 21 is the current production release, but as we suspect Node 22 is right around the corner (based on Node’s yearly release schedule), we are jumping the gun just a tad and going with &lt;strong&gt;Node 20&lt;/strong&gt; as our baseline (since essentially that will be two versions prior to current once Bridgetown 2.0 is released later in Q2).&lt;/p&gt;

&lt;p&gt;Which brings us to:&lt;/p&gt;

&lt;h3 id=&quot;esm&quot;&gt;ESM&lt;/h3&gt;

&lt;p&gt;The JavaScript NPM ecosystem has been stumbling towards its goal of coalescing around ES Modules (ESM), rather than CommonJS, for quite a long time now. It feels like we’ve arrived at the moment when it’s now or never, so let’s do it now. For those of you only vaguely aware of what the differences are, here it is in a nutshell:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// CommonJS&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ESM&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Yes, for those of you asking, ESM has been the &lt;em&gt;only&lt;/em&gt; way you write JavaScript for client-side purposes (since ES6 anyway). Yet Node’s historical CommonJS manner of importing and exporting modules and packages has persisted on the server. The end is nigh though, as universal ESM syntax has been embraced more and more throughout the ecosystem.&lt;/p&gt;

&lt;p&gt;There are two ways to instruct Node to use ESM instead of CommonJS. You can name JavaScript file extensions as &lt;code class=&quot;highlighter-rouge&quot;&gt;.mjs&lt;/code&gt;. Or you can add &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; to your &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;For Bridgetown 2.0, &lt;strong&gt;we will be opting for that latter option&lt;/strong&gt;, and all configuration files for tools like esbuild and PostCSS will be supplied in ESM format. CommonJS will still work in your existing projects, but for all new projects, it will be all ESM, all the time! 👏&lt;/p&gt;

&lt;h3 id=&quot;farewell-yarn&quot;&gt;Farewell Yarn&lt;/h3&gt;

&lt;p&gt;When the Bridgetown framework first launched in 2020, many people considered Yarn to be a better package manager than Node’s built-in &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt; solution. Many frameworks had built up around it, and even Ruby on Rails had embraced it.&lt;/p&gt;

&lt;p&gt;But time doesn’t stand still, and neither did npm because at this point, it works just as well as “classic” Yarn and newer versions of Yarn ended up causing headaches due to changing designs, syntax, and feature-set sweet spots.&lt;/p&gt;

&lt;p&gt;So in Bridgetown 2.0, we’re greatly simplifying and &lt;strong&gt;migrating to using npm by default&lt;/strong&gt;. You still have the &lt;em&gt;option&lt;/em&gt; of keeping classic Yarn around for use in your existing Bridgetown projects—or you can switch over to npm or even another popular package manager, &lt;a href=&quot;https://pnpm.io/&quot;&gt;pnpm&lt;/a&gt;. We’ll focus on npm out of the box, but switching to pnpm should you wish it will be straightforward (we’ve actually supported it in the most recent v1.x releases anyway).&lt;/p&gt;

&lt;h3 id=&quot;farewell-webpack&quot;&gt;Farewell Webpack&lt;/h3&gt;

&lt;p&gt;Bridgetown has defaulted to using esbuild for its frontend bundler for some time now, but with Bridgetown 2.0 &lt;strong&gt;we’ll be removing official support for Webpack&lt;/strong&gt;. This does mean we recommend migrating your projects from Webpack over to esbuild &lt;em&gt;as soon as possible&lt;/em&gt;, since we have no guarantee Webpack will continue to work once Bridgetown 2.0 arrives.&lt;/p&gt;

&lt;p&gt;The writing has been on the wall for some time, as the entire web industry generally pivots away from Webpack and towards more modern solutions like esbuild (Vite, Turbopack, and Parcel being some other popular options).&lt;/p&gt;

&lt;p&gt;The good news is that we continue to feel &lt;em&gt;extremely&lt;/em&gt; satisfied with our embrace of esbuild. I personally like to say that esbuild is the “last bundler” I’ll ever use. And I really believe that. I see no reason years from now why esbuild won’t still be perfectly adequate to perform the sorts of lightweight frontend bundling and asset pipeline tasks Bridgetown users typically require. It’s nice to have that level of confidence in a framework dependency.&lt;/p&gt;

&lt;h3 id=&quot;erb-by-default&quot;&gt;ERB by Default&lt;/h3&gt;

&lt;p&gt;And last but certainly not least, we’ll be switching away from Liquid as our default out-of-the-box template engine and over to ERB. Bridgetown is a Ruby framework after all, and &lt;strong&gt;ERB is the template language most Rubyists are familiar with&lt;/strong&gt;. The reason we ever defaulted to Liquid in the first place was an historical one…Jekyll defaulted to Liquid—and in fact &lt;em&gt;only&lt;/em&gt; supports Liquid (you have to install a third-party plugin to get some sort of ERB support). But with Bridgetown having supported ERB for years now, it makes sense to go ERB-first.&lt;/p&gt;

&lt;p&gt;However, we have a few tricks up our sleeve—some extra features in the works to bring &lt;a href=&quot;https://www.serbea.dev/#add-pipelines-to-any-ruby-templates&quot;&gt;Serbea-like pipelines over to ERB&lt;/a&gt;, as well as a new DSL based on procs &amp;amp; heredocs called &lt;strong&gt;Streamlined&lt;/strong&gt; you can use instead of ERB in certain parts of your codebase to generate complicated HTML quickly and efficiently. (This is essentially our answer to “tag builders.”)&lt;/p&gt;

&lt;p&gt;And for that &lt;strong&gt;maximum cool factor&lt;/strong&gt;, we’ll be unveiling an optional, first-party solution to server-rendering &lt;strong&gt;web components&lt;/strong&gt; which can later be hydrated and become interactive on the client-side. We’ve already offered a solution of sorts along these lines with our &lt;a href=&quot;https://www.bridgetownrb.com/docs/components/lit&quot;&gt;integration of Lit-based web components&lt;/a&gt;. However, this new solution will provide a whole new component format—one which takes further advantage of Ruby as well as the proposed &lt;a href=&quot;https://github.com/WICG/webcomponents/blob/gh-pages/proposals/html-modules-explainer.md&quot;&gt;HTML Modules&lt;/a&gt; spec. &lt;em&gt;Ooo…exciting!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(Note that we’ll be retiring first-party support for Haml and Slim. I don’t wish to step on anybody’s toes, but template syntaxes based around indentation/whitespace rules just aren’t on the radar of frontend developers by and large. I would argue they feel more like an artifact of Ruby’s past than anything modern developers are looking for. Let’s rally around writing HTML templates in ways which frontend devs can feel comfortable with and get up to speed on quickly.)&lt;/p&gt;

&lt;h3 id=&quot;wrap-up&quot;&gt;Wrap Up&lt;/h3&gt;

&lt;p&gt;So there you have it: &lt;strong&gt;Ruby 3.1. Node 20. npm. esbuild. ERB and a whole lot more.&lt;/strong&gt; A solid set of defaults we believe will make Bridgetown that much more robust, appealing, and ready to tackle the challenges of tomorrow.&lt;/p&gt;

&lt;p&gt;There are also some efforts underway to streamline parts of Bridgetown’s internals to make it easier for contributors and maintainers. Besides simply removing a handful of small deprecations, we’re in the process of completely moving away from Cucumber and towards standard Minitest for integration tests to bring them in line with the rest of the automated test suite. You can &lt;a href=&quot;https://community.bridgetown.pub/post/10&quot;&gt;read more about these efforts&lt;/a&gt; on the community site.&lt;/p&gt;

&lt;p&gt;Along with quality-of-life and maintenance improvements, we hope to make progress in increasing the build performance of Bridgetown. Perhaps not so much in production per se (where, to be honest, it’s less critical—the difference in your site rebuilding in CI in 12 seconds vs. 6 actually doesn’t matter much), &lt;em&gt;but most definitely in development&lt;/em&gt;. We all know how frustrating it can be to make a small text change and then have to wait seconds—maybe even tens of seconds!—before the page will refresh in your browser. We have a solution in mind called &lt;strong&gt;Fast Refresh&lt;/strong&gt; based on the principles of Signals, using the &lt;a href=&quot;https://github.com/whitefusionhq/signalize&quot;&gt;Signalize gem&lt;/a&gt; which is a Ruby port of Preact Signals. It’s not quite an “incremental build” type of solution, but it’ll get us where we need to go. More on all that in the next installment of &lt;em&gt;Road to Bridgetown 2.0&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Until then, &lt;a href=&quot;https://community.bridgetown.pub/post/12&quot;&gt;hop on over to our community site and let us know&lt;/a&gt; what you’re most excited about regarding these changes in Bridgetown 2.0. As always, your feedback is most welcome!&lt;/p&gt;</content><author><name>Jared White</name></author><category term="future" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Road to Bridgetown 2.0, Part 1 (Stuck in Burnout Marsh)</title><link href="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-escaping-burnout/" rel="alternate" type="text/html" title="Road to Bridgetown 2.0, Part 1 (Stuck in Burnout Marsh)" /><published>2024-02-22T09:20:27-08:00</published><updated>2024-02-22T09:20:27-08:00</updated><id>repo://posts.collection/_posts/2024/2024-02-22-road-to-bridgetown-2.0-escaping-burnout.md</id><content type="html" xml:base="https://www.bridgetownrb.com/future/road-to-bridgetown-2.0-escaping-burnout/">&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Bridgetown 2.0 is now under active development! We have a new &lt;a href=&quot;https://community.bridgetown.pub&quot;&gt;Community discussion site&lt;/a&gt;, based on Lemmy! Stay tuned for additional announcements coming soon of what’s next for the ecosystem! And now, on with the post…&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A little known area of Bridgetown, upriver from where the tourists typically spend their time on vacation, is a treacherous stretch of water known as Burnout Marsh. My boat got mired there during the back half of 2023, and I barely escaped with my life.&lt;/p&gt;

&lt;p&gt;All right, enough of that clumsy metaphor. 😄 I didn’t want to have to write this post, believe me. I’d much rather just get on to all the juicy technical stuff that’s fun to talk about. Blog posts about “maintainer burnout” are as exciting to read as watching paint dry. It’s a bit akin to the celebrity complaining about how they have to hire security because they’re just so gosh darn famous. Like, dude, you’re famous OK? Quit yer whining before you look like an asshole.&lt;/p&gt;

&lt;p&gt;But the fact remains that maintainer burnout &lt;em&gt;is&lt;/em&gt; a thing, and it affects a lot of open source software projects. Everyone’s burnout looks a little different, and mine was no different in that way. A little bit of this (weird, weird time in the tech industry), a little bit of that (too many other irons in the fire), but mostly a particular thing (to be revealed momentarily) which affected the worst possible facet of my role as a maintainer of Ruby-based software: &lt;em&gt;my love of Ruby&lt;/em&gt;. 😱&lt;/p&gt;

&lt;p&gt;Truth be told, &lt;strong&gt;I nearly walked away.&lt;/strong&gt; 😞&lt;/p&gt;

&lt;p&gt;And the reason is both complex and simple. Here’s the simple version: the social degradation of 37signals in general and David Heinemeier Hansson (DHH) in particular nearly robbed me of all the joy I felt programming in Ruby. 😬&lt;/p&gt;

&lt;p&gt;Now nearly as distasteful to me as wallowing in “maintainer burnout” territory is wallowing in “framework authors taking potshots” territory. So you can imagine I’m &lt;em&gt;doubly&lt;/em&gt; not feeling great about where this is headed. I’ve written some version of this post over and over again in my head, and more than once in my drafts folder which &lt;em&gt;you’ll&lt;/em&gt; never see let me tell you right now. But like ripping off a Band-Aid, some things just have to be done. So here it goes.&lt;/p&gt;

&lt;h3 id=&quot;the-37signals-problem&quot;&gt;The 37signals Problem&lt;/h3&gt;

&lt;p&gt;I was aghast when the meltdown at 37signals happened in 2021. It was widely covered at the time, perhaps best by Casey Newton in several pieces such as &lt;a href=&quot;https://www.theverge.com/2021/4/27/22406673/basecamp-political-speech-policy-controversy&quot;&gt;Behind the controversy at Basecamp&lt;/a&gt; and &lt;a href=&quot;https://www.theverge.com/2021/5/3/22418208/basecamp-all-hands-meeting-employee-resignations-buyouts-implosion&quot;&gt;Inside the all-hands meeting that led to a third of Basecamp employees quitting&lt;/a&gt;. At the time, I thought &lt;em&gt;surely&lt;/em&gt; there would need to be some reckoning with how DHH conducts himself within open source projects as well such as Rails and Hotwire. Perhaps Rails could set up a more transparent governance structure, or at the very least announce DHH stepping down from a position of influence for a while (while making a very public stand around proper Code of Conduct (CoC) etiquette).&lt;/p&gt;

&lt;p&gt;Not only did none of that happen 🤨, but DHH made a &lt;em&gt;huge&lt;/em&gt; stink about not being properly invited to keynote RailsConf again right away, leading to &lt;a href=&quot;https://thenewstack.io/railsconf-and-dhh-go-their-separate-ways/&quot;&gt;RailsConf and DHH going their separate ways&lt;/a&gt; and the eventual formation of the “Rails Foundation” and Rails World conferences. So…no such reckoning. DHH would maintain an iron grip on Rails indefinitely (this new foundation really just solidifying his personal influence rather than offering any sort of real check on his power or ego), and in fact go forward to “compete” with RubyCentral and RailsConf. 😩&lt;/p&gt;

&lt;p&gt;As if this wasn’t all bad enough, the next shoe to drop dropped…and in a very public way as these things are wont to do. Out of the blue, without warning to any regular contributors or other community members, 37signals (aka DHH) simply decided to remove TypeScript from the Hotwire Turbo codebase. Again, no opportunity for discussion, no time for a heads up or any sort of guidance on how it might affect existing contributions. Just &lt;strong&gt;boom&lt;/strong&gt;, here’s the PR, insta-merge within hours, &lt;a href=&quot;https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01&quot;&gt;self-congratulatory DHH post on HEY World&lt;/a&gt;, done. 😳&lt;/p&gt;

&lt;p&gt;Folks, &lt;strong&gt;this is not how you run an open source software project&lt;/strong&gt;. Somebody’s hobby project on GitHub that’s really just their own little playground, sure, I guess. But not something as consequential as, oh I dunno, &lt;em&gt;the frontend stack of the Ruby on Rails framework&lt;/em&gt; and a tool used even outside of Rails by other frameworks! 🤪&lt;/p&gt;

&lt;p&gt;Note carefully that none of what I’m saying or about to say has any bearing on the &lt;em&gt;merits&lt;/em&gt; of removing TypeScript. We can debate those merits at our leisure, and anyone who knows me knows I’m no big fan of TypeScript. But that’s not what this is about. This is about how people govern open source projects and conduct themselves among peers.&lt;/p&gt;

&lt;p&gt;Needless to say, this move to unexpectedly rip TypeScript out of Turbo generally went down like a lead balloon, and things got heated fast. That’s never a good sign (when long-time regular contributors to a project are themselves feeling pretty grumpy), and it eventually led to this seminal issue: &lt;a href=&quot;https://github.com/hotwired/turbo/issues/977&quot;&gt;Remove DHH for CoC Violations · Issue #977&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To be very clear, nobody’s claiming that making the decision to remove TypeScript was a CoC violation, but the &lt;em&gt;manner&lt;/em&gt; in which it was done: with &lt;em&gt;zero&lt;/em&gt; involvement of the community and no consideration whatsoever (active hostility in fact) of broad feedback about the decision. I want to quote DHH’s posted response to this claim of CoC violation in full, because there simply is no way for me to read this without feeling enraged once again, and I want you to feel enraged too:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“This is elevating a disagreement of a technical decision to a level of nonsense that has no place here. This project has been founded, funded, and maintained predominantly by the resources and investment of 37signals. We will set the direction as we see fit, accepting input and contributions as they’re presented, but with no guarantee of concurrence or merging. All the best finding a project that’s more to your liking in direction or leadership or otherwise somewhere else 👋”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice all the very specific language DHH employs here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“nonsense” — regular readers of his blog know this to be code for “woke lefties” who would dare challenge his alt-right “edgelord” positioning on a variety of topics. Every time DHH’s political machinations are being publicly challenged, you’ll see the accusations of “nonsense” trotted out (&lt;a href=&quot;https://world.hey.com/dhh/may-shopify-s-immunity-spread-to-the-whole-herd-7bd855ce&quot;&gt;here’s but one example&lt;/a&gt;…stochastic terrorism is “nonsense” in DHH-speak, a product of “woke scolds”).&lt;/li&gt;
  &lt;li&gt;“founded, funded, and maintained by…37signals” — in other words, you, dear contributor to the Turbo repo, don’t actually matter if you aren’t specifically part of the business entity known as 37signals. This is technically open source, sure, but the benefits mostly flow in a single direction. 37signals gets all the benefits of &lt;em&gt;your&lt;/em&gt; efforts to improve &lt;em&gt;their&lt;/em&gt; codebase, yet meanwhile you get none of the power. Yes, you get to use their code in the end, but that’s it. That’s the only benefit. &lt;em&gt;Whoop-dee-frickin’-doo.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;“We will set the direction as we see fit” — and by “we” he means himself. DHH. The big kahuna.&lt;/li&gt;
  &lt;li&gt;“All the best finding a project that’s more to your liking” — aka if you don’t like how I run things, &lt;em&gt;fuck you&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Folks, there are times when situations are complicated, nuanced, with no real good guys or bad guys, and it’s genuinely hard to parse out what’s really going on and how to process the myriad of factors in order to arrive at a comprehensive decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is not one of those times.&lt;/strong&gt; 😅&lt;/p&gt;

&lt;p&gt;Clearly what we witnessed in this debacle is &lt;em&gt;far&lt;/em&gt; from a shining example of how one should govern an “open source” project. Perhaps it would be better described as “source available” — use the code, but don’t count on the stewards of the code to care for the needs of the community. And to get real specific, I am convinced that yes, DHH has indeed been in violation of his own CoC, and the real tragedy is &lt;em&gt;nobody has the power to call him on his own bullshit&lt;/em&gt;. DHH is co-owner of 37signals, and 37signals controls all Hotwire intellectual property.&lt;/p&gt;

&lt;p&gt;Personally, I find DHH’s continued stranglehold over the Rails and Hotwire frameworks nauseating and thoroughly unacceptable. But ultimately, that’s not the hardest part of it for me. It’s all the carrying water for him that’s gone on in the broader community. People—and yes, good people all—still keep promoting Rails (and Rails World), keep releasing Ruby code and educational resources that prop up Rails as much if not more so as Ruby, and essentially keep DHH on his pedestal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s enough to make you just want to up and quit Ruby.&lt;/strong&gt; Which I very nearly did. 😭&lt;/p&gt;

&lt;p&gt;But, y’know, I gave myself lots of time to think and reflect. I chatted a lot with my close friends and fellow Bridgetown team mates. I mused on ways I might be able to make Bridgetown “fun” again, both in terms of ongoing maintenance as well as future feature development. I waited to see if maybe I could get my boat unstuck and past Burnout Marsh and start heading downriver towards calmer waters again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And now I’ve arrived here.&lt;/strong&gt; 😌&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;whats-next-for-bridgetown-in-2024&quot;&gt;What’s Next for Bridgetown in 2024&lt;/h3&gt;

&lt;p&gt;This post kicks off a short blog series outlining some of the approach we’re taking to construct the next major release of Bridgetown, version 2.0. But it’s also an announcement: we have a new &lt;a href=&quot;https://community.bridgetown.pub&quot;&gt;Community site&lt;/a&gt; y’all! 🙌&lt;/p&gt;

&lt;p&gt;Part of my general burnout in 2023 was just dealing with the absolute insanity which seems to have taken over the computer industry…not the least of which is the rapid “enshittification” of commercial social networks. It really got me paranoid—not only worrying about which services were actively going sideways (&lt;em&gt;cough&lt;/em&gt; Reddit &lt;em&gt;cough&lt;/em&gt;) but which might implode next in the future. Bridgetown has relied heavily on Discord, and to a lesser extent GitHub Discussions, and, well, I’ve been growing increasingly antsy about each.&lt;/p&gt;

&lt;p&gt;So rather than wait for more shitty developments and scramble to react to them, I decided to be proactive and set up a new &lt;a href=&quot;https://community.bridgetown.pub&quot;&gt;Bridgetown Community site&lt;/a&gt;, based on Lemmy. This serves as a replacement to GitHub Discussions, and an adjunct to Discord. We’ll still rely on Discord for chit-chat (at least until something can serve as a truly suitable substitute) but look to the Community site for longer forum-style posts, technical conversations, tutorials, and something “bloggy” that’s a bit less formal than posting here on the main blog. There are some interesting tidbits there already, and I look forward to more folks in the Bridgetown ecosystem commenting there going forward!&lt;/p&gt;

&lt;p&gt;So let’s wrap up with a brief mention of what we’re announcing today as part of the “Road to Bridgetown 2.0” push. If you read my diatribe above, what I’ll say next probably won’t come as much of a shock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We’ve begun the process of de-37signals-ifying Bridgetown.&lt;/strong&gt; (Now there’s a mouthful! 😆)&lt;/p&gt;

&lt;p&gt;Here’s what this means. We have put an immediate stop to integrating any more dependencies run by 37signals in Bridgetown. In practical terms, this means no additional embrace of libraries like Active Support, and no continued investment in bundled configurations such as Turbo or Stimulus (in fact we’ll be removing these for Bridgetown 2.0). And over time (this will be very much an incremental thing), we will either &lt;em&gt;remove&lt;/em&gt; our internal dependency on Rails libraries like Active Support or &lt;em&gt;vendor&lt;/em&gt; specific code we can’t easily replace.&lt;/p&gt;

&lt;p&gt;This is certainly not ideal. The Bridgetown codebase, and community at large, has benefited from the features provided by Active Support, Turbo, and other 37signals-run projects. But as DHH so emphatically put it, “all the best finding a project that’s more to your liking in direction or leadership or otherwise somewhere else 👋”. So that’s &lt;em&gt;exactly&lt;/em&gt; what we are doing. We’ll be looking at other libraries — or in certain cases just building our own solutions — to replace the functionality we had relied on from 37signals.&lt;/p&gt;

&lt;p&gt;We take Bridgetown’s own &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/blob/main/CODE_OF_CONDUCT.md&quot;&gt;Code of Conduct&lt;/a&gt; seriously, and part of that approach means we need to be careful we don’t pull in third-party dependencies from open source projects which are themselves in violation of &lt;em&gt;their&lt;/em&gt; CoCs. We’re not in the business of policing the internet, nor can we ever vouch for all other open source projects we might ever touch in some way. But it was a &lt;em&gt;strategic decision&lt;/em&gt; originally to embrace codebases run by 37signals, and it is another strategic decision to let them go. I’ve talked about this at length with the rest of the Bridgetown core team, and we are in agreement that it’s in the best long-term interests of the Bridgetown project to take a public stand on this.&lt;/p&gt;

&lt;p&gt;So that is merely one aspect of the work that’s ongoing as we head towards Bridgetown 2.0. But thankfully, there’s a lot more that will no doubt prove more exciting and hopeful, from a minimum requirements bump to Ruby 3.1 and Node 20 to a &lt;em&gt;huge&lt;/em&gt; performance boost in development in the form of Signals-based Fast Refresh. More on that in the next blog post.&lt;/p&gt;

&lt;p&gt;The big takeaway is that I’m feeling more pumped about the future of Bridgetown than I have in many months. Between sorting out feelings of disappointment around past events, and coming up with a list of improvements to the project and the ecosystem I’m very excited to be moving forward on, a new day has dawned. 🌞&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bridgetown 2.0 represents a sort of clean break&lt;/strong&gt;, not just because we can remove deprecated APIs, streamline aspects of the codebase, and improve features in ways that will help make the framework faster and more stable, but because version 0.x represents an experiment, 1.0 represents something stable yet still new, and 2.0 represents &lt;em&gt;longevity&lt;/em&gt;. Bridgetown is here to stay. We have a full major version bump looming. And we hope you’ll stick around to see what comes next. 🤓&lt;/p&gt;

&lt;p style=&quot;text-align:center; margin-block-start: 1.5lh&quot;&gt;&lt;em&gt;Want to discuss this post? &lt;a href=&quot;https://community.bridgetown.pub/post/11&quot;&gt;Jump over to our Community site and add your comment&lt;/a&gt;&lt;/em&gt; 🔗&lt;/p&gt;</content><author><name>Jared White</name></author><category term="future" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Presenting Islands Architecture in Bridgetown 1.3 “Kelly Butte”</title><link href="https://www.bridgetownrb.com/release/bridgetown-1.3-kelly-butte/" rel="alternate" type="text/html" title="Presenting Islands Architecture in Bridgetown 1.3 “Kelly Butte”" /><published>2023-07-10T00:00:00-07:00</published><updated>2023-07-10T00:00:00-07:00</updated><id>repo://posts.collection/_posts/2023/2023-07-10-bridgetown-1.3-kelly-butte.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/bridgetown-1.3-kelly-butte/">&lt;p&gt;We’re pleased to announce the release of &lt;strong&gt;Bridgetown 1.3 “Kelly Butte”&lt;/strong&gt;. Thanks to the many contributors who have helped make this release possible!&lt;/p&gt;

&lt;p&gt;Read the &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v1.3.0&quot;&gt;release notes&lt;/a&gt; or &lt;a href=&quot;/docs/installation&quot;&gt;installation instructions&lt;/a&gt;, or to upgrade from a previous version, simply bump up the version numbers in your &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; and run:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle update bridgetown

&lt;span class=&quot;c&quot;&gt;# or&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle update bridgetown bridgetown-routes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s not mandatory that you update your esbuild config, but it’s definitely encouraged (especially if you’d like to take advantage of the latest experimental frontend features). To do so, run &lt;code class=&quot;highlighter-rouge&quot;&gt;bin/bridgetown esbuild&lt;/code&gt; to get the latest default configuration and follow the instructions. Some of the changes required a fair bit of tinkering, so if you run into any problems &lt;a href=&quot;/community&quot;&gt;please let us know&lt;/a&gt; so we can correct them right away.&lt;/p&gt;

&lt;p&gt;Here’s a rundown of some of the fixes and improvements before we get to the “flashy” new frontend-themed features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We’ve &lt;em&gt;finally&lt;/em&gt; upgraded our Faraday dependency to v2. 😅 Puma has well has been upgraded to v6.&lt;/li&gt;
  &lt;li&gt;Also the included connection helpers in the Builder API has been much improved.&lt;/li&gt;
  &lt;li&gt;Error handling and messaging is &lt;em&gt;much&lt;/em&gt; nicer now! Before, certain errors would simply crash the Bridgetown dev process, and if you were viewing your website as that happened, you might not even notice there was a problem. Now, we try to surface error messages right on the website, and the dev process is also less likely to crash. Please let us know if you continue to encounter any severe issues!&lt;/li&gt;
  &lt;li&gt;We’ve added support for Nokolexbor as a faster alternative to Nokogiri for processing HTML Inspectors.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;l&lt;/code&gt; helper is now available alongside the &lt;code class=&quot;highlighter-rouge&quot;&gt;t&lt;/code&gt; helper for localizing dates and other such strings.&lt;/li&gt;
  &lt;li&gt;The Lit and Ruby2JS bundled configurations have seen relevant updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now on to the good stuff. ;-P&lt;/p&gt;

&lt;h3 id=&quot;introducing-islands-architecture&quot;&gt;Introducing Islands Architecture&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Old and busted:&lt;/strong&gt; putting all your JavaScript, web components, and other frontend libraries in a single bundle that applies to every page on your website.&lt;br /&gt;
&lt;strong&gt;New hotness:&lt;/strong&gt; only bundling the bare minimum (if anything) for your website as a whole, and instead using “islands” on individual pages as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/docs/islands&quot;&gt;As it says in the documentation&lt;/a&gt;, the term &lt;a href=&quot;https://jasonformat.com/islands-architecture&quot;&gt;Islands Architecture&lt;/a&gt; was coined a few years ago by frontend architect Katie Sylor-Miller and further popularized by Preact creator Jason Miller. It describes a way of architecting website frontends around independent component trees, all rendered server-side initially as HTML but then “hydrated” on the frontend independently of one another.&lt;/p&gt;

&lt;p&gt;Now in Bridgetown 1.3, &lt;strong&gt;we’re bringing islands architecture to you&lt;/strong&gt; with a seamless integration between our &lt;a href=&quot;/docs/components&quot;&gt;view components&lt;/a&gt; and our &lt;a href=&quot;/docs/frontend-assets&quot;&gt;esbuild frontend bundling system&lt;/a&gt;. And for even more flexibility, you can even orient your Roda routes around “islands” for a truly modular, full-stack approach to web development.&lt;/p&gt;

&lt;p&gt;This is an early step forward for the framework, so your &lt;a href=&quot;/community&quot;&gt;feedback is crucial&lt;/a&gt; as we increasingly align our best practices with the latest improvements across the industry.&lt;/p&gt;

&lt;h3 id=&quot;declarative-shadow-dom&quot;&gt;Declarative Shadow DOM&lt;/h3&gt;

&lt;p&gt;As it so happens, islands architecture plays very nicely with an experimental new frontend feature we’re super excited about: &lt;a href=&quot;/docs/content/dsd&quot;&gt;Declarative Shadow DOM&lt;/a&gt;. You can use DSD in your &lt;a href=&quot;/docs/layouts&quot;&gt;layouts&lt;/a&gt;, &lt;a href=&quot;/docs/components&quot;&gt;components&lt;/a&gt;, and generally anywhere it would be beneficial to increase the separation between presentation logic &amp;amp; content and work with advanced scoped styling APIs. And of course, paired with islands architecture, you can essentially get “hydrated” components that are first server-rendered and then become interactive on the client-side for “free” using native browser APIs—but only when and where needed for optimal performance. Wow!&lt;/p&gt;

&lt;p&gt;We’re considering these features “experimental” for now, but rest assured, we fully expect they will become mainstays of Bridgetown websites and application architectures in the coming months and years. We can’t wait to see what you come up with!&lt;/p&gt;

&lt;h3 id=&quot;more-frequent-but-smaller-releases&quot;&gt;More Frequent but Smaller Releases&lt;/h3&gt;

&lt;p&gt;I personally have found it a bit challenging to stay on a steady release schedule this year, and I think it all stems from my reluctance to bundle “mere” fixes and tweaks into a release that doesn’t offer a marquee feature to promote. That’s my bad, and henceforth I plan to correct it. So starting now, expect to see Bridgetown 1.3.1, 1.3.2, etc. in a more rapid succession, and possibly even 1.4 that’s mostly about minor improvements.&lt;/p&gt;

&lt;p&gt;We’ll never match the release pace of some of our (ahem) JavaScript-based compatriots in the framework space, but we can do better than we have. I also intend to focus more effort on providing improved guidance for new contributors and even new core team members to hop aboard the project and make a meaningful impact.&lt;/p&gt;

&lt;p&gt;As always, if you run into any issues trying out Bridgetown &lt;a href=&quot;/community&quot;&gt;please hop into our community channels&lt;/a&gt; and let us know how we can help. If you’re new to Ruby, we’re happy to recommend other resources and communities which can give you a leg up. Cheers!&lt;/p&gt;</content><author><name>Jared White</name></author><category term="release" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/bridgetown-logo-twitter-card-2022.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>