<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://bridgetownrb.com/" version="2.1.2">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>2026-04-07T11:11:49-07:00</updated><id>https://www.bridgetownrb.com/feed.xml</id><title type="html">Bridgetown</title><subtitle>Bridgetown is a next-generation, progressive site generator &amp; fullstack framework, powered by Ruby.</subtitle><entry><title type="html">Bridgetown 2.1 Has Come to Town! Happy Holidays 🥳</title><link href="https://www.bridgetownrb.com/release/bridgetown-2-1-has-come-to-town-happy-holidays/" rel="alternate" type="text/html" title="Bridgetown 2.1 Has Come to Town! Happy Holidays 🥳" /><published>2025-12-24T08:22:54-08:00</published><updated>2025-12-24T08:22:54-08:00</updated><id>repo://posts.collection/_posts/2025/2025-12-24-bridgetown-2-1-has-come-to-town-happy-holidays.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/bridgetown-2-1-has-come-to-town-happy-holidays/">&lt;p&gt;You better watch out (I’m telling you why): the latest release of our merry little Ruby framework is coming to town! Yes indeed, &lt;strong&gt;Bridgetown 2.1 “Festive River City”&lt;/strong&gt; is here, with a marquee feature enabling you to load in wiki-style content &amp;amp; “digital gardens” managed by external applications, and a slew of other improvements. And you’d better believe we’re ready for the imminent Christmas release of &lt;strong&gt;Ruby 4.0&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;You can read more about the release details &lt;a href=&quot;/release/bridgetown-2-1-beta-1-festive-river-city/&quot;&gt;here in our initial beta post&lt;/a&gt;, and there are a couple additional details we need to mention:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We now have a brand-new &lt;strong&gt;Matrix&lt;/strong&gt; chat room! Embrace open protocols and &lt;a href=&quot;https://matrix.to/#/%23bridgetownrb:matrix.org&quot;&gt;chat with fellow Bridgetowners on Matrix&lt;/a&gt;. (We recommend you install &lt;a href=&quot;https://matrix.org/ecosystem/clients/element-x/&quot;&gt;Element X for iOS &amp;amp; Android&lt;/a&gt; so you can access Matrix via mobile platforms.)&lt;/li&gt;
  &lt;li&gt;We fully embrace Bridgetown projects configured to bundle gems from alternative community servers like &lt;strong&gt;gem.coop&lt;/strong&gt; as well as our own canonical &lt;strong&gt;gems.bridgetownrb.com&lt;/strong&gt; server. &lt;a href=&quot;/docs/installation#gem-servers&quot;&gt;Read the details here.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.1.0&quot;&gt;Read the 2.1 release notes here.&lt;/a&gt; To upgrade, make sure you’re running at least Ruby 3.2 and Node 22, then modify your &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-ruby 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;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.1.0&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown-routes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.1.0&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# if applicable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and run &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle update&lt;/code&gt;. &lt;a href=&quot;/docs/installation/upgrade&quot;&gt;Upgrade instructions here.&lt;/a&gt; Or you can run &lt;code class=&quot;highlighter-rouge&quot;&gt;gem install bridgetown -N -v 2.1.0&lt;/code&gt; and then create a new site.&lt;/p&gt;

&lt;p&gt;And of course we continue to push for awareness of “indie web” and sustainable alternatives to Big Tech solutions. Our documentation now includes &lt;a href=&quot;/docs/deployment#statichosteu&quot;&gt;information on how to deploy&lt;/a&gt; static Bridgetown sites to &lt;a href=&quot;https://statichost.eu&quot;&gt;statichost.eu&lt;/a&gt;, and our Automations feature can load automation scripts from Codeberg and GitLab repositories in addition to GitHub.&lt;/p&gt;

&lt;p&gt;If you run into any issues trying out Bridgetown 2.1, &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; and &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;the fediverse&lt;/a&gt; to stay current on the latest news.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Holidays! See y’all in the New Year!&lt;/strong&gt; 🎉 🎆&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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Let’s Get Festive! ’Tis the Season to Be Jolly with Bridgetown 2.1 Beta 1</title><link href="https://www.bridgetownrb.com/release/bridgetown-2-1-beta-1-festive-river-city/" rel="alternate" type="text/html" title="Let’s Get Festive! ’Tis the Season to Be Jolly with Bridgetown 2.1 Beta 1" /><published>2025-12-03T11:18:55-08:00</published><updated>2025-12-03T11:18:55-08:00</updated><id>repo://posts.collection/_posts/2025/2025-12-03-bridgetown-2-1-beta-1-festive-river-city.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/bridgetown-2-1-beta-1-festive-river-city/">&lt;p&gt;A mere three months after &lt;a href=&quot;/release/bridgetown-v2-river-city-released/&quot;&gt;the release of Bridgetown 2.0&lt;/a&gt; and we’re already onto 2.1?! What can I say…when you’re on a roll, you’re on a roll. And things are definitely rolling here in Bridgetown as we celebrate our &lt;strong&gt;“Festive River City 🥳”&lt;/strong&gt; (we just couldn’t part ways with the River City branding just yet, hence our “Snow Leopard” style code name!).&lt;/p&gt;

&lt;p&gt;With the end-of-year holidays upon us, we’re excited to be presenting several exciting new features and yet more under-the-hood refactoring &amp;amp; infrastructure work which sets us up well for future feature development in 2026. While there are possibly some breaking changes in 2.1 (which is why we opted for a beta cycle), we hope to mitigate those as much as possible or offer clear instructions on how to correct swiftly. Your feedback during the beta is most appreciated!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.1.0.beta1&quot;&gt;Read the release notes here.&lt;/a&gt; To test your sites with the 2.1 beta, modify your &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-ruby 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;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.1.0.beta1&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown-routes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.1.0.beta1&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# if applicable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and run &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle update&lt;/code&gt;. Or you can run &lt;code class=&quot;highlighter-rouge&quot;&gt;gem install bridgetown -N -v 2.1.0.beta1&lt;/code&gt; to create a new site.&lt;/p&gt;

&lt;h3 id=&quot;external-content-sources-markdown-apps-digital-gardens-wikis-etc&quot;&gt;External Content Sources (Markdown Apps, Digital Gardens, Wikis, etc.)&lt;/h3&gt;

&lt;p&gt;Have you ever thought to yourself: “Self, wouldn’t it be awesome if I could just point Bridgetown at a folder full of Markdown files and it would just render??”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your wish is our command.&lt;/strong&gt; ✨&lt;/p&gt;

&lt;p&gt;In Bridgetown 2.1, you can now add one or more “external content” sources via an initializer which can be literally any folder on the filesystem, even the parent folder! Yes, Bridgetown now supports “folder inversion” as an alternative installation approach, which means in addition to placing Markdown files and related assets in &lt;code class=&quot;highlighter-rouge&quot;&gt;src&lt;/code&gt;, you can write Markdown in the folder &lt;em&gt;above&lt;/em&gt; where Bridgetown is installed (and in various subfolders thereof). Not only that, but &lt;strong&gt;front matter is completely optional!&lt;/strong&gt; This is perfect for “digital gardens”, wikis, and other file-based content systems managed by third-party Markdown apps such as Obsidian. (And you’d better believe we have a whole bunch of wiki-themed improvements in mind for future releases.) 😎 &lt;a href=&quot;/docs/content/external-sources&quot;&gt;Read our docs for more information.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;universal-rendering-for-partials--components&quot;&gt;Universal Rendering for Partials &amp;amp; Components&lt;/h3&gt;

&lt;p&gt;A limitation of how our rendering system worked for partials in the past was that you could only use partials within the same template engine. So if you were writing an ERB template, you couldn’t use a Serbea partial. Or if you were in a Serbea template, you couldn’t use a pure Ruby (&lt;code class=&quot;highlighter-rouge&quot;&gt;.rb&lt;/code&gt;) partial.&lt;/p&gt;

&lt;p&gt;That has now been fixed! Any template engine can render any partial whether ERB, Serbea, or pure Ruby. On top of that, you can now render both partials &amp;amp; components to strings from any context (not just within a template)—including the console! &lt;a href=&quot;/docs/template-engines/erb-and-beyond#universal-rendering&quot;&gt;Read our docs for more information.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Speaking of the console, you now have access to the &lt;a href=&quot;https://github.com/rack/rack-test&quot;&gt;Rack::Test&lt;/a&gt; DSL (if the gem is installed, which happenes automatically if you use the &lt;code class=&quot;highlighter-rouge&quot;&gt;minitesting&lt;/code&gt; bundled configuration). This is great for testing both static &amp;amp; dynamic routes directly within the REPL.&lt;/p&gt;

&lt;h3 id=&quot;samovar-freyia-and-custom-commands&quot;&gt;Samovar, Freyia, and Custom Commands&lt;/h3&gt;

&lt;p&gt;In Bridgetown 2.1, we’ve migrated away from using Thor for our command-line interface (CLI) and are now using &lt;a href=&quot;https://github.com/ioquatix/samovar&quot;&gt;Samovar&lt;/a&gt;, created by Samuel Williams. It provides a straightforward, modern, and elegant way to write commands, and as a bonus, we’ve made it much easier for you to extend Bridgetown’s CLI with your own commands in any project! Just create a &lt;code class=&quot;highlighter-rouge&quot;&gt;config/custom_commands.rb&lt;/code&gt; file and add your own &lt;code class=&quot;highlighter-rouge&quot;&gt;Bridgetown::Command&lt;/code&gt; subclasses. We believe in most cases this is a more powerful &amp;amp; flexible solution than authoring new Rake tasks. &lt;a href=&quot;/docs/plugins/commands&quot;&gt;Read our docs for more information.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that for the 2.1 release cycle, we have provided a Thor “shim” so existing sites and plugins which provide Thor commands should continue to work as before. In a future release, we will be removing the shim so please update your commands accordingly. In the meantime, if you run into any compatibility issues with the shim please report them and let us know!&lt;/p&gt;

&lt;p&gt;Another of our prior uses of Thor was for the Automations functionality (which also powers our Bundled Configurations). Because this functionality is so important, and also near-impossible to replicate verbatim using an alternative library, we have &lt;em&gt;extracted&lt;/em&gt; the “actions” &amp;amp; “shell” portions of Thor as a hard fork out to a new gem called &lt;a href=&quot;https://codeberg.org/jaredwhite/freyia&quot;&gt;Freyia&lt;/a&gt;. We will be actively developing Freyia as its own independent project going forward, refactoring and adding new features as needed.&lt;/p&gt;

&lt;h3 id=&quot;removal-of-active-support&quot;&gt;Removal of Active Support&lt;/h3&gt;

&lt;p&gt;As part of our pledge to ensure Bridgetown is free of dependencies directly managed by 37signals, we have finialized the removal of the Active Support gem. If you have written your own code which assumes the availability of Active Support, you may need to &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle add activesupport&lt;/code&gt; and require pieces of it yourself. For example, if you want to use &lt;code class=&quot;highlighter-rouge&quot;&gt;.blank?&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;.present?&lt;/code&gt;, etc., add the gem and include the following in your &lt;code class=&quot;highlighter-rouge&quot;&gt;config/initializers.rb&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-ruby 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;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;active_support/core_ext/object/blank&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://guides.rubyonrails.org/v8.0/active_support_core_extensions.html&quot;&gt;Documentation on Active Support is available here.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;supporting-alternatives-to-big-tech&quot;&gt;Supporting Alternatives to Big Tech&lt;/h3&gt;

&lt;p&gt;We continue to push for awareness of “indie web” and sustainable alternatives to Big Tech solutions. Our documentation now includes &lt;a href=&quot;/docs/deployment#statichosteu&quot;&gt;information on how to deploy&lt;/a&gt; static Bridgetown sites to &lt;a href=&quot;https://statichost.eu&quot;&gt;statichost.eu&lt;/a&gt;, and our Automations feature can load automation scripts from Codeberg and GitLab repositories in addition to GitHub.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;As always if you run into any issues trying out Bridgetown 2.1, &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; and &lt;a href=&quot;https://ruby.social/@bridgetown&quot;&gt;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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Welcome Our Newest Core Team Member: Felipe Vogel</title><link href="https://www.bridgetownrb.com/news/welcome-felipe-vogel-to-our-core-team/" rel="alternate" type="text/html" title="Welcome Our Newest Core Team Member: Felipe Vogel" /><published>2025-10-08T00:00:00-07:00</published><updated>2025-10-08T00:00:00-07:00</updated><id>repo://posts.collection/_posts/2025/2025-10-08-welcome-felipe-vogel-to-our-core-team.md</id><content type="html" xml:base="https://www.bridgetownrb.com/news/welcome-felipe-vogel-to-our-core-team/">&lt;p&gt;We’ve very excited to announce that &lt;strong&gt;Felipe Vogel&lt;/strong&gt; has joined the Bridgetown Core Team! Felipe is a developer based in Lexington, Kentucky, and originally hails from Brazil. He has been an enthusiastic user of Bridgetown for a long time now. In fact…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/felipe-vogel-avatar.jpg&quot; alt=&quot;avatar of Felipe Vogel&quot; style=&quot;border-radius: 100%; inline-size: 40vw; max-inline-size: 200px; float: right; margin-inline-start: 1rem; margin-block-end: 1rem&quot; /&gt;
…When Felipe was first learning Ruby, Bridgetown was the first Ruby web framework that he picked up. Eventually he got into Rails and other tools as well, but that’s quite an amazing story. Here are a few other &lt;a href=&quot;https://fpsvogel.com&quot;&gt;fun facts about Felipe from his website&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“&lt;strong&gt;I used to be a humanities teacher&lt;/strong&gt; in a former career that took me all the way to West Africa.”&lt;/li&gt;
  &lt;li&gt;“&lt;strong&gt;I grew up in Brazil&lt;/strong&gt; in southern Amazonia, at times living with the Jarawara indigenous people, in a village that you can see on Google Maps.”&lt;/li&gt;
  &lt;li&gt;“&lt;strong&gt;I’m a big Latin nerd.&lt;/strong&gt; In grad school I took most of my classes in Latin and lived in the unofficial &lt;em&gt;domus Latina&lt;/em&gt; (Latin house), where we spoke only Latin except when we had guests… which, as you might guess, was rare 😂”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll start to see Felipe a bit more in our &lt;a href=&quot;https://discord.gg/4E6hktQGz4&quot;&gt;Discord chat&lt;/a&gt;, taking a peek at new PRs, and in other community endeavors. You can also find Felipe in the fediverse: &lt;a href=&quot;https://ruby.social/@fpsvogel&quot;&gt;@fpsvogel@ruby.social&lt;/a&gt;. We’re glad to have Felipe aboard the USSG Bridgetown! 🫡&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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Good Times in River City: Bridgetown 2.0 is Here!</title><link href="https://www.bridgetownrb.com/release/bridgetown-v2-river-city-released/" rel="alternate" type="text/html" title="Good Times in River City: Bridgetown 2.0 is Here!" /><published>2025-09-16T09:01:23-07:00</published><updated>2025-09-16T09:01:23-07:00</updated><id>repo://posts.collection/_posts/2025/2025-09-16-bridgetown-v2-river-city-released.md</id><content type="html" xml:base="https://www.bridgetownrb.com/release/bridgetown-v2-river-city-released/">&lt;figure style=&quot;max-width: 840px; margin: 0 auto 2.5em&quot;&gt;
  &lt;img src=&quot;/images/river-city-postcard-bridgetown.jpg&quot; alt=&quot;Greetings from River City! Bridgetown v2 Web Framework&quot; style=&quot;display: block; box-shadow: 0px 10px 30px rgba(0,0,0,0.2); border-radius: 4px&quot; /&gt;
  &lt;figcaption style=&quot;font-size: 80%; margin: 0.5rem; text-align: right&quot;&gt;&lt;a href=&quot;https://adrianvalenz.com&quot; target=&quot;_blank&quot;&gt;Graphic Design by Adrian Valenzuela&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Introducing the only Ruby web framework which bridges the gap between static Markdown sites and fullstack database-driven application deployments: &lt;strong&gt;Bridgetown 2.0 “River City” has been released!&lt;/strong&gt; 🎉 This version has long been in the hopper, and it’s chock full of major quality-of-life improvements (&lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.0.0&quot;&gt;check out the release notes!&lt;/a&gt;). Start your first Bridgetown site with our &lt;a href=&quot;/docs&quot;&gt;installation guide&lt;/a&gt;, or upgrade your site by bumping the version in your Gemfile:&lt;/p&gt;

&lt;div class=&quot;language-ruby 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;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.0&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bridgetown-routes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;~&amp;gt; 2.0&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# if applicable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and running &lt;code class=&quot;highlighter-rouge&quot;&gt;bundle update&lt;/code&gt;. &lt;a href=&quot;/docs/installation/upgrade&quot;&gt;More upgrade details here&lt;/a&gt;, including switching from Yarn to NPM and from CommonJS to ESM for a modern, streamlined frontend build system. If you run into any issues, &lt;a href=&quot;https://discord.gg/4E6hktQGz4&quot;&gt;hop in our Discord chat&lt;/a&gt; and let us know how we can help you!&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;&lt;strong&gt;A huge thank you to our many contributors!&lt;/strong&gt; 🎉 ayushn21, KonnorRogers, michaelherold, erickguan, MaxLap, jeremyevans, brainbuz, akarzim, surrim, mlitwiniuk, jaredcwhite, and everyone who submitted bug reports and feedback. We couldn’t have done this without you!&lt;/p&gt;

&lt;p&gt;Also, if you’re brand-new to the Bridgetown 2.0 release cycle, &lt;a href=&quot;/blog&quot;&gt;read our Road to Bridgetown 2.0 series here&lt;/a&gt;.&lt;/p&gt;
&lt;/sl-alert&gt;

&lt;p&gt;Now without further ado, let’s talk about all the new features in &lt;strong&gt;Bridgetown v2 “River City”.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-defaults&quot;&gt;New Defaults&lt;/h3&gt;

&lt;p&gt;When you create a new Bridgetown site, you will now get &lt;strong&gt;ERB templates&lt;/strong&gt; installed automatically (rather than the previous default of Liquid). We believe this is much more ergonomic for Ruby developers, but if you work with designers who are more familiar with Liquid, that is still officially supported. (For existing sites based on Liquid, add &lt;code class=&quot;highlighter-rouge&quot;&gt;template_engine :liquid&lt;/code&gt; to your &lt;code class=&quot;highlighter-rouge&quot;&gt;config/initializers.rb&lt;/code&gt; file or &lt;code class=&quot;highlighter-rouge&quot;&gt;template_engine: liquid&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;bridgetown.config.yml&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;Bridgetown now requires a minimum version of Ruby 3.1.4 and Node 20.6. This unlocks a variety of syntax improvements both for our internal Ruby APIs and the Ruby code you write in your projects. And with the Node upgrade, we can now switch our esbuild config from the older CommonJS syntax (aka &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt;) to modern ESM (aka &lt;code class=&quot;highlighter-rouge&quot;&gt;import&lt;/code&gt;) which is the industry standard and much more expected for frontend JavaScript developers. In addition, Yarn is no longer required as a JS package manager—you can switch to using NPM directly which is a far better tool now than it once was. Or if you prefer, &lt;code class=&quot;highlighter-rouge&quot;&gt;pnpm&lt;/code&gt; which is also supported! (Just make sure you update the &lt;code class=&quot;highlighter-rouge&quot;&gt;:frontend&lt;/code&gt; tasks in your project’s &lt;code class=&quot;highlighter-rouge&quot;&gt;Rakefile&lt;/code&gt; to use your preferred package manager.)&lt;/p&gt;

&lt;p&gt;New sites will default to including just the newer Ruby initializers configuration (&lt;code class=&quot;highlighter-rouge&quot;&gt;config/initializers.rb&lt;/code&gt;), but the legacy YAML config (&lt;code class=&quot;highlighter-rouge&quot;&gt;bridgetown.config.yml&lt;/code&gt;) is still supported and may still be required for certain plugins.&lt;/p&gt;

&lt;p&gt;Finally, webpack is no longer supported. Bridgetown is all in on esbuild as the “last frontend bundler you’ll ever need”. Make sure you search-and-replace &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack_path&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;asset_path&lt;/code&gt; in your templates!&lt;/p&gt;

&lt;h3 id=&quot;fast-refresh&quot;&gt;Fast Refresh&lt;/h3&gt;

&lt;p&gt;You know how frustrating it is when you fix a simple typo on a large site and then you have to wait 20 seconds for a rebuild? Well I don’t, because I’ve been rocking the betas for months! 😂 But in all seriousness, this is a fantastic new feature in Bridgetown 2.0, based on a pair of techniques called &lt;em&gt;signals&lt;/em&gt; and &lt;em&gt;effects&lt;/em&gt; to track changes to individuals files and the ways in which data can flow across multiple files.&lt;/p&gt;

&lt;p&gt;In not all, but in most cases, &lt;strong&gt;this results in a much faster rebuild time.&lt;/strong&gt; If you edit just a single resource file, it’s likely only that one resource will get rebuilt. Using the new &lt;code class=&quot;highlighter-rouge&quot;&gt;site.signals&lt;/code&gt; API, you can edit data files and only the pages loading in that data will get rebuilt. Fast refresh also tracks access to components within templates. &lt;a href=&quot;/future/road-to-bridgetown-2.0-fast-refresh/&quot;&gt;Read our original announcement blog post&lt;/a&gt; for a deep dive into this functionality.&lt;/p&gt;

&lt;h3 id=&quot;superior-roda-integration&quot;&gt;Superior Roda Integration&lt;/h3&gt;

&lt;p&gt;Bridgetown provides a &lt;a href=&quot;/docs/routes&quot;&gt;full SSR pipeline built on top of the Roda web toolkit&lt;/a&gt;. You can handle form data or JSON payloads with ease, or power up our dynamic, file-based routing with all of Bridgetown’s template engines and component rendering at your disposal.&lt;/p&gt;

&lt;p&gt;This was all true prior to 2.0, but what’s new is we’ve added a lot more smarts to Roda for building object-oriented backend APIs out of modular building blocks. You can keep the Roda routing tree lean-and-mean and rely on “controller” and “view” style objects for a familiar pattern to fullstack application development. Want to access a database like PostgreSQL? Our new &lt;a href=&quot;https://github.com/bridgetownrb/bridgetown_sequel&quot;&gt;bridgetown_sequel plugin&lt;/a&gt; is the answer you seek.&lt;/p&gt;

&lt;p&gt;Check out our &lt;a href=&quot;/docs/roda&quot;&gt;Roda reference guide&lt;/a&gt; as well as our updated &lt;a href=&quot;/docs/routes&quot;&gt;Routes guide&lt;/a&gt; to get up to speed.&lt;/p&gt;

&lt;h3 id=&quot;streamlined&quot;&gt;Streamlined&lt;/h3&gt;

&lt;p&gt;This is a &lt;a href=&quot;https://codeberg.org/jaredwhite/streamlined&quot;&gt;new library&lt;/a&gt; installed with Bridgetown for embedding HTML templates in pure Ruby code using “squiggly heredocs” along with a set of helpers to ensure output safety (proper escaping) and easier interplay between HTML markup and Ruby code. &lt;strong&gt;And it’s fast: roughly 50% faster than ERB!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use Streamlined directly in resources saved as pure Ruby (&lt;code class=&quot;highlighter-rouge&quot;&gt;.rb&lt;/code&gt;), as well as in Bridgetown components. Here’s an example of what that looks like:&lt;/p&gt;

&lt;div class=&quot;language-ruby 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;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SectionComponent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Bridgetown&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Component&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@variant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@heading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;heading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;options&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;heading&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;~&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HTML&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
      &amp;lt;h3&amp;gt;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@heading&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;}&amp;lt;/h3&amp;gt;
&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;    HTML&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;template&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;~&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HTML&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
      &amp;lt;section &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html_attributes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;variant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&amp;gt;
        &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;heading&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;}
        &amp;lt;section-body&amp;gt;
          &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;}
        &amp;lt;/section-body&amp;gt;
      &amp;lt;/section&amp;gt;
&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;    HTML&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You may still prefer to author HTML in a “markup first” manner with embedded Ruby, rather than Ruby with embedded HTML (and sometimes I do), but for components with complex interpolations, Streamlined is a win. &lt;a href=&quot;/docs/template-engines/erb-and-beyond#streamlined&quot;&gt;Read the new documentation here.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;foundation-gem&quot;&gt;Foundation Gem&lt;/h3&gt;

&lt;p&gt;In Bridgetown 2.0, we have started an ongoing process of reducing our reliance on the Active Support gem (in the hopes we can eventually remove it as a dependency). The &lt;strong&gt;Foundation gem&lt;/strong&gt; marks our effort in this department, and not only that but we’ll be increasingly migrating other useful utility-like Ruby features there from internal Bridgetown APIs so that they’re more decoupled and easily accessible to non-Bridgetown Ruby applications. &lt;a href=&quot;/docs/plugins/foundation-gem&quot;&gt;Foundation gem docs are available here.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;ecosystem-update-hello-codeberg&quot;&gt;Ecosystem Update (Hello Codeberg!)&lt;/h3&gt;

&lt;p&gt;We’ve had a goal in mind to embark on a &lt;strong&gt;major revamp of our Plugins directory&lt;/strong&gt; as well as offer a program to help new plugin authors get started and eventually featured in official Bridgetown marketing. While those ideas were brewing, a huge shakeup has started in the open source community. Due to Microsoft’s major “vibe shift” with how it stewards GitHub—essentially embarking on a “pivot to AI” and folding the company into its own AI &amp;amp; cloud departments, many open source developers are looking elsewhere for a true &lt;em&gt;libre&lt;/em&gt; alternative. (It’s odd when you stop and think about it that a &lt;em&gt;proprietary, closed-source platform&lt;/em&gt; would be the defacto home for open source projects!)&lt;/p&gt;

&lt;p&gt;The destination folks are heading for more and more is &lt;a href=&quot;https://codeberg.org&quot;&gt;Codeberg&lt;/a&gt;, a European organization which runs a forge built on top of the fully open source &lt;a href=&quot;https://forgejo.org&quot;&gt;Forgejo software&lt;/a&gt; (itself a fork of Gitea). Codeberg has really seemed to reach escape velocity this year, and I (Jared) have already &lt;a href=&quot;https://codeberg.org/jaredwhite/.profile/projects/22897&quot;&gt;migrated a number of projects there&lt;/a&gt;, including several low-level Bridgetown dependencies.&lt;/p&gt;

&lt;p&gt;We don’t feel comfortable with the idea of relocating the &lt;strong&gt;Bridgetown monorepo&lt;/strong&gt; itself at this time, out of concern that it will be cumbersome for existing and potential contributors. But the Bridgetown core team is committed to keeping a close watch on how this movement unfolds. One of the most exiting future developments will be &lt;em&gt;federation&lt;/em&gt;, the idea that multiple forges run by individuals and organizations alike could all communicate with each other, sharing issues and PRs as if it were all a single platform (just like Mastodon instances!). We believe this will be a seismic event in the evolution of code forges and signal the beginning of the end of GitHub’s dominance in the open source community. As they say, &lt;em&gt;stay tuned&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;et-cetera-and-so-forth&quot;&gt;Et Cetera and So Forth&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bridgetownrb/bridgetown/releases/tag/v2.0.0&quot;&gt;There’s much more in the release notes&lt;/a&gt; showing a large number of bug fixes and refactors for performance and DX, and while software is of course never “done”, we are &lt;strong&gt;extremely proud&lt;/strong&gt; of the Bridgetown 2.0 release and consider its full feature set to be the culmination of several years of effort. It’s likely we’ll continue to chip away at the margins of smaller fixes and enhancements for a long while yet in the v2 era, but the bottom line is that &lt;strong&gt;Bridgetown is a mature and stable foundation&lt;/strong&gt; on which to build the next generation of static sites and modest web applications, always with HTML-first and “vanilla web” principles in mind.&lt;/p&gt;

&lt;p&gt;If you run into any issues trying out Bridgetown 2.0, &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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.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://codeberg.org/jaredwhite/streamlined/src/commit/7aed52d4fe60f5315d228075a06b80a3fbc6d816/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://codeberg.org/jaredwhite/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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.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://codeberg.org/jaredwhite/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/river-city-postcard-bridgetown.jpg" /><media:content medium="image" url="https://www.bridgetownrb.com/images/river-city-postcard-bridgetown.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>