I ran HTML-validate and Axe core and a Claude prompt against a new website I’m building, and they caught a bunch of stuff I missed! This gave me a chance to remember the easily overlooked bits of building a website. And I visited a few dark corners of the HTML spec I hadn’t been to yet! Data attribu...
Duck Typer is a Ruby gem that validates interface compatibility across polymorphic classes sharing the same role, so they can be used interchangeably. It detects and clearly reports interface drift directly in your test suite. Since Duck Typer launched, there’s been some discussion about the validit...
Biometrics (Face ID, Fingerprint and more) authentication have quickly become something users expect from a modern mobile app. These are fast, familiar, and removes friction that comes with typing passwords on the phone. With React Native, biometrics authentication can be an easy feature or a tricky...
Moving from Figma to Claude Code and back again is now possible. This could be a game changer for less technical, more visual Product Designers. What is this post about?: In June 2025, Figma announced the beta release of their MCP server, a connection that lets AI coding tools read your Figma files ...
For more than two decades, Ruby has shaped how we think about software development at thoughtbot. It influenced how we write code, how we collaborate, how we teach, and how we build products alongside our clients. Many of the practices, tools, and ideas that define our company today were either born...
Thoughtbotby Chad Pytel and Ran CraycraftMay 20, 2026read🤖 Summary
This summer, we’re bringing the London Tech Leaders Meetup series outside. Over the next few months, we’ll be hosting a series of outdoor summer gatherings across London for founders, CTOs, engineering managers, product leaders, designers, and builders who enjoy having thoughtful conversations with ...
Thoughtbotby Chad Pytel and Maria FilimonovaMay 19, 2026read🤖 Summary
Last week I attended an excellent conference in the Irish consulate in San Francisco titled “AI & Minority Languages: A Bay Area Perspective”. Our team at thoughtbot speaks over 25 different languages, from Swedish to Bekwarra, so this conference was of particular relevance. Here are my key takeaway...
Last week I attended Startup Grind Global in Redwood City, CA. I find it can be helpful to get boots on the ground to hear first hand what’s happening in the industry. Here are my six key takeaways, grouped by theme. As you can probably guess, there was a lot of AI talk, so please bear in mind there...
Ana Tudor posted about this recently and I agree: CSS shorthand properties are genuinely useful, but they’re not universally applicable. There are no hard and fast rules here. The question to ask yourself isn’t “can I shorthand this?” but “will someone reading this later, including future me, unders...
One of the best things about hosting the Giant Robots podcast is that I get to spend time talking to people that might otherwise pass me by. It’s an opportunity to turn casual small talk into meaningful conversation. After meeting Lord Chris Holmes at the DigiGov Expo in 2024, where I was collecting...
I didn’t realize it had a name until I looked it up, but a Rubin vase is a famous optical illusion. It’s the one where you first see two faces looking at one another, and then realize it can instead be seen as a vase. You might have had it the other way around. That one is well known enough that you...
Thoughtbotby Richard NewmanMay 12, 2026read🤖 Summary
If I’m measuring water into a marked cup, I slow down as I’m nearing the mark because I don’t want to overshoot it. I bet you do that too. I can pour quickly at first, but as I near the line, I’ll decide I need to be more precise. I slow the rate so I can control it more. If I poured it all at full ...
Thoughtbotby Richard NewmanMay 11, 2026read🤖 Summary
I was planning to build a tiny storage shed for my small backyard. Part of me wanted to jump in and start framing right away, but lumber is expensive and I could imagine wasting it. Being wood, the structure could easily become too heavy to move. I might need access to the wall behind it, so I wante...
During a legacy data migration, imported images kept rendering as broken files. Everything looked fine in the logs. No errors, no warnings. It took me some back and forth to finally discover that TDS was quietly truncating varbinary(max) columns on the way out. One SQL command fixed it. client.execu...
Presenting clean-rspec-output, a Claude skill that systematically eliminates unexpected output from a Ruby on Rails RSpec test suite. You know the feeling. You run bundle exec rspec and instead of a clean wall of dots, you get this: ❯ bundle exec rspec DEPRECATION WARNING: Defining enums with keywor...
At the end of 2025, two things clicked for me at the same time. First, I was feeling a lack of professional network in Austin that had been building up for some time. I had been filling this void through Linkedin, but the increase of AI-generated communication had put a real damper on the connection...
If you’re following the AI hype train, you’ll have heard serious software people talk about building software (without needing to code) while they take their kids to the park. This is obviously appealing, but it’s often discussed in ways that imply serious barriers to entry: the interviewee from Ant...
On a website I worked on, I noticed some logos stacked vertically on the left instead of being spread horizontally and evenly spaced, as I expected, and as the design clearly suggested. Opened an issue. Carefully listed browsers and versions. I investigated like a careful end-user. Not like a develo...
I’m not going to lie, when I start my day and I see 10 Dependabot PRs open in the project, I just want to close the laptop and go for a walk. And I have the feeling that, like me, many other developers feel the same way, because I keep seeing Dependabot PRs sit open in projects for weeks. Nobody wan...
Every session ends with a retro. This week, twenty-four commits out of about a hundred and forty started with that retro. Only a handful added anything new. I wasn’t building the system anymore. It was refactoring itself. It is Week Four. Tuesday: four commits before lunch The 17th. Four refactor-fr...
CSS got some handy new functions recently: sibling-index() and sibling-count(). sibling-index() gives us a number based on a child element’s position relative to its siblings, starting at 1. For example, the third child in a list of 10 would have an index of 3. sibling-count() gives us the total num...
On Tuesday, 11 February, I made seventeen commits to my management system. That is more than any other day in the project so far. The previous two weeks had been about structure. Daily routines. Meeting sync. Project tracking. This week was about communication. The trigger was simple. I ran /inbox a...
I’m an AI skeptic. I’ve resisted using AI in my work and haven’t installed any AI tools before. I have asked ChatGPT questions a few times, but I end up yelling at a robot more often than I end up with the answer I was looking for. I have concerns about the effect on the environment, the ethics of h...
A few weeks ago, Axios, the popular HTTP client for JavaScript, suffered a supply chain attack on NPM. An attacker compromised the lead maintainer’s NPM account through social engineering and published two backdoored versions that delivered a cross-platform remote access trojan (RAT) to macOS, Windo...
A lot of teams assume moving faster means hiring more developers or adopting the latest framework. But in our experience, the biggest drag on development speed is usually upstream. It’s how decisions get made, the way priorities are set, and whether there’s alignment (or misalignment) across teams. ...
If you’re building LLM-powered features in a regulated industry, sending unfiltered PII to a third-party provider isn’t just risky, it may violate compliance requirements like HIPAA or GDPR. That’s why we originally built Top Secret. However, when we first released it, RubyLLM was still in its early...
As a product manager, my weeks are defined by context switching. Between working on a client project, internal initiatives, leadership meetings, 1:1s, investment time, or personal development, there’s a lot to hold at once. Each of those contexts has its own history, to-do lists, open questions, fol...