DHH on Basecamp 5, Agents, and Why Rails' Stability Matters More Now

Open on YouTube ↗
Overview

Recorded the same week 37signals shipped Basecamp 5, this episode of On Rails has host Robby Russell asking David Heinemeier Hansson, the creator of Ruby on Rails and co-owner of 37signals, two related questions. What does modern Rails make possible in a flagship product today? And how is AI-assisted, agent-driven development changing the way 37signals builds software? Heinemeier Hansson argues that Rails' long-stable backend has become an unusual advantage in the AI era. He describes reversing his earlier insistence on writing every line of code by hand, and he now calls taking AI seriously a professional obligation. He also names the limits: agents that bolt on code instead of reshaping architecture, and organizations whose instability grows with their output.

32 min read

What still excites him: Ruby and the internet

Asked what still keeps him excited after all these years, Heinemeier Hansson names two things. The first is Ruby itself, which he calls the most beautiful programming language he has ever seen. That holds, he says, "whether I'm writing it or watching an agent do it." Seeing ideas come to life in code that beautiful remains a constant delight to him.

The second is the internet. For all its flaws, he considers it the best application platform software developers have ever had, because it lets them distribute applications without the gatekeepers found on other platforms. Combining Ruby with the open web to build good web applications is still, for him, a compelling mission. He admits that if someone had asked him 23 years ago whether Rails would last this long, he probably would have said no. Now, on what he calls the eve of another great revolution in computing with AI, he says working with Rails is as satisfying as it ever was.

A backend that barely changed in twenty years

Russell asks which parts of Rails today feel closer to the original vision than expected. Heinemeier Hansson says that when he looks at old Rails code, including his well-known 2005 demo video, "the shape of that code is eerily similar." Controllers look much the same, especially after the move to REST and the seven standard actions. ActiveRecord has kept the core of its DSL since essentially the beginning. It has become far more powerful and polished, but in his view anyone comparing a 20-year-old Rails backend with today's would find it immediately recognizable.

The frontend is different. Even for a strong advocate of Hotwire and minimal build pipelines, he says, frontend code looks quite different from 20 years ago. On the backend, though, he believes Rails and Ruby got many things right from the start. For him, the payoff is the return on learning. In most ecosystems, time invested in, say, a 2009 JavaScript framework pays few lasting dividends beyond general principles. Deep knowledge of ActiveRecord, by contrast, is "an investment you could amortize over literally two decades."

He notes that Rails has more than longevity. Large companies such as Shopify still build on it, and new startups keep choosing it. Some ecosystems, he says, belong to a single generational cohort whose applications simply carry on. Rails has some of that too, but it also keeps attracting fresh developers. With AI in the picture, he argues, "it's never been a better time to use Ruby on Rails." The conventions, guardrails, and huge body of existing code written to Rails principles can teach both human and agent developers to write better code.

Basecamp 5: fewer SQL fragments, same architecture

Russell asks what modern Rails made possible in Basecamp 5 that would have been hard seven or ten years ago. Heinemeier Hansson first points out that Basecamp predates Rails; he started building it in 2003. The Basecamp 5 backend still closely resembles that first version. One visible difference is the near absence of raw SQL. He doesn't think Basecamp 5 contains any complete SQL statements anymore, because ActiveRecord has become powerful enough that dropping to that level is rarely needed.

The biggest shift in how the code is organized, he says, was adopting patterns such as recordables and delegated types. He is careful to add that this isn't really a Rails feature. Rails includes delegated types mostly to nudge developers toward an architectural style, and the pattern doesn't depend on Rails or need much plumbing.

What he finds more interesting is how Rails has kept pace with changes in the web platform. One example is passkeys, which 37signals is working to bring into Rails in a fully native form. Another is how much faster developer hardware has become.

A 60-second test suite on a local machine

Heinemeier Hansson describes a reversal in where the fast computers are. For a long time the development machine was the slow one and servers were fast. Now, he says, the fastest single-core CPUs are in developer machines, which also have many cores. Just before the recording, he had benchmarked the entire Basecamp 5 test suite on his local AMD 395 machine against one of the fairly fast cloud machines 37signals uses for this work. By his account, the 16 physical cores of his local machine ran the suite about twice as fast as 20 data-center-grade cores in the cloud. The full suite finished in about 60 seconds.

He calls this remarkable in itself and says it enables a different way of working. Auxiliary processes such as CI and build pipelines can be greatly compressed when a test suite for an application as large as Basecamp runs in a minute on a modern computer. In his view, much of what modern Rails gains today comes from hardware that has become better, faster, and cheaper, and from a web platform whose capabilities have grown quickly.

No-build and the end of an uncomfortable frontend era

The move to no-build a few years ago, using native JavaScript modules that can be loaded and referenced directly, changed how Basecamp's frontend was built. Heinemeier Hansson describes the Webpacker era, roughly 2015 to 2019, as years when building Basecamp's frontend was less enjoyable than building its backend. He says he knew at the time that this was not the final form. It was simply what was available: a modern application meant accepting uncomfortable, cumbersome build pipelines. Reaching a point where none of that is necessary, he says, is "truly a delight."

Lexi: a new editor built on Lexical, headed for ActionText

The other major piece he highlights is a new rich text editor in Basecamp 5 called Lexi, built on Meta's Lexical framework and destined for ActionText. 37signals had wanted tables in Basecamp's WYSIWYG editor for almost a decade. Its previous in-house editor, Trix, worked well within its scope but couldn't be extended for certain things. Heinemeier Hansson finds it delightful that the same foundation used by Facebook and WhatsApp, platforms serving billions of people, is now easily available in Basecamp and soon in Rails.

He notes that passkeys, the build pipeline, and Lexical all concern the frontend. That supports his earlier point: the backend is so stable that the team is "really chipping away at it now." Looking at the commits in rails/rails, he says, much of the ongoing work polishes rare edge cases. "We're down to the 99.999% of coverage," as he puts it, and he thinks the community should see this as a real achievement.

He adds that he'd gladly discard any of it if something better came along. If he looked at code and found it existed only for legacy reasons, he would rip it out. But whenever he finds a better way, it goes into Rails, and these days there is little left to change on the backend. He credits the six or seven thousand contributors Rails has had over the years. It would be odd, he says, if all that work weren't accumulating into something durable, but he still considers it special that after 23 years people would happily start a greenfield application on the same stack.

Balancing legacy stability and greenfield joy

Russell raises a tension he sees from running an agency that maintains long-lived Rails applications. Most teams, like Shopify with an application in development for more than 20 years, can't rebuild from scratch every few years. 37signals, meanwhile, periodically reimagines Basecamp. Rails seems to serve both groups, and Russell asks whether that balance was intentional.

Heinemeier Hansson sees it as a benefit of longevity and of the intense community engagement in Rails' first five or six years. During that period the framework really did rip things out and change dramatically. He cites the Rails 2.3 to 3 transition as "big open surgery." That churn, which he considers unavoidable while learning what a framework should be, happened early and produced a solid foundation. He compares it to a UK tavern from 1284 that is still standing, not by accident, but because it was built on a solid foundation. Because backend programming hasn't produced major new paradigms in a long time, Rails hasn't had to trade away the qualities that make greenfield development enjoyable in order to stay stable.

The Basecamp 3 chassis, Fizzy, and carbon-dating an app

He knows this firsthand because 37signals maintains codebases of very different ages. Basecamp 5 is built on what the team calls the "chassis" of Basecamp 3, a codebase started in 2013. Basecamp 5 substantially revamps the UI and more, but it evolved on top of that 2013 code. 37signals also still maintains the original Basecamp written in 2003. Thousands of customers still use it, even though it stopped being sold to new customers in 2010.

At the same time, 37signals recently released Fizzy, a greenfield application built to the best standards and ideas the team has today. Fizzy's code is public, and Heinemeier Hansson can compare it with Basecamp 5's private code. His verdict: "They're not that different." He sees this as bridging the gap between stability for long-lived applications (Basecamp, Shopify, and what he describes as over a million other Rails apps) and enjoyment for new ones.

He repeats that this doesn't hold for the frontend, and says Rails can't take all the blame for that. He attributes it to the churn in the JavaScript ecosystem since around 2009, including the rise and decline of React and many other frameworks. If you want to "carbon date" a Rails application, he suggests, look at the frontend: Webpacker, esbuild, or no-build, whether there's jQuery, which frontend framework it started with. Opening an ActiveRecord model file won't tell you much. A connoisseur of the DSL might spot small tells, but he says he can open model files in the Basecamp codebase that "would look absolutely right at home in Fizzy, even though Fizzy was just written 5 minutes ago."

Coming to Rails World: Lexi in ActionText, passkeys, and magic links

Asked what might be extracted from Basecamp 5 for the community, Heinemeier Hansson confirms the two items he has already teased, both planned for Rails World in September.

The first is a major upgrade to ActionText, with Lexi as the default editor while remaining compatible with Trix. Existing applications, including some of 37signals' own, still use Trix, so both should be supported and migration should be possible. He calls rich text input table stakes for nearly every modern web application. Trix served people happy with its toolset but had glaring omissions, notably Markdown support and tables. For some applications either one was a deal breaker that forced developers to build their own editor, which he calls a useless time sink. Shipping a comprehensive editor built on Lexical by default is, in his view, a big step up.

The second, already an open pull request, is end-to-end passkey support in Rails. He says he has changed his mind about passkeys. His first take assumed they would replace passwords entirely, and he saw usability problems with that. For example, a passkey created on an iPhone might leave you unable to log in from a Windows PC. His breakthrough, used in Fizzy, was to pair passkeys with magic links so users can always log in through email. He now thinks this is the right shape for most applications: magic links and passkeys, "That's it," and ideally no social logins either.

He hopes this combination will also ease the intimidation many developers feel about authentication. He has always found it crazy that teams outsource their entire login system to a SaaS provider, not just offer "log in with GitHub." He accepts that it happens because developers feel uncomfortable building authentication themselves, even with what Rails provides. Passkeys, he says, are simple in concept but subtle, and getting the JavaScript "dance" exactly right is tricky. If the framework takes responsibility for that and wraps it in an easy API that anyone can add to a login page, he believes it will "bring the floor down so low that everyone can play." He mentions a few more tricks planned for Rails but doesn't reveal them.

Agents, authentication, and why Rails shouldn't ship an AGENTS.md

Russell asks how passkeys and similar mechanisms would work if agents need their own accounts in applications, and whether there's an architectural problem to solve now. Heinemeier Hansson agrees there is interesting work to do, but says "it's not figured out at all." Everyone briefly went all in on MCP, then "the puck kind of skated to CLIs," and now people talk about doing both. Because the field is so important and moving so fast, he wants to be careful about "pouring foundational framework concrete" around it before its final shape is clear.

His example: if the last Rails release had shipped a default AGENTS.md file, it would already be outdated about three model generations later. He goes further and says it would be harmful. He cites what he calls studies on AGENTS.md files and other agent steering, which suggest that telling an agent to do something it already knew how to do well can make it worse. The instructions fill the context window with distractions and produce worse code. He compares the pace to JavaScript's framework churn "on turbo steroids": not a new framework every six months, but a complete rethink of how to work every six weeks or so. Many people, he notes, point to last December as the turning point when developers began letting agents write the first draft of code instead of using autocomplete in Cursor or Copilot.

The same speed affects Rails World itself. Talk submissions are already in, yet Heinemeier Hansson says he doesn't know exactly what he'll talk about, because he wants his talk to be timely. He describes the industry as moving faster than it ever has. That is exciting, and also a little frightening and hard to keep up with. He thinks people have to hold both feelings: some anxiety about what the industry and the world will look like "5 minutes from now," and excitement that computers can do this at all.

GPT-5.5 and the keyboard accessibility sprint

He calls the recent jump to GPT-5.5 a massive step forward, comparable to what he calls an "Opus 4.5 moment" where "my mind is blown." He says he can delegate much larger tasks and gets much better code back.

His concrete example is the last sprint before Basecamp 5's launch, when he worked on keyboard accessibility. He wanted an almost NeoVim-like experience in which users can move between the sidebar and other areas. Getting focus management right, he says, takes a lot of work, and he spent much of that time with GPT-5.5. The model wrote good implementations, though they still needed steering and some of its first attempts didn't satisfy him. What impressed him more was its ability to explain itself. When he questioned code that looked excessive, asking why something was necessary, it walked him through edge cases and timing problems, such as needing to request a frame first. He says he had a handful of experiences in the last two weeks where it explained intricate parts of his own code with a fidelity that left him speechless.

He describes this with wonder: sand turned into silicon and chips by lasers, now reasoning with him about code. Part of why he still programs is the sense of a direct connection with the computer, and AI gives him a second kind of direct connection. He also acknowledges swinging between "hyper enthusiasm" and "mega skepticism" at least weekly. Sometimes everything seems amazing. Other times an agent does something so wrongheaded that he feels it would have blown everything up if he had let it run unchecked.

Designers and PMs writing code, and the limits of vibe coding

One of the biggest workflow changes at 37signals around Basecamp 5, he says, is that designers and project managers now write Ruby and Rails code. They can turn their ideas into working software without a programmer in between. He finds it remarkable that the people responsible for working out how something should behave can now test and validate their intuitions on their own.

He adds clear caveats. 37signals is not merging truly vibe-coded work, meaning code that is produced without being understood or reviewed in detail. "In most cases, those things are not getting merged." The value, in his account, is reaching one of the hardest questions in software much sooner: how should this work, is it good, is it fun, does it feel right? Answering those questions early saves programmers weeks or even months.

He draws on his own history. In the early days, Jason (his 37signals partner) would ask him to build something in Basecamp. He'd spend a week or two on it and feel proud of the result. Then Jason would say it didn't work and had to work some other way. He recalls feeling "married to this piece of code," a natural human reaction even if you're not supposed to have it. Being spared much of that wasted coding feels like a big step forward to him. That doesn't mean Jason could vibe code all of Basecamp alone, "at least not yet. Maybe that day will come, but it's not today."

Shape Up's six-week cycle now looks archaic

This compression directly challenges Shape Up, the methodology 37signals has long used and promoted. Heinemeier Hansson says Shape Up's six-week cycle rested on assumptions about how long major features take to build, and those assumptions "are just no longer valid." Six weeks used to be the right timeframe for building things at Basecamp. Now he struggles to imagine almost any Basecamp feature needing six weeks. He says the same applies to other software he's working on outside Basecamp.

"Make the change easy, then make the easy change"

Quality still requires attention, he stresses. Because agents produce so much code so quickly, a carefully built architecture can be wrecked surprisingly fast. Ask an agent naively for something and it will deliver, which he calls "the monkey hand curse": you get whatever you ask for, even when it shouldn't be delivered that way.

He doesn't think agents are yet good at what Kent Beck described as "make the change easy, then make the easy change." Agents can make very hard changes and will happily write 1,200 lines of code where an architectural adjustment in Rails could have reduced it to 20. He considers that kind of adjustment essential to a codebase's longevity: a considered, malleable architecture that reshapes itself when new requirements don't fit, rather than having features bolted on. In his view, agents currently try to please as quickly as possible with as few tokens as possible, which encourages bolting on.

He also notes that humans have long developed software the same way. Many codebases turned into a big ball of mud quickly once the original architects left or deadline pressure removed time for refactoring. So he frames his hesitation about agents as hesitation about development without care for architecture, style, and beauty. If you're building a large system, he says, you must stay committed to those values or end up in whack-a-mole, where one new feature creates three bugs. He believes many vibe coding adventurers have found that situation sticky and nearly impossible to escape when the agent runs loose "and there's no red thread." He allows that the next model might change this, since he has had to reverse his views several times in the past year. For now, though, "we're still needed, us squishy humans."

AI as a professional obligation, and taking the "Tobi pill"

Russell notes that organization leaders have more freedom to experiment than employees who must keep shipping, and asks how Heinemeier Hansson's own AI use compares with his team's. He replies that good programmers always make time to experiment and adopt better tools, and that Ruby programmers as a group tend to be curious and eager to learn. He sees those traits as exactly what the transition requires.

He openly acknowledges his reversal. A year ago he was proudly saying on podcasts that he wanted to write all his code by hand and "sweat every single character." He still cares about the aesthetics of every character, but no longer thinks he has to chisel the code himself. If an agent can produce code as good as what he'd write, "obviously the game has changed." He therefore calls it "a professional obligation of every programmer" to take this revolution seriously: spend time learning it, learn where it still falls short, get excited when it dazzles, and avoid what he calls distracting ideological dead ends such as "it's just a parrot." Whatever one believes about those debates, he says, it misses the practical reality that these tools are very powerful.

At 37signals, he says, the best people are embracing AI fully. Timing plays a part, since some people naturally spend a weekend experimenting, but he also thinks organizational permission matters. He admits he took longer than some. Tobi Lütke at Shopify saw the future earlier and mandated within Shopify that people pay attention to AI before the industry, or Heinemeier Hansson himself, had caught up. He says he has now "taken the Tobi pill" on AI acceleration, as have most people around him, and that holdouts are rapidly shrinking. He says he respects them, having been one recently. Anyone who is exceptionally productive without AI deserves credit, but he says he wasn't that good and is much more productive with agents.

Code as art: git reset and exploring more ideas

The most surprising delight for him has been the chance to see many implementations. He compares it to looking at art: you may look at a thousand pieces and dislike almost all of them before finding the one you love. He feels the same about code and sometimes needs to see seven implementations before deciding which shape he likes. With agents, rejecting one is cheap: "Bam, git reset. And now it's gone." He says he doesn't feel bad throwing away 1,000 lines, because the agent will happily build another version (for a token fee). Lower implementation cost means he can follow intuition and creativity instead of being deterred by effort.

He places AI alongside earlier shifts that left some programmers behind. In the late 1990s, he knew programmers who were dismissive of the internet and web applications, and web developers, especially PHP programmers, were called "script kiddies." He points out that he learned to program through PHP. Early mobile apps were slow and clumsy, yet no one now doubts mobile is a serious part of the business. You could still build a niche business writing bespoke assembler software without the internet, and he'd cheer you on, but that isn't where the economy is. Not every trend lasts; NFT infrastructure, he says, "didn't pan out," and if every idea succeeded the industry wouldn't be trying enough ideas. He considers it clear that AI is one of the big shifts, possibly the biggest.

Rising ambition: optimizing the fastest 1%

Russell asks how 37signals has changed operationally: more throughput, more pull requests, unexpected side effects? Heinemeier Hansson says the biggest surprise is how much ambition has risen, though he says it shouldn't be surprising. When you become far more productive, you take on projects that didn't used to be worth doing.

His example is performance work. Optimization usually targets the slow tail, the 95th or 99th percentile, and the mean. Jeremy on the team instead started a project to speed up the fastest 1% of requests, "because why not." Heinemeier Hansson recalls they went from a couple of milliseconds to under one, though he says he doesn't remember the exact figures. A request taking 10 milliseconds instead of 30 isn't noticeable to a user, but across millions of requests it shows up in infrastructure spending. He says there are many similar examples, especially in infrastructure but also on the frontend.

The keyboard accessibility sprint is another. In an earlier era, he says, he probably wouldn't have started that work so close to launch. It would have been deferred until after launch and given a dedicated Shape Up cycle and specific people. With implementation so much cheaper, "it's easier to be whimsical," and easier for an idea to become running code instead of a planning card. He sees this as positive if the organization can absorb the change in velocity and tolerate the risk of letting individual contributors ship their ideas to production. He also says guardrails are needed, because doing this badly can introduce a lot of instability.

Self-driving cars, PR volume, and reliability

He offers an analogy for agent reliability. By his account, self-driving cars still crash, but at a much lower rate than human drivers, so anyone who cares about statistics would rather share the road with them. He says agents are at a tipping point where they sometimes show much higher than average diligence. On pull requests, he thinks agents are probably at human level on average, though not at the peak.

The catch is volume. More cars mean more accidents even at a lower per-car rate. Likewise, a team going from about 5 to 50 pull requests a week introduces more instability overall, even if each pull request is half as likely to cause a problem. He says there's a general sense that some systems have become less reliable since AI arrived. He attributes this not to AI being a worse programmer but to the speed and volume of changes creating more chances for incidents.

Uptime, and why startups shouldn't chase 100%

He says 37signals takes uptime very seriously. That morning he had posted stats showing that Basecamp 4 had 100% uptime over the previous three months, with not a second of downtime, going into Basecamp 5. Much of that, he says, depends on what an organization considers acceptable. He argues that many organizations, especially startups, should not aim for 100%. At their stage, reaching product-market fit quickly matters more, and some instability is acceptable.

He then reflects again on how fast things have changed. About 18 months ago, he gave AI autocomplete five minutes before rejecting it, because it filled his Ruby with gobbledygook he kept deleting. Now he is regularly delighted by the quality, and even the "poetry," of what these tools produce. He acknowledges a likely bias: nearly all 37signals codebases already have established patterns, both from Rails and from each application's own architecture. He says he has little experience of what agents do in a messy codebase, a big ball of mud, and doesn't know whether they can produce good code there. What he does know is that 37signals' codebases let agents do very good work that still needs review and still needs a human programmer in the loop.

Can Rails be the place to vibe code a first app?

Russell asks whether Rails could attract newcomers who want to vibe code their first application. Heinemeier Hansson answers "Yes, yes, yes," and says he has ideas for making it easier. He sees a whole class of applications historically served by Microsoft Access, FileMaker Pro, and especially Excel, which he calls one of the largest application platforms for non-programmers. Bringing a tool as powerful as Rails down to that level, for people who will never have access to skilled programmers or projects worth hiring for, would in his view unlock "a tremendous amount of joy and productivity."

He believes some Rails applications can already be written entirely by agents, in the true vibe coding sense where the person directing the work never looks at the code. Rails doesn't yet have the right packaging for this, he says, but it can get there. He wouldn't do this at Basecamp's scale or for a bank app, but many applications sit at a level of criticality where it isn't a big deal.

He notes that six to nine months ago people worried about agents leaking API keys or setting passwords to "admin," and says he hears much less of that now, partly because models have become smarter. Prompt injection remains a problem and hallucinations still happen. But he argues hallucination has largely stopped mattering, because the shift from AI chat to agents gave models tools to run tests and linters, so hallucinations rarely reach a pull request.

From prompt to IPO, and the criticality spectrum

He recently changed Rails' tagline from "Hello World to IPO" to "From prompt to IPO." He has no doubt that companies will go public in the coming years with applications vibe coded to product-market fit. At that point, he suggests, they can hire programmers to review the code and make sure the password isn't "admin" and Redis isn't exposed on their cloud infrastructure. Or agents may become good enough to do that too.

He argues Rails has always embraced a criticality spectrum. From early on, much of its appeal was to people outside traditional programming, such as former biologists and musicians. Rails lowered the barrier and built in security so beginners couldn't make the worst mistakes. He sees today's agents as a similar on-ramp. Other communities, he says, effectively tell newcomers to climb a "200-meter wall" before being admitted to "high-minded programmer land." He wants Rails to stay flat, letting people start, learn, make mistakes, "shoot a toe off or two," and have some downtime, which he calls rites of passage.

This openness extends to Rails itself. He acknowledges that AI-generated slop, especially in security reports, can be a nuisance that needs addressing. Still, he says he'd welcome agents writing Rails features and improving the codebase, provided the work is reviewed "certainly for a long time" by highly qualified humans on the core, committer, and contributor teams. He calls AI "the most exciting thing that has happened to computers" since he started with them 40 years ago, and says Rails will lean in hard.

What to worry less about

To close, Russell asks what Rails developers should worry less about. Heinemeier Hansson's answer is doom: "climate hysteria" or fear that AI will kill everyone. If such things happen, he says, they'll happen regardless of individual worry, which individuals can't influence. He urges listeners to focus on progress, their love of computers, the beauty of Ruby, and the productivity of Rails. He believes we live "in the best of times on 500 different axes," and that fixating on what's wrong poisons the mind. His advice is to keep both feet in excitement about technology, allow occasional concern about what could go wrong without letting it dominate, and "embrace the future."