{"version":"1.0","type":"rich","provider_name":"Acast","provider_url":"https://acast.com","height":250,"width":700,"html":"<iframe src=\"https://embed.acast.com/$/65de32896569fa0017d17653/69049f9f3906f8011aae8ee0?\" frameBorder=\"0\" width=\"700\" height=\"250\"></iframe>","title":"Brut-al Death (with David Bryant Copeland)","description":"<p>In this episode, Dave Copeland discusses Brut, his Ruby web framework built atop Sinatra that prioritizes “simple over easy” design principles. Brut replaces traditional MVC with pages, forms, and handlers, uses Flex for HTML generation, Sequel for database access, and lightweight tools like BrutCSS and BrutJS for styling and interactivity, emphasizing direct alignment with web standards. It eliminates free-form parameter hashes by injecting structured objects, mirrors HTML for form validations, and defaults to a strict, Postgres-only setup with non-nullable fields, required foreign keys, and built-in observability through OpenTelemetry and a strict Content Security Policy. Dave and Jared also discuss modern browser-based CSRF protections, the philosophy behind Brut’s defaults, and how Dave aims to refine it toward a 1.0 release with real-world apps and clear migration paths for Rails developers, positioning Brut as a lightweight, standards-aligned alternative within the Ruby ecosystem.</p><p><br></p><p><strong>Links:</strong></p><p><br></p><p><a href=\"https://brutrb.com\" rel=\"noopener noreferrer\" target=\"_blank\">Brut</a></p><p><a href=\"https://sinatrarb.com\" rel=\"noopener noreferrer\" target=\"_blank\">Sinatra</a></p><p><a href=\"https://hanamirb.org\" rel=\"noopener noreferrer\" target=\"_blank\">Hanami</a></p><p><a href=\"https://sequel.jeremyevans.net\" rel=\"noopener noreferrer\" target=\"_blank\">Sequel</a></p><p><a href=\"https://tachyons.io\" rel=\"noopener noreferrer\" target=\"_blank\">Tachyons</a></p><p><a href=\"https://tailwindcss.com\" rel=\"noopener noreferrer\" target=\"_blank\">Tailwind CSS</a></p><p><a href=\"https://opentelemetry.io\" rel=\"noopener noreferrer\" target=\"_blank\">OpenTelemetry</a></p><p><a href=\"https://www.postgresql.org\" rel=\"noopener noreferrer\" target=\"_blank\">PostgreSQL</a></p><p><a href=\"https://developer.mozilla.org\" rel=\"noopener noreferrer\" target=\"_blank\">MDN Web Docs</a></p><p><a href=\"https://www.elektron.se/en/digitakt\" rel=\"noopener noreferrer\" target=\"_blank\">Elektron Digitakt</a></p><p><a href=\"https://www.ableton.com/en/live\" rel=\"noopener noreferrer\" target=\"_blank\">Ableton Live</a></p><p><a href=\"https://guides.rubyonrails.org/active_record_basics.html\" rel=\"noopener noreferrer\" target=\"_blank\">ActiveRecord</a></p><p><a href=\"https://coffeescript.org\" rel=\"noopener noreferrer\" target=\"_blank\">CoffeeScript</a></p><p><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\" rel=\"noopener noreferrer\" target=\"_blank\">Content Security Policy (CSP)</a></p><p><a href=\"https://www.infoq.com/presentations/Simple-Made-Easy\" rel=\"noopener noreferrer\" target=\"_blank\">Rich Hickey – “Simple Made Easy” talk</a></p><p><a href=\"https://rubygems.org/gems/burg\" rel=\"noopener noreferrer\" target=\"_blank\">Burg.rb</a></p><p><br></p><p><strong>Dead Code Podcast Links:</strong></p><p><br></p><p><a href=\"https://hachyderm.io/@deadcode\" rel=\"noopener noreferrer\" target=\"_blank\">Mastodon</a></p><p><a href=\"https://twitter.com/DeadCodePod\" rel=\"noopener noreferrer\" target=\"_blank\">X</a></p><p><br></p><p><strong>Jared’s Links:</strong></p><p><br></p><p><a href=\"https://supergood.social/@jared\" rel=\"noopener noreferrer\" target=\"_blank\">Mastodon</a></p><p><a href=\"https://twitter.com/jardonamron\" rel=\"noopener noreferrer\" target=\"_blank\">X</a></p><p><a href=\"https://www.twitch.tv/jardonamron\" rel=\"noopener noreferrer\" target=\"_blank\">twitch.tv/jardonamron</a></p><p><a href=\"https://jardo.dev\" rel=\"noopener noreferrer\" target=\"_blank\">Jared’s Newsletter &amp; Website</a></p><p><br></p><p><a href=\"https://docs.google.com/document/d/1Cq7PIMyA5neT-O1Gtc8gtM4OY52GwkTdKm5i9DsYXgs/edit?tab=t.0\" rel=\"noopener noreferrer\" target=\"_blank\">Episode Transcript</a></p>","author_name":"Jared Norman"}