Kaigi 2026 Is Approaching — Why the Global Ruby Community Should Pay Close Attention March 2, 2026 With April approaching, RubyKaigi 2026 is about to take place in Hakodate, Japan — and for the global Ruby community, this is not just another date on the calendar. It is a moment that often defines the technological … Continue reading
Kaigi 2026 Is Approaching — Why the Global Ruby Community Should Pay Close Attention
Continuations 2026/09: Body parsing
This week I finished a particularly satisfying piece of work: adding request body parsing to Hanami Action. This finishes the story we started back in Hanami 2.3, where we significantly improved Hanami Action’s
formatshandling. Now you can also useformatsto ensure your bodies are appropriately parsed for your expected media type handling.
With this change, Hanami Actions can now serve as fully standalone mini Rack apps, along with everything you’d expect from params handling. It also means we can do away with the one-step-too-far-removed-and-awkward-to-configure body parser middleware that until now we’ve needed in full Hanami apps. Step by step, things get cleaner and better…I had the pleasure of reviewing a range of things…
Customize Model URLs with to_param
Rails models default to using their ID in URLs: /articles/42. The to_param method lets you customize this—use a slug, hide the ID, or combine both for readable URLs. Exposing IDs isn’t dangerous if you scope access properly, but you might want cleaner paths.
Instead of…
…exposing IDs in your URLs:
redirect_to article_path(@article)
# => "/articles/42"
Use…
…the to_param method to return a slug instead:
class Article < ApplicationRecord
before_save { self.slug = title.parameterize }
def to_param = slug
end
redirect_to article_path(@article)
# => "/articles/understanding-rails-extensions"
Then find records by slug in your controller:
def set_article
@article = Article.find_b…For…
Optimizations
Direct link to podcast audio file
Sure feels like some combination of AI, the US military, and the AI military could bring an end to the world any day now, so I figured I'd better record one last show for posterity. Welcome me on this version's speedrun to the apocalypse!
So long as the EMP blasts don't nuke all our ham radios, write in to podcast@searls.co and I'll read it on the next release of the program. Over.
Be sure to click all these links while the clickin's good:
htmx Infinite Scroll
Pagination is always a feature you have to tackle in web application development in one form or another. A common approach is to use a gem, like Pagy, to provide the following capabilities:
-
Load records in batches (a.k.a. pages).
-
Previous and next links.
-
Numbered links to specific pages.
-
Bookmarkable links complete with browser history.
Definitely useful to decrease server load since you’re only loading a small subset of records per request. The problem with this approach is:
-
Most people bail after reading through the first couple of pages and not finding what they want.
-
Includes a lot visual information, design-wise, that not only consumes…
We can do better. With infinite scrolling, we…
CVE-2026-0980 (rubyipmi): rubyipmi is vulnerable to OS Command Injection through malicious usernames
Hey there, it’s Emmanuel Hayford. A fresh batch of Rails changes just dropped, let’s get into it.
Action Text to_markdown generates markdown links for blobs
When a rendering context is available, blob attachments now produce real markdown links ( for images, [title](url) for others) instead of plain-text placeholders.
Add to_markdown to Action Text, mirroring to_plain_text
Introduces to_markdown across the Action Text stack (Content, Fragment, RichText, Attachment), converting rich text HTML into Markdown with support for inline formatting, block elements, lists, links, tables, and more. The underlying BottomUpReducer has been extracted into its own class for reuse by both…
Render MissingAttachable as “☒” in plain text
MissingAttachable now implements …
Post your Prompts
This post is mostly a reaction and reflection on Jon Sully’s “Generative AI and Tech Writing: The Right Answer is to Disclose.” Strong agree! I wanted to zoom in on one part of Jon’s post: “Just Give Me the Prompt”
Seriously. If you are blogging, a prompt is good enough. It’s great! If you’ve got a thought or idea that you want to share with the world, just post that idea. It’s enough.
Jon’s post caused me to reflect on my own writing process. Over the course of the nearly 20 years (!) I’ve been writing here, I’ve become much more comfortable incorporating my initial “gosh, I have this thing to say in my head and I want to get it out”-compulsion into the the thing I…
LiveComponent with Cameron Dutro
Cameron Dutro returns to the show to introduce LiveComponent, a new library that adds client-side state and targeted re-rendering to Rails ViewComponent using Hotwire + Stimulus with minimal JavaScript. Chris, Andrew, and Cameron dig into why he built it, how it serializes component state and models, how updates flow from events to fast server-rendered HTML morphs, where it shines compared to plain Turbo/Stimulus, and how optional React support can help with migration and interoperability. Hit download now to hear more!
Links
- Judoscale- Remote Ruby listener gift
- Cameron Dutro GitHub
- Cameron Dutro X
- Remote Ruby-Episode 134: Kubernetes, JSX for Ruby, and more with Cameron Dutro
- LiveComponent
- LiveCo…
Honeybadger is an application health monitoring tool built by developers for…
One of my priorities this quarter was running a few AI pilot experiments. This was one of them.
When I mentioned the project to a teammate, he said, “You should write this up.” So here we are.
Others on our team had already been exploring embeddings, vector databases, and RAG. I’d been watching from the sidelines… until it was time to roll up my sleeves and build something myself.
The Problem
At Planet Argon, we manage several client projects. We live in Jira (I know… I know…). We keep decisions in Confluence. We ship code from GitHub. Over years a lot of institutional knowledge piles up across those systems… past bugs, old tradeoffs, and the “we tried that once” stories.
The problem…
Heroku: What’s Next
In a move that surprised many of us — and one which I still can’t determine the business sense in making at all — Salesforce officially announced last week that Heroku will be moving into a “sustaining engineering model”. That’s essentially giant-software-corporation-speak for, “we’re putting this into maintenance mode”. The platform that taught a generation of developers to “push to deploy” has reached its investment limit from its owners 😕.
"Our work here is done"
Now, before you jump straight to “abandon ship!!”, there are real questions we should think about when looking ahead. Heroku is still an excellent platform, runs very stably,…
Behind the Fizzy Infrastructure
In this episode of RECORDABLES, we dive into the infrastructure journey behind Fizzy. Lead Programmer Kevin McConnell walks through the ambitious plan to give every customer their own SQLite database and the challenges the team ran into along the way. What started as a unique way to support both self-hosted and SaaS models evolved into a performance experiment, pushing multi-tenant design further than we had before.
But as launch day approached, the tradeoffs became harder to ignore. Kevin shares what worked, what got complicated, and the pivotal decision — days before release — to unwind months of work and revert to a more conventional setup. This conversation is a candid look at…
We're excited to announce that Ruby will participate in Google Summer of Code (GSoC) 2026! This program offers new open source contributors the chance to work on impactful projects supporting the Ruby ecosystem, such as RubyGems.org, RubyGems, and Bundler, with guidance from experienced mentors.
Google Summer of Code is an annual program run by Google that pairs open source organizations with new contributors (18+ years old with less than two years of open source experience). Contributors receive a stipend from Google to work on a defined project over roughly 12 weeks.
How to get involved
Our contributor wiki has everything you need to get started: project ideas, guidance on writing a strong…
I had never personally worked with embeddings, vector databases, or retrieval-augmented generation before this project. I knew the words. I did not know where the sharp edges were. Folks on our team do… but I felt it was time to wrap my own head around it.
What I did have was a real problem, a team that loves Ruby, and enough curiosity to see where things broke.
This is the story of that experiment… what worked, what surprised me, and what I’d tell another Ruby developer who’s considering something similar.
The Problem
At Planet Argon, we manage several client projects. We live in Jira (I know… I know…). We keep decisions in Confluence. We ship code from GitHub. Over years a lot of…
#789 — February 26, 2026
Ruby Weekly
Rage: The Modern, Real-Time Ruby Framework — We don’t mention Rage enough! 😅 It’s a high-performance fiber-based framework suited for concurrent workloads involving WebSockets, real-time communication, async jobs, etc. and it’s Rails compatible! This week’s v1.21.0 release makes it easier to adopt with an official set of agent skills to use. GitHub repo.
Roman Samoilov
💡 I think Rage's SKILL.md file is a good primer for humans too, really…
🚀 CTO-Ready Rails Upgrade Estimates. No AI Hallucinations — AI can’t replace hard-earned experience. The…
The first time I visited GitHub's HQ2 in 2012, they had a TV showing off their first animations of Mona and were using it to push their new tagline: Social Coding. The phrase certainly captured the moment we were living in, so in 2014, I borrowed it for the title of one of my more popular conference talks, The Social Coding Contract. The goal of that presentation was to warn audiences of the long-term risks of all these tools making it so trivially easy to publish and consume open source dependencies. Sure enough, what followed was a decade defined by the productive and destructive chaos of a ceaseless deluge of useful, but poorly-understood and under-maintained dependencies.
Thanks to the…

Konstantin Vinogradov, an open source and infra VC investor, and his co-founders are building the first permanent funding model for critical open source infrastructure. We dive into why OSE stands a chance at battling the Nebraska problem, and how Evil Martians contributed as a pro-bono donor.
If you're building a developer tool, your product almost certainly depends on open source code you did not write, do not control, and have probably never thought much about.
Konstantin Vinogradov, an open source and infra VC investor, along with his…
February 26, 2026 In recent years, Ruby and Ruby on Rails have quietly entered a phase of rapid, multidimensional evolution. Rather than a single disruptive change, what we are witnessing is a coordinated advance across the runtime, the framework, infrastructure tooling, and application capabilities. This shift has been especially visible in talks from RubyKaigi 2024–2026 … Continue reading Ruby 4 & Rails 8: A Multi-Front Acceleration of the Ruby Ecosystem
Hot Take on the whole AI Coding
(this post was written by hand btw - because I despise AI Slop rhythm, emojis and structure sooooo much)
I was recently asked to give a short AI-Coding Workshop for another company, which is outside my usual work. That made me recollect my thoughts on the whole matter, because there is kind of a rift in the industry, and also in the developer community.
On the one side, we have principled opponents and skeptics (especially on Mastodon!), on the other side we have the proverbial Vibe-Coders who use Agents without any supervision. I wouldn’t comment on the latter, but want to address the issues the former group usually has.
1.) Coding-performance related: results are worthless/the code is…
I often use timestamps, like completed_at as a boolean flag. It offers just a bit more (meta) data than a real boolean.
But of course on the UI you want to show a checkbox that a user can toggle instead of a datetime field.
I have done this often enough, that I created a simple concern that I use throughout my apps. Given above completed_at example, it gives you an API like:
@resource.completed?
@resource.complete!
@resource.complete=
So in your form, you can simply use form.check_box :completed and you’re off.
The concern is simple enough:
# lib/boolean_attributes.rb
module BooleanAttribute
extend ActiveSupport::Concern
class_methods do
def boolean_attribute(*fields)
fields.…In January 2024 I published the first article on Rails Designer’s blog. It listed some of my best practices; most of which I still use today.
Over those two years there were almost 200 articles published on topics ranging from Hotwire, to Rails and Tailwind CSS. Next to that I’ve launched various tools and dozen open source projects. With all those articles, tools and other pages, the site slowly started to feel incoherent. Less consistent in style, feel and branding. So it was time to lose some weight and put on some fresh clothes! 🎩💅
I spent some time recently to build the site from scratch. Not coincidentally this was a good time to build it using Perron, the Rails-based static site…
Rails 8 (released November 2024) is the smoothest upgrade yet. The focus? Simplicity and performance - removing external dependencies while boosting speed.
Solid Queue, Solid Cache, and Solid Cable eliminate Redis for many use cases. Built-in authentication removes the need for Devise. Ruby 3.4 (latest stable) with continued YJIT improvements delivers excellent performance.
Note: This is Part 5 of our Rails Upgrade Series. Read Part 1: Planning Rails Upgrade for the overall strategy.
Before We Start
Expected Timeline: 1-2 weeks for medium-sized applications (easiest upgrade!)
Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5…

Transform your React development with contract-first APIs. Generate TypeScript types, build type-safe clients, and develop with mocks while backend implements—no more waiting, no more integration chaos.
Most React apps have a problem: frontend types and backend reality drifting apart. You copy API shapes into TypeScript files, backend changes something, and you find out in production. This guide fixes that by making your OpenAPI spec the source of truth—generating types, clients, and validation schemas automatically so contract mismatches break builds instead of production. You'll also set up…
RubyMine enhances the developer experience with context-aware search features that make navigating a Rails application seamless, a powerful analysis engine that detects problems in the source code, and integrated support for the most popular version control systems.
With AI becoming increasingly popular among developers as a tool that helps them understand codebases or develop applications, these RubyMine features provide an extra level of value. Indeed, with access to the functionality of the IDE and information about a given project, AI assistants can produce higher-quality results more efficiently.
To improve AI-assisted workflows, since 2025.3, RubyMine has also been able to…
Getting nondeterministic agent into deterministic guardrails
AI agents don’t reliably follow your instructions. Here’s how I made it hurt less.
My context:
- I currently work on a 12-year-old Rails legacy code base
- The code base is undergoing modernization. Some of the large Active Record classes have been split into smaller ones, each into its own bounded context. Events are becoming a first-class citizens in the code. We also pay close attention to keep direction of dependencies as designed by context maps.
- The client has a GitHub Copilot subscription. I mostly use Sonnet and Opus models.
The basic setup
Initially I started with the basics. I was curious where it would get us. There’s…
Continuations 2026/08: Great feedback
Oops, nearly missed these weeknotes. Let me make this a quick one just to sneak it in and keep the streak alive (6 months and counting!)
My big achievement this week was getting Hanami Minitest ready for feedback. Check out my post for a preview of the generated files and where I’m looking for help. This has already generated a whole lot of great feedback and discussion. Thank you everyone for sharing your thoughts!
I had a couple of very old hanami-rspec preview releases yanked from RubyGems.org (thank you Colby!), so now they no longer confuse the
bundle outdatedcommand.Aaron added a nice new feature to Hanami CLI: a
--nameoption to allow the app name to be customised. I reviewed…
4.0.7 Released
RubyGems 4.0.7 includes enhancements and documentation and Bundler 4.0.7 includes enhancements, bug fixes and documentation.
To update to the latest RubyGems you can run:
gem update --system [--pre]
To update to the latest Bundler you can run:
gem install bundler [--pre]
bundle update --bundler=4.0.7
RubyGems Release Notes
Enhancements:
- Add Gem.disable_system_update_message in setup.rb. Pull request #9020 by hyuraku
- Print message when signing in with an existing API key. Pull request #9312 by hsbt
- Installs bundler 4.0.7 as a default gem.
Documentation:
- Document gemspecs must be deterministic. Pull request #9321 by fxn
- Remove “##” from a comment to require. Pull…
Bundler Release Notes
Enhancements:
- Don’…
Sally and Aji flick through thoughtbot’s guide to best practices in a bid to brush up on their coding habits.
Our hosts discuss key ideas from the guides that stand out to them the most, why they’re considered to be good practice, as well as reviewing the cons of complex writing and the benefits of simple coding.
—
Be sure to check out Sally’s new repo Michel if you’re looking to create an appointment database, and check out the thoughtbot guides for more general coding advice.
If you’ve got some spare time and want to hear Aji’s talk on breaking the enigma code you can watch that here.
Your hosts for this episode have been thoughtbot’s own Sally Hall and Aji Slater.
If…
February 23, 2026 Ruby has traditionally shipped with a single, built-in garbage collector tightly coupled to the VM. With Ruby 3.4, that assumption begins to change. Feature #20470 introduces an experimental Modular Garbage Collector API, allowing CRuby to load alternative GC implementations at runtime. This marks one of the most significant architectural shifts in Ruby’s … Continue reading
Pluggable Garbage Collectors in Ruby: Exploring the New Modular GC API
CVE-2026-25500 (rack): Stored XSS in Rack::Directory via javascript: filenames rendered into anchor href
GHSA-wx95-c6cv-8532 (nokogiri): Nokogiri does not check the return value from xmlC14NExecute
Universal Document Processing at Gusto: From One-Off Parsers to a Self-Service Platform
Co-author: Praveen Awasthy
Processing documents into structured dataIntroduction
If you work anywhere near operations, compliance, payroll, benefits, or support, you already know: documents are everywhere. Forms, notices, letters, PDFs, scans, uploads, emails — each carries critical information, each follows a different format, and each requires someone (or entire teams) to read, interpret, and act.
For years, the industry has solved this the same way: manual review, brittle templates, one-off parsers, or vendor tools that work great — until they don’t.
There’s no shortage of players in this space. Some excel at OCR (Optical Character Recognition). Some are great at classification. Some shine…
The death of a software craftsman
Well, it happens a lot ‘round here
You think quality is a common goal
That goes to show how little you know
Developers work hard over the years to cultivate tools and techniques to improve the quality of the construction of their software. These tools and techniques are slowly becoming even more useless than they may already be. We must adapt by either going all-in, totally opting-out, or finding a middle ground by tracking the AI code-generation craze to fill the gap as a hand-coding artisan.
All content on this page was created without any assistance from a Generative AI (including the Graphviz diagrams!). My em-dashes are my own. I would also…
An exhaustive and documented Docker configuration for developing Ruby and Rails applications
This post introduces the Docker-based development runtime configuration I use for building Ruby on Rails projects, both in an old-school way (by writing) and in a modern way (by instructing LLM agents). This configuration has been helping Evil Martians and many other teams across the globe to ship amazing products without worrying about local setup intricacies. Read on to learn all the details, and feel free to use it, share…
Ruby proxy for SQLMap and Websockets
I was testing for SQL Injection on a target the other day, and after a little fuzzing indicated that there might be a vulnerability, I wanted to use SQLMap to make data exfiltration easier. But this vulnerability was part of a websocket request, and unfortunately, SQLMap doesn’t support websockets. One solution to this problem is to introduce a little proxy between the websocket endpoint and SQLMap and convert HTTP requests into websocket ones.
Welcome to Hotwire Weekly!
Welcome to another issue of Hotwire Weekly! Happy reading! 🚀✨
📚 Articles, Tutorials, and Videos
Drifting Ruby: Debounce - David Kimura shows how to build a debounced live search in Rails using Stimulus and Turbo, cutting down unnecessary requests while keeping the UI responsive.
Remote Ruby: Bridge Components, Swift UI and more with Joe Masilotti - Joe Masilotti joins Remote Ruby welcomes to talk about bridge components, how Hotwire Native interacts with SwiftUI, and practical patterns for mixing native UI with Turbo/Rails apps.
Record video in Rails with Stimulus - Rails Designer shows how to build a video recorder UI in Rails using a lightweight Stimulus…
Building a Guitar Stand
My daughter got me a new guitar stand I have set up in the living room. This lets me see my guitars more easily, which I enjoy. Inspired by that, I wanted to make my own stand to support two guitars in the office area of my bedroom.
Build 🔗
I used a piece of hickory wood that’s been waiting to be put to good use for this project. Armed with an idea of the visual look I wanted, I drew the shape I wanted to end up with. I used my pull saw to make the initial cuts, with the hickory secured in a vice.

With my vertical lines cut, I need to connect them horizontally. I drilled a hole with a forstner bit in the corners with a wide enough diameter to use a jigsaw to connect the lines.

I cleaned up…
It’s 2026. Everything’s awful. The only news you hear is bad news. I figured I’d spend a few hours trying to make some things sound a little better. So I installed new pickups in some of my guitars.
Single Coils 🔗
I recently came into a Squier Affinity strat. I would confidently describe the stock instrument as “fine”. Particularly for an entry-level guitar. It’s not even Classic Vibe level! The body is thinner, but that makes it interestingly light. The neck profile isn’t to my liking, but the fretwork is better than I’ve seen on much more expensive guitars. The tuning machines aren’t great, but I like the vintage style.

All that aside, I got it for one reason.

It’s a really good starting…
A JavaScript developer's guide to Rails: Authorization with Pundit
Coming from a JavaScript background, I’m used to handling permissions with simple if statements. Maybe a global “roles” object, or a quick check on the frontend that hides buttons if the user isn’t an admin. Working with Rails and Pundit forced me to think differently about authorization as a system.
Understanding the request flow and where helper methods come from would’ve saved me a lot of time upfront.
Philosophy of Pundit
At its core, a Pundit Policy answers the question:
Can \$USER take \$ACTION on \$RESOURCE?
A Policy Scope answers:
Scope down \$COLLECTION to only the ones \$USER can access.
These two layers keep authorization clean and explicit:
What belongs in…
The review bottleneck: when AI codes faster than you can read
In just a few months, AI coding assistants went from autocompleting lines to shipping entire features in minutes. Everyone who knows how to utilize AI can produce several times more code than before. However, AI is not perfect and we, as humans, still need to review the code it produces. Reviewing someone else’s code is not the most exciting part of the job - it’s just boring. With thousands of lines of code, it’s easy to unconsciously skim through them and miss the important parts. Let’s figure out how we can make the process less painful and time-consuming.
The review problem
When writing code yourself, you have a mental model of what the code does. Unfortunately, AI-generated code…
If your goal is to ship AI applications in 2026, Ruby is the best language to do it.
The AI Training Ecosystem Is Irrelevant
Python owns model training. PyTorch, TensorFlow, the entire notebooks-and-papers gravity well. Nobody disputes that.
But you’re not training LLMs. Almost nobody is. Each training run costs millions of dollars. The dataset is the internet!
This is what AI development today looks like:
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{"model": "gpt-5.2", "messages": [{"role": "user", "content": "Hello"}]}'
That’s it. An HTTP call.
The entire Python ML stack is irrelevant to achieve this. What matters is…
Working with maps usually means working with numbers — lots of numbers. If you want to render a map of a country, region, or continent, you normally need to know its exact bounding box: bbox = [-73.6, -55.1, -53.6, -21.7] # Argentina Not exactly readable. Not memorable. Not friendly. What if you could just say: … Continue reading
Rendering Maps by Name: Symbolic Geographic Extents in Ruby
Bridge Components, Swift UI and more with Joe Masilotti
Andrew and David hold down the fort without Chris and catch up on what they’ve been watching and reading, before welcoming back Joe Masilotti, the show’s most listened to guest from last year. They talk about Hotwire Native’s momentum, why “Bridge Components” are the unlock for truly native features, Joe’s push toward SwiftUI compatibility, the messy reality of in-app purchases, and how his “PurchaseKit” aims to simplify the whole Apple/Google webhook maze. We also hear about Joe’s new podcast with Colleen, the hosts’ AI tool usage (Claude, Augment, Codex), and Joe’s intent to submit a CFP to speak at RubyConf in Vegas. Hit download now to hear more!
Links
Hi, it’s Vipul. Let’s explore this week’s changes in the Rails codebase!
Don’t filter StructuredEventSubscriber payloads
Previously, StructuredEventSubscriber was filtering out certain keys from event payloads.
This PR removes that filtering, so subscribers receive the full, unmodified payload giving
developers access to the complete event data they expect.
Optimize calculating remote IP address
Improves the performance of ActionDispatch’s remote IP calculation logic, reducing
unnecessary processing on each request when determining the client’s IP address.
Fix in_batches(use_ranges: true) with predefined limit
Fixes a bug where calling in_batches with both use_ranges: true and a…
#788 — February 19, 2026
Ruby Weekly
The Outcomes of Last Week's Ruby 'Dev Meeting' — Last week I mentioned a meeting was taking place where lead core team members would answer questions around proposals, features, and bugs. Here are the rough notes of what happened, but a few quick highlights:
- Matz gave the thumbs up for allowing trailing commas in method signatures.
-
autoload_relativewas accepted as a way to auto-load relative files. -
Dir.scanis coming as a way to more efficiently scan directories.
The Ruby Core Team
AI Should Be Actionable: Outcomes Over Hype — Pragmatic AI…
It was only once I read Andrew Yang's "The End of the Office" post the other day that I realized how few political leaders are seriously grappling with this question: what will happen to civilization if all this AI investment actually pays off? Sitting with this thought led me to a dark place, if I'm being honest—not because society might be doomed, but because I'm left quoting Andrew Fucking Yang of all people:
Expect the Starbucks in your local suburb to become occupied with middle-aged former office workers who want to get out of the house. That's a benign portrait, but a lot of these families still owe mortgages on their houses that they won't be able to maintain. If I were a homeowner…
Rails 7 represents a philosophical shift: No Node.js required for modern JavaScript. Import Maps, Hotwire (Turbo + Stimulus), and encrypted attributes make Rails 7 the most developer-friendly version yet.
This is also the first Rails version that requires Ruby 2.7+ and encourages Ruby 3+ adoption.
Note: This is Part 4 of our Rails Upgrade Series. Read Part 1: Planning Rails Upgrade for the overall strategy.
Before We Start
Expected Timeline: 1-3 weeks for medium-sized applications (smoothest upgrade yet!)
Medium-sized application: 20,000-50,000 lines of code, 30-100 models, moderate test coverage, 2-5 developers. Smaller apps may take 1-2 weeks, larger enterprise apps 6-12 weeks.
…
Prerequisites:
- Currently on Rails 6.1 (upgrade from 6.0 first)
- Ruby 2.7.0+ installed (Ruby 3+ strongly recommended)
- Test coverage of 80%+
- Understanding of…
Step 0: Upgrade Ruby First (Required)
Rails 7 requires Ruby 2.7.0 minimum, but Ruby 3.0 or 3.1 is strongly…
Important: Upgrade…
This is Part 2 of the "Karafka to Async Journey" series. Part 1 covered WaterDrop's integration with Ruby's async ecosystem and how fibers can yield during Kafka dispatches. This article covers another improvement in this area: migration of the producer polling engine to file descriptor-based polling.
When I released WaterDrop's async/fiber support in September 2025, the results were promising - fibers significantly outperformed multiple producer instances while consuming less memory. But something kept nagging me.
Every WaterDrop producer spawns a dedicated background thread for polling librdkafka's event queue. For one or two producers, nobody cares. But Karafka runs in hundreds of…
Early last year I helped a team move from jQuery to Hotwire (you will be surprised how many teams still use jQuery! ❤️ jQuery 4 was released recently; did you know?). It was a fun time (no, really!). One of the more interesting parts was moving from a jQuery plugin for video recording to Stimulus. Today I want to show the outline of how I did that.
The MediaRecorder API captures video directly in the browser. Webcam, screen sharing or both at once (picture-in-picture style). No external services, no complicated setup. Just modern browser APIs and a well-organized Stimulus controller. Exactly what I like.
Here is what you get:
- record from your webcam;
- record your screen;
- record both in…
February 18, 2026 Based on a talk from Kaigi on Rails 2025 by Hayato Okumoto (TwoGate CTO) Because life is too short to watch bundle exec rspec scroll by like the credits of an extended director’s cut.
The Universal Pain: Waiting for CI Every Rails developer eventually reaches enlightenment — not through meditation, but … Continue reading
From 30 Minutes to 2: Speed-Running Rails CI (Without Cheating… Much)
The industry tends to celebrate beginnings.
New repositories. Clean architecture diagrams. The excitement of choosing tools before real constraints show up. First commits get attention because they feel like authorship.
Most developers, though, don’t spend their careers starting from scratch. They spend them stepping into systems that already exist, already have users, and already have decisions embedded in them.
You open the repository and there are hundreds of thousands of lines of code waiting for you. Patterns layered over time. Workarounds that solved real problems in earlier moments. Comments that hint at context you weren’t there for. You didn’t choose the framework version. You…

Write and ship modern custom RuboCop cops in 2026: learn the new plugin system, requires_gem API, InternalAffairs best practices, safe autocorrection nuances, and design trade-offs for building robust, future-proof lint rules.
Five years ago, we published a blog post about writing custom RuboCop rules (called "cops"). Since then, RuboCop has had a major release with new features that can make your custom rules even better. Let's continue onward from that post to see what's changed and also uncover items left on the cutting room floor the first time, too.
Notes on clarifying man pages
Hello! After spending some time working on the Git man pages last year, I’ve been thinking a little more about what makes a good man page.
I’ve spent a lot of time writing cheat sheets for tools (tcpdump, git, dig, etc) which have a man page as their primary documentation. This is because I often find the man pages hard to navigate to get the information I want.
Lately I’ve wondering – could the man page itself have an amazing cheat sheet in it? What might make a man page easier to use? I’m still very early in thinking about this but I wanted to write down some quick notes.
I asked some people on Mastodon for their favourite man pages, and here are some examples of interesting things I saw…
an…
ActiveRecord neighbor vector search, with per-document max
I am doing LLM “RAG” with rails ActiveRecord, postgres with the pgvector extension for vector similarity searches, and the neighbor gem. I am fairly new to all of this stuff, figuring it out by doing it.
I realized that for a particular use, I wanted to get some document diversity — so i wanted to do a search of my chunks ranked by embedding vector similarity, getting the top k (say 12) chunks — but in some cases I only want, say, 2 chunks per document. So the top 12 chunks by vector similarity, such that only 2 chunks per interview max are represented in those 12 top chunks.
I decided I wanted to do this purely in SQL, hey, I’m using pgvector, wouldn’t it be most efficient to…
A JavaScript developer's guide to Rails: Authorization with Pundit
Coming from a JavaScript background, I’m used to handling permissions with simple if statements. Maybe a global “roles” object, or a quick check on the frontend that hides buttons if the user isn’t an admin. Working with Rails and Pundit forced me to think differently about authorization as a system.
Understanding the request flow and where helper methods come from would’ve saved me a lot of time upfront.
Philosophy of Pundit
At its core, a Pundit Policy answers the question:
Can \$USER take \$ACTION on \$RESOURCE?
A Policy Scope answers:
Scope down \$COLLECTION to only the ones \$USER can access.
These two layers keep authorization clean and explicit:
What belongs in…
494: Primitive Obsession
Joël and Sally examine the simpler components of programming and why using basic data structures may not always be the best approach to solving a problem.
Our hosts cover all the telltale signs and symptoms of primitive obsession, what it is, it’s drawbacks and limitations, and how to avoid it creeping into your own work.
—
Want to learn more about primitive obsession and readability in programming? Check out these links for some wider reading, including a talk from Joël! - Design Patterns and Null - thoughtbot blog on primitive obsession - Define User
Your hosts for this episode have been thoughtbot’s own Joël Quenneville and Sally Hall.
If you would like to support the show,…
Evaluating LLM prompts in Rails
We’ve built several AI features in Rails by now: image classification, image upscaling, similarity search, etc. And every time, the same question came up: which model and prompt should we actually use? The image classification project made this especially painful: a pricing change blew up our budget, smaller images proved to work better than larger ones, and every model switch required re-running the entire evaluation from scratch.
Every change on a prompt opens up a tree of choices. Which provider should we use? Which model? How detailed should the instructions be? Would more samples in the prompt work better? How much context per message? Should we use a reasoning model? Or augment the…
We’re open-sourcing Upright, the synthetic monitoring system we built to watch over Basecamp, HEY, Fizzy and our many other services.
Upright runs health checks from multiple geographic locations and tells us when something breaks. It’s a Rails engine that you deploy to cheap VPS nodes around the world using Kamal. Each node runs probes against your services and reports back via Prometheus metrics, so you can alert with AlertManager and visualize with Grafana.
…“Agent” might be the most overloaded word in tech right now. Every startup claims to have one. Every framework promises to help you build them. The discourse has gotten so thick that the actual concept is buried under layers of marketing.
So let’s start from first principles.
What’s an Agent?
An agent is an LLM that can call functions.
That’s it. When you give a language model a set of tools it can invoke – a database lookup, an API call, a file operation – and the model decides when and how to use them, you have an agent. The model reasons about the problem, picks the right tool, looks at the result, and continues reasoning. Sometimes it calls several tools in sequence. Sometimes none.
…From Delayed Job to Solid Queue: How a 10-Year Rails App Finally Achieved Linear Scaling February 16, 2026 Lessons from Kaigi on Rails 2025 — Shohei Kobayashi In large Rails systems, background jobs are not a detail — they are the system. Email delivery, AI processing, document generation, data cleanup, notifications, analytics pipelines — everything … Continue reading From Delayed Job to Solid Queue: How a 10-Year Rails App Finally Achieved Linear Scaling
If you’ve worked with Celery in production with real traffic, you’ve probably hit one of its many sharp edges. Maybe you’ve watched a simple background job silently pile up in an unmonitored queue.
Or maybe you’ve built out a tidy set of queues only to find your high-priority jobs are getting stuck behind slow (and unimportant) ones. Celery gives you powerful tools, but few guardrails.
These pain points usually stem from queue planning problems. Most teams slap labels like high_priority or emails on queues without defining what those mean.
If you plan your Python task queues around latency, you’ll have more predictable (and scalable) results. Ready to get started?
The basics of…
The Handoff Test
I keep hearing the same story in conference hallway tracks. An engineer leans in and tells me their old boss or client still texts them every four to six months with a “quick question.” There’s usually a slight eye roll. They’ve moved on. They’re not being paid anymore. It feels like a boundary issue.
Then I ask what the question was.
It’s rarely random. It’s about the custom annual report they used to run before board meetings… whether it’s safe to delete a specific SPF value in DNS… why three staging hostnames are still sitting in the load balancer and the new DevOps person is afraid to touch them. Sometimes it’s a background job chain that behaves strangely under load. Sometimes it’s a…
Organizations Private Beta
We’re excited to announce that the Organizations feature for RubyGems.org has entered private beta!
A long time coming
We started the Organizations work back in 2024 as announced in our June 2024 RubyGems update, where we shared our plans to bring organization accounts, memberships, and more precise gem permission controls to the platform. Since then, the team has been steadily building out the feature from refactoring our permissions models to introducing ownership roles, building the organization onboarding experience, and updating our guides to cover how Organizations work. After more than a year of development, Organizations is ready for real-world feedback.
Join the Private Beta
W…
I’m thrilled to be part of the program for Blue Ridge Ruby 2026 in Asheville, North Carolina.

I’ll be speaking about…LLMs? I hope you can join us!

InstiLLMent of Successful Practices in an Agentic World 🔗
Congrats on joining Hours Unlimited. The Math and Numbers team is excited to have you join us on our journey to redefine the importance of numerals. This introductory session will provide tips and tricks for best interacting with powerfuLLMachine, the next-level platform we use to unlock productivity and effectiveness.
Direct link to podcast audio file
I feel like I'm getting saltier, and it's concerning. If you want me to tone it down and/or up, let me know. It'll go a lot better if you just write to podcast@searls.co instead of yelling at your phone.
As usual, I brought the goods. Now here are the receipts:
- prove_it is doing its job, mostly
- Aaron's puns, ranked
- Starsand Island studio confused by alleged 'praise-bombing' attack
- Sony is considering holding back PlayStation 6 until 2028 or 2029
- Southwest changes are infuriating fans (News+)
- NYT: All the news that's fit to manspread
- Gurman: Tesla CarPlay Held Back by Need for Wider Adoption of Apple's iOS 26 (Archive)
- YouTube on Vision Pro (News+)
- …
This week I merged Hanami’s i18n support. Thanks to some good feedback from Trung Lê, I added support for fallbacks before merging. Thank you Trung!
This is a big step for our i18n feature, but it’s not the last. To round it out, we’ll need to add i18n awareness to our view layer, plus generators for new apps and slices. Hopefully we can get them sorted across the remainder of February.I also merged a nice improvement to Dry Operation: a shiny new validation extension from Aaron Allen. Aaron did a great job getting all the essentials in place, and I spent some time in the last week getting everything just so before calling it done. Thank you Aaron!
While I was in working in Dry…
Rails Multi-Tenancy
In this episode of RECORDABLES, we dig into our ambitious goal of moving from a commingled database to separate SQLite databases for every Fizzy customer. Lead Programmer Mike Dalessio walks through what multi-tenancy actually means in practice, why Rails doesn’t make it easy, and how the open sourced Active Record Tenanted gem makes it more seamless.
During the conversation, Mike does a live demo showing what it takes to convert an existing Rails app to multi-tenanted and the safeguards built in to prevent accidental data leaks. You’ll also hear about the edge cases of globally replicated SQLite, and why we ended up launching Fizzy without it.
Watch the full video episode on YouTube.
…
props_template 1.0: A high performance, more opinionated jbuilder replacement
We released props_template over a year ago and it’s exciting to see it being adopted by folks. For us, its been the workhorse behind Superglue and powers its most dyanamic features. Today we’re finally releasing 1.0.
Fast
props_template is among the fastest JSON builders available today. The Props::Base class that powers props_template can also be used standalone.
props_base_class: 1439.9 i/s
panko: 1287.6 i/s - 1.12x slower
props_template: 998.8 i/s - 1.44x slower
turbostreamer: 912.9 i/s - 1.58x slower
alba: 871.0 i/s - 1.65x slower
jserializer: 668.7 i/s - 2.15x …Hi, it’s zzak. Let’s explore this week’s changes in the Rails codebase.
Add extension point to customize transaction for persistence methods
Extracts the implicit transaction creation in persistence methods into an overridable private method, giving models full control over transaction behavior for save and destroy operations.
Load hook guard
Adds a new guard_load_hooks method to Rails::Railtie that checks if the Rails app is loaded when a load hook is called, with options to log or raise on early loading.
Avoid combinatory explosion of filter parameters
Fixes a performance degradation where using Active Record encryption with many models caused filter_parameters to grow into thousands…
Kisses From Andrew, the Ruby Gala & Conference Workshops
On this episode of Remote Ruby, Chris, Andrew, and David dive into the newly released Claude Opus 4.6 and share their frustrations and solutions for debugging a turbo stream issue in Rails. They discuss a range of debugging challenges they've faced, including Rails credentials decryption errors and handling unexpected URL parameters in Pagy. The conversation shifts to the Ruby Gala, a fundraising event tied to RubyConf, highlighting its purpose, structure, and some notable people being honored. They reflect on their experiences with Hack Days at conferences, the challenges they pose, and suggest transforming them into structured workshops to maximize learning and engagement. Hit download…
props_template 1.0: A high performance, more opinionated jbuilder replacement
We released props_template over a year ago and it’s exciting to see it being adopted by folks. For us, its been the workhorse behind Superglue and powers its most dyanamic features. Today we’re finally releasing 1.0.
Fast
props_template is among the fastest JSON builders available today. The Props::Base class that powers props_template can also be used standalone.
props_base_class: 1439.9 i/s
panko: 1287.6 i/s - 1.12x slower
props_template: 998.8 i/s - 1.44x slower
turbostreamer: 912.9 i/s - 1.58x slower
alba: 871.0 i/s - 1.65x slower
jserializer: 668.7 i/s - 2.15x …Over the past few months, I’ve been begrudgingly coming around to something I didn’t expect to admit publicly: AI is getting legitimately useful at building software. Not magical. Not autonomous. Not “paste in requirements and press BUILD.” We’re far from that. But the tooling has crossed a threshold where it meaningfully lowers friction in ways I can no longer dismiss.
What surprised me most isn’t that it can generate code. It’s that the cost of context has dropped. Exploring an idea. Scaffolding a feature. Writing tests. Refactoring awkward logic. Documenting decisions. Iterating without feeling like you just signed a six-month commitment.
For someone who has spent over two decades…
#787 — February 12, 2026
Ruby Weekly
Minitest fast, RSpec slow? Not so fast!
Last week, I included a post about an RSpec to Minitest migration that reduced test run time by 200x. My summary glossed over the reasons for the speedup, and a "RSpec slow, Minitest fast" implication was easy to take away. Thanks to Tyler Ritchie for pointing this out. Mea culpa.
Big tooling migrations force you to drop cruft and rethink things. That causes major speedups, not merely switching frameworks.
In Don't Throw the Specs Out with the Factories, Brad Gessler nails this distinction and, more importantly, takes steps…
Designing Safe Parallelism in Rails February 12, 2026 Eliminating Connection Pool Exhaustion in Production At Kaigi on Rails 2025, 片田 恭平 (@katakyo) delivered a deeply practical talk titled: “もう並列実行は怖くない — コネクション枯渇解消のための実践的アプローチ” (“Parallel Execution Is No Longer Scary — A Practical Approach to Eliminating Connection Pool Exhaustion”) もう並列実行は怖くない__コネクション枯渇解消のための実践的ア… This session explored a real-world scaling problem inside … Continue reading Designing Safe Parallelism in Rails
Almost two years ago I announced Rails Icons. I started that article with the notion I have no app where I do not use icons. That is still true today.
I also still use Rails for all my SaaS’ apps, but what if you do not? What if you use one of the many other amazing Ruby frameworks, like Hanami, Rodauth or maybe Padrino? Or what if instead of Perron (a Rails-based SSG), you use Jekyll, Middleman or Bridgetown?
You cannot use the elegant way of adding SVG icons, of any of the small dozen icon libraries, in your app or site. Sad! 😞
So, ~210k downloads later, I extracted the core (Ruby) part from Rails Icons into its own gem: Icons. ⭐
So now Rails Icons core features rely on the Icons gem and…
Almost two years ago I announced Rails Icons. I started that article with the notion I have no app where I do not use icons. That is still true today.
I also still use Rails for all my SaaS’ apps, but what if you do not? What if you use one of the many other amazing Ruby frameworks, like Hanami, Rodauth or maybe Padrino? Or what if instead of Perron (a Rails-based SSG), you use Jekyll, Middleman or Bridgetown?
You cannot use the elegant way of adding SVG icons, of any of the small dozen icon libraries, in your app or site. Sad! 😞
So, ~210k downloads later, I extracted the core (Ruby) part from Rails Icons into its own gem: Icons. ⭐
So now Rails Icons core features rely on the Icons gem…
Early last year I helped a team move from jQuery to Hotwire (you will be surprised how many teams still use jQuery! ❤️ jQuery 4 was released recently; did you know?). It was a fun time (no, really!). One of the more interesting parts was moving from a jQuery plugin for video recording to Stimulus. Today I want to show the outline of how I did that.
The MediaRecorder API captures video directly in the browser. Webcam, screen sharing or both at once (picture-in-picture style). No external services, no complicated setup. Just modern browser APIs and a well-organized Stimulus controller. Exactly what I like.
Here is what you get:
- record from your webcam;
- record your screen;
- record…
CVE-2026-25765 (faraday): Faraday affected by SSRF via protocol-relative URL host override in build_exclusive_url
GHSA-q66h-m87m-j2q6 (bitcoinrb): Bitcoinrb Vulnerable to Command injection via RPC

Vibe coding can speed up app development, but it can also quietly introduce serious security flaws. Here are the four most common risks and how to avoid them.
Few things let us build full-fledged applications from scratch as quickly as vibe coding. And few things introduce security risks into code as quickly as vibe coding. In this post: the most common security holes that can materialize when vibe coding, and how to resolve them. Not all have an easy or fast solution, but we’ll tackle them and learn how to stay vigilant!
Welcome to Hotwire Weekly!
Welcome to another issue of Hotwire Weekly! Happy reading! 🚀✨
📚 Articles, Tutorials, and Videos
Implementing OAuth in Hotwire Native apps with Bridge Components - Mike Dalton shows how to build a reusable OAuth bridge component for Hotwire Native, letting your app authenticate with external providers.
Responsive code formatting on web - Paweł Pacana explores how to make code listings adapt their formatting for different container sizes using CSS container queries, smart typographic patterns and Turbo Frames.
The Turbo + ActionCable Trap: When Your Real-Time Rails Feature Fights Itself - Ed Ruder warns about a subtle pitfall when combining Turbo Streams with…
493: Suspenders with Steve Polito
Joël talks with guest thoughtbotter Steve Polito about his recent work rewriting Suspenders, an old thoughtbot gem from the 2000s.
Steve discusses his role on the rewrite and the steps he took in optimising it for modern rails, Joël dives into some of the new features found in the gem, before discussing with Steve the use cases for Suspenders and why you might choose it over other rails starter apps.
—
Want to learn more about our gem Suspenders? Check out some of these links to get yourself up to speed and try it for yourself.
Suspenders Gem - Suspenders Feature List - thoughtbot’s guide for programming
Your hosts for this episode have been thoughtbot’s own Joël Quenneville…
…February 10, 2026 Introduction libgd-gis now supports legends, introducing a fundamental building block in map communication. With the release of v0.4.1, legends become a first-class feature of the rendering pipeline, pushing the library one step closer to covering the essential capabilities expected from a modern GIS engine. Legends are not just a visual accessory. They … Continue reading When Maps Explain Themselves: Legends, Style, and Finished Images in Ruby

An intermediate report for Ruby Association Grant on TutorialKit.rb, a toolkit for building interactive Ruby and Rails tutorials that run entirely in the browser using WebAssembly and WebContainers.
Ruby and WebAssembly are both powerful technologies, but together they unlock vast new possibilities. Evil Martians continue pursuing our goal of making ruby.wasm beneficial to the broader Ruby community (and beyond). To that end, we'd like to introduce our new project: TutorialKit.rb.
You’ve probably seen Rails.env.production? in your codebase to ensure that certain code only runs in production. Instead of having to compare strings, Rails.env == "production", Rails wraps the string in an ActiveSupport::StringInquirer so you get readable methods like .production? and .development?.
Active Support also adds an inquiry method to String so you can use this same pattern in your own code.
Instead of…
…comparing strings with ==:
class Writing < ApplicationRecord
# category is a string: "story", "nursery_rhyme", "song", "article", "social_post"
def online?
category == "article" || category == "social_post"
end
end
Use…
…the inquiry method to ask questions of…
AI agents in Ruby: Why is it so easy?
Scott Werner (founder of Sublayer and organizer of Artificial Ruby) told me something that stuck with me:
“The first version of the sublayer gem was actually a coding agent, but it was coming together so quickly… I was like, wait… if this is so easy for me, it’s going to be easy for everybody, and everybody is going to be making these…”
Last week, we open-sourced a minimal but feature-packed coding agent. We were after the simplest, straightforward, stupidly effective agent possible, so we named it Detritus, after Lance Constable Detritus of the Ankh-Morpork City Watch from Discworld (thanks for so much and so many, Sir Terry).
Detritus is built in just 250 lines of code, yet it…
Today is a sad day because last week a platform that we know, like, and trust made a surprising and disappointing announcement.
On February 6, 2026, Heroku published an update on the future of the platform. The announcement confirms what many in the community had suspected for a while: Heroku is transitioning to a “sustaining engineering model.”
In plain English, that means maintenance model: No new features, no new Enterprise Account contracts for new customers, and a focus on stability only.
If your Rails application runs on Heroku, this is the moment to start thinking about your next move. The platform is not disappearing overnight, but the direction is clear: Heroku’s best days are…
Person in parachute over mountains during daytimeSometimes, engineering improvements don’t begin with a grand roadmap. They start with a small moment of curiosity.
One afternoon, while working on a React component, I noticed something strange.
When I typed my component props directly, TypeScript flagged an unused prop. But when I wrapped the same component in React.FC, the warning vanished.
That didn’t feel right. TypeScript is supposed to protect us from mistakes — not silently ignore them.
I opened up a TypeScript playground and tried a few experiments. Sure enough, React.FC was changing how the compiler treated props. It was as if TypeScript was politely saying, “Don’t worry, everything’s…
Continuations 2026/06: Mailer rebuild
The highlight of this week was sharing my Hanami Mailer rebuild. If you’re interested in how our mailers will fit alongside actions and views (and reuse the latter!), check it out. I wrote up all the different ways you can use the API, so you can get a sense of it all without even going into the code.
My next step here is to wait for any feedback from the other Hanami maintainers. In a week or so I’ll merge this and sort out the full framework integration story. Once that’s done we can start to make more noise about it and hopefully get some real user testing.I made some releases this week! Hanami CLI v2.3.5 includes a fix to make asset paths work better with “sandboxed” Node.js setups.…
Software quality practices have evolved over six decades. What began as a response to the “software crisis” of the 1960s has grown into collaborative specification techniques that bridge the gap between business and technical teams.
Contents
- Evolution of Quality Approaches
- The Software Crisis (1968)
- Structured Programming (1968)
- Fagan Inspections (1976)
- Cleanroom Software Engineering (1980s)
- Personal Software Process (1990s)
- User Stories (1990s, XP origin)
- Extreme Programming (1996-1999)
- UML and Design Communication (1997)
- Test-Driven Development (~2000)
- Given-When-Then Format (early 2000s)
- Behavior-Driven Development (2006)
- Specification by Example (2010s)
- Th…
Evolution of Quality Approaches
1968-1990s: Quality through PROCESS
The early focus was on disciplined processes to catch defects: Fagan Inspections (formal peer review), Cleanroom (defect prevention), and PSP (individual measurement).
1994…
We ordered a wood chest that arrived with cosmetic damage. After logging the damage in their customer support interface, it prompted me to start a chat with their AI virtual assistant.
What happened next:
- It immediately offered me a 15% refund to keep the product
- I asked for 20% and it immediately agreed
- I asked for 25% and it immediately agreed
- I asked for 30% and it turned me down
- I took the 25%, which was, indeed, immediately refunded
Turns out that negotiating with a rules engine is way easier than negotiating with a human tasked with operating a rules engine.
So basically, all Wayfair did was add a chatbot to the end of their existing "Report a Problem" interface…
Celebrating the Entrepreneurs Organization of Philadelphia with AI-Powered Branding
As a year winds down, entrepreneurs often pause to reflect on the risks taken, the lessons learned, the wins celebrated, and the setbacks overcome behind the scenes.
What if those moments could be captured visually in a way that felt personal, branded, and inspiring?
That is exactly what we set out to do with a custom GenAI-powered card builder created for the Entrepreneurs Organization of Philadelphia.
A Custom AI Experience for EO Philadelphia
This project started as a small but meaningful side project for the Entrepreneurs Organization (EO) Philadelphia community.
Our founder, Ernesto Tagwerker, has been a part of this community since ‘23.
The goal was simple:
-
Celebrate…


