Expert designers and developers who turn your idea into the right product.<br>
Technical articles and stack decisions from thoughtbot
Rails advanced routing constraints
Learn how to authorize requests at the routing layer to improve security and ergonomics.
Handling external API errors: A transactional approach
Clarifying a few possible ways to implement transactional workflows when working with external APIs.
3 Question Framework – How to Respond Without Reacting
Over-communicating is key, over-reacting is not. It's important to find the balance on when to respond to messages and when to keep still.
This Week in Open Source (November 3, 2023)
Recent thoughtbot open source updates (November 3, 2023).
Incubator update 1: Josh at Knect
Learn all about the first weeks of the thoughtbot Startup Incubator with Knect — from user research to market experiments and insights from the founder himself.
Asking the Right Questions After a Demo
Product demos are crucial in development. They offer insight into team progress and align stakeholder expectations. Yet, we sometimes need more than showcasing the product. Vital to success is asking stakeholders some practical questions.
factory_bot 6.3.0
factory_bot 6.3.0 is out, with Ruby 3.2 support, better docs, and more hooks.
A Peek Behind the Curtain of Our New Open Source Page
How did we build the new Open Source page?
This Week in Open Source (September 1, 2023)
Recent thoughtbot open source updates (September 1, 2023).
What does a developer do during a product discovery sprint?
How to help your team discover the right product using your technical know-how.
Week 4 of thoughtbot Startup Incubator: AvidFirst
The AvidFirst team is starting to crystallize the product idea through constant research and interviewing.
Speed up your Rack application with HTTP
You don't need a sophisticated caching mechanism to improve your application's performance. All you need is a basic understanding of the HTTP specification.
This week in #dev (Aug 18, 2023)
Caching HTTP responses forever, a fix for when your terminal is acting weird, and more!
Treat yourself days
Be kind to yourself and do something special today.
A pragmatic guide to building a Rack application from scratch
Learn how to build a production ready Rack application without a framework like Rails or Sinatra.
How to work on client problems rather than solution requirements
Here is one strategy to move a client from providing your team with a list of requirements to working on the root problem together.
Kicking off thoughtbot’s Summer 2023 incubator with AvidFirst
The team gets up to speed on everything Ashley's already learned and done so far and identifies an early adopter market.
This Week in Open Source (August 14, 2023)
Recent thoughtbot open source updates (August 14, 2023).
Structuring Conditionals in a Wizard
Branching early helps structure multi-step forms.
This week in #dev (Jul 28, 2023)
Creating reusable components with vanilla JS, checking feature compatibility across email clients, and more!
Event Recap: Open Source Festival - Lagos, Nigeria
Highlights of attending the Open Source Festival in Lagos, Nigeria.
Up and running with WebSocket
WebSockets best shines in situations where real time communication is important, you can see notable examples in chat applications and even Multiplayer gaming. In this piece I will be showing you how to create your own WebSocket server and client.
This Week in Open Source (July 21, 2023)
Recent thoughtbot open source updates (July 21, 2023).
Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting History has been Updated
Read it again today to learn the git tools that will allow you to keep a clean git history, how to use them, and why they should be handled with care.
Implementing Deep Linking in React Native: A Quick Step-by-Step Guide
A quick step-by-step guide on implementing deep linking in React Native application, enabling users to seamlessly access specific screens or content within the app.
Building Value Objects in Rails with composed_of
Learn how to improve the interface of your existing Active Record Models with this underutilized API.
This week in #dev (Jul 7, 2023)
Highlights of what happened in thoughtbot's #dev channel on Slack this week.
Embracing Open Source: thoughtbot's Journey and Commitment
Introducing our brand-new Open Source page. Discover a curated collection of projects that showcase the essence of collaboration and innovation at thoughtbot.
GitHub pull request merge strategies
An overview of what the options provided by the pull request merge button on GitHub do and how to make the best out of each strategy.
Using Machine Learning to Answer Questions from Internal Documentation
We have a lot of internal and external documentation about how we do things at thoughtbot. I explored how we could make ChatGPT able to answer people's questions using this documentation. This articles shows how to do it and the results.
How to Use ChatGPT to Find Custom Software Consultants
A new, perhaps more accurate tool has emerged to help innovative companies find the best software consultants.
This Week in Open Source (June 30, 2023)
Recent thoughtbot open source updates (June 30, 2023).
Take the Outside View: A solution to the planning fallacy
Optimism is our kryptonite but history is our saviour.
Getting started with React on Rails
Let's explore the benefits of using the React on Rails gem and how it can streamline your development process.
A love letter to Objective-C
Let's take a trip to Objective-C from Ruby.
This Week in Open Source (June 23, 2023)
Recent thoughtbot open source updates (June 23, 2023).
This Week in #dev (Jun 16, 2023)
Highlights of what happened in our #dev channel on Slack this week.
The Blank Page Problem
Getting started from a empty page can be tough. But there are some strategies for breaking the blank.
Inspecting Ruby's inspect method
Because 0x0000000103f70c98 never helped anyone.
This week in #dev (Apr 21, 2023)
This week, we discussed splitting arrays, handling deprecation warnings, and querying missing records.
Week 6 of thoughtbot startup Incubator: Senga
The Senga team is hard at work gaining insights and iterating the strategy and prototype based on real user feedback.
Week 2 of thoughtbot Startup Incubator: Senga
Customer interviews continued, we launched some ad campaigns, and we learned some things!
Error Messages Are Our Friends
This article is about how to understand and embrace error messages as tools to help us find issues in our code.
Build or buy: Is it core business?
The one key question that can simplify the build or buy decision making process.
Simplifying React Native Development with Expo
With a slew of improvements, Expo might be the future of Hassle-Free React Native Development.
In relentless pursuit of some parts of REST
If we want clients to create small controllers and use resources in their routes, it's a good idea to know why. This is a refresher of Derek Prior's advice from Railsconf 2017.
We're Building a New Design Sprint Guide
We've been running design sprints for over 10 years, it's time for us to share everything we know about them in an updated guide.
Pairing is Caring
Some thoughts about pair programming and what an ideal pairing session looks like to me.
Introducing the first entrepreneur to go through the thoughtbot Incubator
Learn about the entrepreneur who was selected to participate in the thoughtbot startup incubator.
Ruby Groups Around The World 🌎🌍🌏
Come on a journey to discover the various Ruby groups around the world. From Argentina to Vietname going through Mexico.
DevOps and Resiliency in HealthTech Panel Event Recap
Victoria moderated a panel of healthcare technology founders and lead engineers on the acceleration of DevOps adoption into Healthcare Industry during the pandemic.
Ask thoughtbot CTO - All About CI / CD
Our Mission Control team talks with thoughtbot CTO Joe Ferris about questions related to continuous integration and continuous delivery practices at thoughtbot and how they have evolved over time.
Handling external API errors: A resumable approach
Clarifying a few possible ways to implement resumable workflows when working with external APIs.
My Adventure With Async Ruby
I used the `async` gem to speed up a portion of my app. Here's how it went and my thoughts on the gem.
Rails developers write some Rust: a review of Axum 0.6
Is Rust Web yet? We used our Rails knowledge to try writing a Web application in Axum in two days.
This week in #dev (Dec 30, 2022)
Don't just do it
Understanding the need behind a change is important to build better software. Here's why.
Announcing the thoughtbot Incubator
Apply to have thoughtbot be your technical co-founder for 8 weeks.
Announcing DevOps in HealthTech virtual panel on Tuesday Jan 17th 2023 5:30pm ET
Join DevOps DC's virtual panel of healthcare technology founders and lead engineers talking about the acceleration of DevOps adoption in the Healthcare Industry during the pandemic on Tuesday, January 17th.
This week in #dev (Dec 23, 2022)
Introducing thoughtbot.social: Our Social Media Space on Mastodon
thoughtbot is now on Mastodon!
thoughtbot Apprenticeship Applications for Europe, West Asia and Africa for 2023 Are Now Open
Applications are now open for our first 2023 Apprenticeships. This is our paid, junior-level position providing structured support and mentorship to get you to be a billable thoughtbot Designer or Ruby on Rails Developer.
This week in #dev (Dec 16, 2022)
In praise of verbosity
I often find myself running into mysterious command line errors as I install different development dependencies over and over. Fortunately many commands have an option for verbose output that gives more insight.
Case Equality Operator in Ruby
An introduction to the `===` method in Ruby, and how it works in `case` expressions and beyond them.
Travailler dans ma langue maternelle demande de l'empathie
Travailler toute la journée dans une autre langue que sa langue maternelle est épuisant, mais nous pouvons apporter de la bienveillance et de la compréhension pour soulager une partie de cette charge mentale.
How to Fix Rails 6.1 'Initialization autoloaded the constants' Warning Messages
Got autoloading during initialization warning messages in your Rails 6.1 app? It's time to_prepare for the next version.
Keeping it simple
A reminder that code is a step in a process, not an end in itself.
This week in #dev (Pilot)
Figma UI Starter Kit
New Figma resource, a lightweight UI design starter kit to save you time.
Your flaky tests might be time dependent
Time dependent tests are difficult to diagnose, and the symptoms don't present themselves until it's too late. This article will help you determine if your test suite is time dependent.
Our macOS setup script, Laptop, adds official support for Ventura
We've just pushed a new release of our macOS setup script, Laptop, which adds official support for macOS Ventura and fixes a few other issues.
DEI: Speaking Up About Our Values
Diversity, Equity, and Inclusion (DEI) is part of thoughtbot's core values. As we encounter critiques of these principles, it is important to explain why we do what we do and why it sets us apart from toxic tech culture that still lives true today.
2023 Consumer Tech Trends
To best support thoughtbot’s teams and our clients, we spend the end of the year analyzing the patterns we’ve experienced and the trends on the horizon for the industries we support most frequently.
Data Modeling Resources in Elm
Links to some of the best Elm data modeling resources around the web.
Automate manual deployments with Git and binstubs
Your team's manual deployment process doesn't have to be so manual. Here's how we automated our team's deployment process with a few lines of bash and basic Git knowledge.
thoughtbot approved as UK Crown Commercial Gcloud 13 supplier
UK public sector organisations can find and contract thoughtbot cloud support services.
Moving Beyond, Not Getting Over, Imposter Syndrome
Let’s move away from individual responsibility, and towards collective and systemic accountability.
Do Not Use Obliques in Arabic
The history of obliques/italic fonts, and why you shouldn't use them in Arabic-based texts.
Histogram Distribution in Ruby is Double Tally
Using `#tally` to calculate the distribution of letters in a piece of text.
Our strategy for B2C founders starting a product company during the cost of living crisis
Based on nearly 20 years of experience, thoughtbot’s suggestions for successful B2C product strategy during an economic downturn.
Navigating & Maximising Fundraising in the UK - Event Recap
We recently hosted a live panel discussion with industry experts. This article summarizes a part of that conversation, highlighting tips for UK startup teams either considering or navigating fundraising in the current landscape.
Recapping our Ask Me Anything session with our partner 1871
A few weeks ago we got to join an Ask Me Anything (AMA) event to give thoughtbot’s perspective on product strategy, research, design, development, and culture.
Ready to fundraise? Learn from thoughtbot and our partner, Forecastr, at our event October 3rd
thoughtbot and our partner, Forecastr, will share insights and resources for startups preparing their product roadmap, and their financials, for investor conversations.
Recapping our June - August podcast episodes
If you've missed any of our recent podcasts, get a quick synopsis to see which ones you'd like to catch up on.
thoughtbot is one of Quartz's Best Companies for Remote Workers in 2022
We've been named one of Quartz’s Best Companies for Remote Workers! Here are some highlights of our path to fully remote and things we've learned along the way.
Working Iteratively
Working in small chunks is one of the most impactful things we can do as developers.
Event recap: Panel Discussion on the Cost of Living Crisis
We recap the insights and advice our experts give to technology companies navigating the current landscape.
Product Considerations for Middle-Eastern Users: No Fixed Location (Part 2 of 2)
In this two part blog series, we share more detail on two of the challenges we faced and our collective learnings for building digital products for a Middle-Eastern audience. This is our second blog which shares how we built a delivery app for users with no fixed location.
Product Considerations for Middle-Eastern Users: Multi-Currency (Part 1 of 2)
In this two part blog series, we share more detail on two of the challenges we faced and our collective learnings for building digital products for a Middle-Eastern audience. Our first blog focuses on Multi-currency support.
Upcoming event—The Cost of Living Crisis and what it means for technology
Join us for a Free Virtual Event on Technology & The Cost of Living Crisis including Panel Discussion & Q&A.
Interviewing like it's a classroom. In a good way.
Observing some aspects that job interviews and learning and teaching a foreign language have in common, in communication style in a broad way.
Financial modeling for startups from Forecastr
Better visibility into your financial outlook and the confidence to pitch investors.
Connascence as a vocabulary to discuss Coupling
How Connascence can make discussions around Coupling easier and more productive.
It's official - RSpec Training
Formalizing how we support our clients with unique to you RSpec training.
Your Phone Belongs to You, You Don't Belong to It
Sometimes we can become addicted to the fast-paced nature of our industry. It doesn't have to be this way. You can disconnect from it all, and the first step sits right in your hand.
Query by Duration in Active Record
How do you even save a "duration", let alone query for records by that value? It's actually easier than you think.
thoughtbot presentations & good vibes from RailsConf 2022
thoughtbot has been a passionate and active participant in the Ruby on Rails community and are proud to be a contributor in the open source community. Each year thoughtbot participates in RailsConf and were fortunate enough this year to have a few thoughbotters join as speakers.
thoughtbot Design Link Pack: April 2022
What are the thoughtbot designers reading and sharing this month?
A Case for Query Objects in Rails
When is it best to reach for query objects and how can we best structure them?
Steal this interview script
A boilerplate script for 1:1 remote user interviews.
Agreeably Disagreeing aka How to Handle Conflicts
A collection of conflict resolution tips from personal experience in customer service.
Kotlin StateFlow vs LiveData on Android: What Are They & Why Should You Care
A comparison of Kotlin Flow vs LiveData, and use cases for each.
Custom Ranges in Ruby
How can we create ranges out of custom objects?
thoughtbot Design Link Pack: March 2022
Reducing Leaky Abstractions Introduced by ActiveRecord
ActiveRecord provides a comprehensive interface for querying the database, but at what cost?
Switching from ENV files to Rails Credentials
A little bit of my struggles with ENV files throughout the years, and hopefully a better solution.
Rails Server Side Analytics From Scratch
Learn how to track user events without sacrificing privacy and performance.
The opportunity will find you
Learning makes magic happen.
Write Readable Code
Techniques and reasons to optimize your code for people, not metrics.
Pipelining without pipes
Ruby, functional programming, how to build operation pipelines, and the average programming language color.
Working in my native language requires empathy
It's exhausting to communicate all day in your non-native language, but we can practice kindness and understanding to relieve some of that mental load.
What We Loved from ProductCon 2022
This February, a handful of thoughtbotters attended the virtual ProductCon event. Here are a few of the team’s takeaways from this year.
thoughtbot Design Link Pack: February 2022
Knowledge playlists are now available in our playbook
A breakdown of our best-of blog posts for consulting.
Chesterton's Fence
You're driving along a road and you come across a fence blocking your way. What do you do? You could tear it down. After all, what's the use of a fence over a road? But you would be wise to reconsider.
Hotwire: Turbo-Streaming ViewComponents
Learn how to Turbo-Stream ViewComponents by building a message board.
thoughtbot Design Link Pack: January 2022
SRE: The Next Big Thing from Mission Control
thoughtbot is proud to add Site Reliability Engineering to our Mission Control team. This blog shares more info on the role and our goals with the offering.
Dynamic forms with Turbo
Fetch fresh fields from your servers with Turbo Frames.
Dynamic forms with Stimulus
Progressively enhance your server-generated forms with Stimulus.
Getting Up and Running Quickly When Joining a Project
Joining an existing project as a developer comes with loads of challenges. If you need some inspiration on how to become more productive quicker, this article is for you.
Using A Silent Activity To Get Group Buy-In
We walkhtrough how we use a silent sorting activity to help hear from all stakeholders and align the group on a singular product strategy.
How to Introduce Investment Time at Your Company
A client of ours plans to introduce a day of improvement each week. Here is my best advice for how to make it successful.
How we screen Apprentice Rails Developer applications
A summary of the things we look at during our initial screening of Apprentice Rails Developer applications.
How we screen Apprentice Designer applications
A summary of the things we look at during our initial screening of Apprentice Designer applications.
Hotwire: Asynchronously loaded tooltips
Learn how to effectively render tooltips in Rails without writing any JavaScript.
Adding Tailwind to Electron
A guide to adding Tailwind CSS to an Electron React project.
Security: Start today
Simple actions can make a big difference in Security. What can we do today to make our lives safer?
thoughtbot’s Year In Review On Clutch For 2021
Our CEO, Diana Bald reflects and celebrates our 2021 Year in Review on Clutch.
How the Beatles Helps Us Reduce Risk
How cross-functional teams and different perspectives help your product (& the Beatles) reduce risk
Ruby Splat Operator 🌟
The Ruby splat operator is confusing and here is why...
An Honest Look at Tailwind as an API for CSS
Treat Tailwind as an API for CSS and avoid common pitfalls of utility-first CSS frameworks.
A Mindset for Better Code
The key to better code is making it easy to delete.
Gratitude
A thank you to everyone who supports thoughtbot and helps us succeed.
Why Your Prototype Isn't Securing Investment
We have a few tips for entrepreneurs to use more than just a prototype to secure investment for their product.
Celebrating 2021 Wins Going Into 2022
Check out this infographic we created while taking some time to celebrate the team's great work in 2021.
Choosing the right database index type
A quick introduction to which database index types are right for the task at hand in Postgresql.
Tailwind and the Femininity of CSS
Why we undervalue front-end expertise in the web development world.
Attending RubyConf Virtually
RubyConf happened last month! It spurred some reflections on the good and bad of virtual conferences.
Making the Case for Practicing Diversity, Equity, and Inclusion at a Company Level
We invest in DEI because it's the right thing to do.
thoughtbot Apprenticeship Applications for 2022 Are Now Open
Applications are now open for our first 2022 Apprenticeships. This is our paid, junior-level position providing structured support and mentorship to get you to be a billable thoughtbot Developer or Designer.
Debugging at the Boundaries
Get better at detecting and preventing bugs by focusing on the boundaries in and around your program.
A Standard Way to Lint your Views
Find out how to use erb-lint to lint your views, including using Standard to lint the Ruby code they contain.
What technologies should I learn?
What technologies do we recommend to early career web developers?
The Benefit of React Native for your v1 Mobile App
What we've learned while supporting our clients in the decision to go with React Native for their first mobile app.
Meet Fiber, Thread's Cooperative Cousin
A brief introduction to Ruby's lightweight concurrency primitive.
thoughtbot Design Link Pack: October 2021
Product Roadmap Best Practices
Our tips can help founders nail their first version product while keeping track of their future vision.
Anouncing the Native vs React Native App Development Live Panel
The hard truths, cold facts, and brutal opinions about React Native.
Integration Testing with Capybara
Blend the speed of `Rack::Test`-driven Integration Tests with the power and utility of `Capybara` finders and assertions.
FOSS Like A Boss
It's possible you've seen the abbreviation while looking for a note-taking app or for alternatives to Google Maps. But what is it?
We’re Fully Remote
In the beginning of 2021 thoughtbot made the decision to go fully remote. This blog highlights a bit more insight into the decision and the excitement we have for the path ahead.
A Broader Take on Parsing
Broadening our definition of "parsing" yields some useful insights.
Ruby Safe Navigation
Ruby's safe navigation can hide some subtle edge cases. We explore approaches to think about conditional logic, alternatives to `&.`, and when `&.` is the best tool for the job.
Models That Match Reality
When modeling a domain, it's important to have our model actually match reality.
Fewer Operations on Custom Types is Valuable
Less is more. Wrapping primitives in custom types restricts your available operations and that's a good thing.
Who is empowered by your API design?
Analysing API design through lens of skill floors and ceilings can help us think about the impact of adding a feature.
Rubocop: Custom Cops for Custom Needs
Parsers, grepping, ASCII art, and how that helps you automating boring stuff.
Using a Function Design Recipe to Debug
Ever notice how some of your bugs are annoyingly simple once you find them? Use this six-step checklist to skip straight through to harder problems.
The Curse of Knowledge
Ever played Charades and acted out the perfect mime to 'James Bond', only to be met with blank stares? That moment when you wonder "Are my friends fools!?", that's the curse of knowledge.
How Validating Your Idea First Can Save You Money
We walk through the importance of product validation and how we've seen it succesfully save founders time and money in planning their first version product.
Seeking Product Managers who love launching NEW products and NEW product teams.
thoughtbot is growing our Product Management Team. Please see our current open positions.
Hotwire: Typeahead searching
Build a search-as-you-type text box with Turbo, Stimulus, and Rails.
Migrating thoughtbot Repositories to use Main as default branch
thoughtbot is moving all of it's GitHub Repositories to use "main" as the default branch.
Spaces: The Final Frontier
One big giant blob of words is hard -- and tedious -- to read. Let's get back to elementary school and see how we can improve this.
Hotwire: Server-rendered live previews
Turbo-charge your Article drafting feedback cycle with Hotwire-powered live previews.
Testing Your Edge Cases
A little combination math goes a long way to catching edge cases.
Solving the Prototype Puzzle
Curious what you can expect from a product prototype. Here is how we suggest getting the most out of a prototyping effort.
MVP vs PoC: What’s the Right Road?
You have a product idea but aren't sure how hard it is to build (or if it's technically possible). thoughtbot shares our perspective when a Proof of Concept might be a good first step before moving forward with your MVP.
I have a product idea. Now what do I do?
Walking through how we work with founders to determine the best first step in exploring a business and product idea.
New Case Study & A Look at Discovery Questions
We are exited to share a new case study featuring our work with Grandstand and also highlighting the Discovery work that helped them quickly plan the right approach.
Debugging Series 2021: Summer Break!
Sometimes, the debugger needs a break.
New Case Study & Updated Services for Early-Stage Teams
After a successful project with Oromoon and others, we've updated our services to better support early-stage companies and entrepreneurs.
Back to Basics: Boolean Expressions
Write Boolean expressions using operators instead of if/else for a more readable outcome.
Modifications we’ve made to the Design Sprint
Design Sprints, by their very nature, are flexible. They follow an overall arc that drives towards testing ideas with potential users, but are not constrained to a single dogmatic way to go about that.
How We Set Up Our Diversity, Equity, and Inclusion Council
Some specifics on how we work towards a more equitable workplace.
Pipeline Decoders in Elm
What's the difference between Elm's classical and pipeline JSON decoders?
Designing for Failure
What ideas can we borrow from video game design to create a better user experience?
Full-text search with PostgreSQL and Action Text
Search through user-provided HTML content with PostgreSQL and Active Record.
Indiana Jones and the Crypt of Cryptic Error Messages
Researching an error message is like deciphering an ancient language and then running into a room full of traps. But without the cool theme music part.
The Investment Pitch Package sets up your product and your business
thoughtbot helps founders translate a product vision into a strong investor pitch deck with a validated prototype and a roadmap for bringing your product to life.
Running Out of Maps
What happens when you need a bigger mapN?
Say ‘Yes’ to More Ideas With The Innovation Challenge
thoughtbot can help your team by enabling them to use product and design-thinking to innovate faster.
Nail your product roadmap with a Discovery Sprint
The Product Discovery Sprint will help you determine the right product roadmap for your idea.
Classical Reasoning and Debugging
Classical philosophy offers us multiple reasoning strategies for dealing with tricky bugs.
Debugging: Navigating the Maze
Bring your yarn ball!
Add punctuation to your alt text
While alt text end punctuation isn’t technically required for compliance, it makes for a better experience for your audience.
Debugging: Listing Your Assumptions
Kick-start your debugging process by turning implicit assumptions into explicit ones.
Debugging: Getting Unstuck
For that crucial tipping point when, after a frenzied blaze of code scouring and log surfing, you realize you've made no progress towards finding that pesky fiendish bug.
Debugging Series 2021: Welcome to the Jungle
Whether you're a novice or a master, we're going to help you level up your debugging game in this multi-part blog series, featuring new content every week!
Organizing Styles in React Native
Styles are important. We should be thoughtful about how we organize them.
We're hiring more remote developers and designers in UTC through UTC+3!
Our new remote developer roles throughout Europe, the Middle East, and Africa, and how we’re working to make the hiring process inclusive.
A conversation can be an output
Rapidly and inexpensively de-risking ideas by talking to people is the true power of a Design Sprint.
New health tech report looks at design in healthcare.
After connecting with leaders across health tech product teams, we are excited to share the trends we are seeing. We hope these ideas help your product team reach their goals.
Inspect Redis commands using MONITOR
Take a look at a live log of all commands run on your Redis server.
Process: Improving on unconscious bias & anti-racism trainings and workshops for 2021
We’ve updated our process for selecting this year’s internal unconscious bias and anti-racism training and workshops. Here’s why and how.
An Introduction to macOS Voice Control
Finally! A way to yell at your computer and have it actually listen.
How to run a panel for fun and profit
Learn how to expand your professional network by putting together an expert speaking panel.
Things We Learned (& loved) From ProductCon
After attending ProductCon, we wanted to share some of our favorite takeaways.
React Server Components: What are They?
React Server Components provide a seamless mechanism for rendering components on the server at any point in the app lifecycle. Should you experiment on this?
What is design debt?
Paying down your product design debt enables you to hit the product metrics you are working towards like acquisition and retention. Let's take a look at what design debt encompasses and some small projects to get you started.
How 3 hours of conversation saved a company hundreds of thousands of dollars
De-risking ideas early and often is an effective, enlightening way of figuring out the how.
Simplifying Tests by Extracting Side-Effects
Test-driven development, object-oriented design, and functional programming converge on some similar ideas.
Understanding SQL GROUP BY
Finally, you too can understand how to use GROUP BY in your SQL queries.
Understanding SQL JOIN
A mental model to understand SQL's JOIN.
Understanding SQL SELECT and WHERE
See WHERE and SELECT visualized in this SQL primer.
Why You Shouldn't Build a Mobile App
Only a fool would build a mobile app!...without making sure they should.
Learn about some big changes at thoughtbot
thoughtbot has a new CEO, is remote-first, and we've reorganized our teams. Ask us anything!
Type-Driven Design, Test-Driven Design
TDD purism belongs to the world of dynamic typing.
We're hiring remote developers!
Our new remote developer role, and how we're working to make the hiring process inclusive.
Scoping .or clauses with common joins
Extract common clauses when using Active Record's .or method.
Useful utilities
A strict type system doesn't mean inflexible. We can bend it to meet our needs with the utilities that ship with TypeScript.
An introduction to macOS Head Pointer
Did you know you could use a mouse without using your hands?
Functional Programming as Algebra
Let's return to everyone's "favorite" subject. 🙄
Send your questions to The Bike Shed!
Ask Steph and Chris your burning questions!
Testing Objects with a Functional Mindset
Some ideas from functional programming can help us improve the unit tests for our object-oriented code.
Type systems and checking in Elixir and Ruby
Adding type checking to dynamically typed languages is possible, and awesome!
Server, They Wrote
A case of how to squeeze your server for every last 💧.
Make a snazzy one-time code input in React Native
Let's make a nice one-time code input in React Native.
thoughtbot is a best place to work. Again!
thougtbot was recently named a Best Place to Work by Built In and Crain's.
Why remove user tracking?
Individual tracking has been removed from thoughtbot.com. Learn more about why and how we made this change.
Zero Downtime Rails Deployments with Kubernetes
If you're deploying with downtime you don't have continuous delivery, you have continuous downtime.
Utility Classes I Have Known and Loved
These are my favorite CSS utility classes. I take them everywhere.
New Case Study: Health Match 360
We've released a Case Study sharing more of detail on the activities and findings of our Product Design Sprint with Health Match 360.
How to stop using your GraphQL API as a REST API
It's so easy to get lost in the flexibility of GraphQL that we can miss out on some of its benefits.
How to Create a Minimum Viable Content Strategy
After starting a business, creating a content strategy might be the last thing on your mind. But you don't have to do months of research to create meaningful content for your audience. Enter: Minimum Viable Content Strategy.
Undercover Founder
Drift can happen between business goals and boots on the ground. When that happens, problems arise.
KISSing It: On Revisiting Old Code
One of the many things that's cringeworthy but worth it.
How to be super-fast with Trello
We use Trello for a lot of our processes and projects. Here's how to be hyper-productive with it.
Next online event: How to turn 2020 learnings into 2021 product strategy
Check out our next panel for an exclusive look at how high growth health tech startups reacted to 2020 curveballs, and what to expect next year.
Alt vs Figcaption
Describing images with the alt attribute and figcaption element.
So you wanna create an eco-friendly website
A client recently asked if it was possible to create a green website. The answer is a little more complicated than you’d expect.
Follow our Product Design Sprint with Health Match 360
thoughtbot is conducting a pro-bono Product Design Sprint with the founders of Health Match 360, and you're invited to watch the process unfold and learn how PDS' help early stage companies get to the next level.
We are storytellers along the code-people change continuum
A commit message is a tiny story.
Next Online Event: The Future of Digital Pandemic Response
We have been working with our client PathCheck to design and develop contact tracing apps. We are both big believers in sharing what we’ve learned, and are hosting a fireside chat to share our learnings.
New Online Workshop: Patient has entered the chat!
Join thoughtbot Design Director Jaclyn Perrone for a fireside chat with Mallory McMillan, User Researcher at Seven, to uncover the challenges and triumphs of conducting remote user research for health tech.
Tailwind versus BEM
There are benefits and drawbacks to every CSS styling approach. Keeping an open mind helps.
Choosing processes that build trust
Do your team's policies, processes, and norms promote trust?
Software's evolving role in the patient experience
In the new wave of tech-enabled communication between patients and providers, it’s not just about convenience. In this online event, we'll talk about expanding access to healthcare, improving health outcomes, and telehealth predictions.
Redirecting routes in a Phoenix application using plugs
Let's explore a pragmatic, flexible, and testable approach to route redirection.
Free Online Event: Scale Your Rails App Internationally
Join thoughtbot and Locale for a free live online event all about scaling your Rails app internationally. Wedesday, October 28th 2020.
Calling All Health Tech Founders - We Are Here To Help!
To best share what we know, and support a deserving health Tech founder, we are seeking applicants for a pro-bono Product Design Sprint.
Beyond Best Intentions
Assuming best intentions is the result of building a culture of trust in your organization, not a step towards it.
Instrumenting your Phoenix application using telemetry
Gain insight into events and performance measurements from your Phoenix application with a simple but scalable integration of telemetry.
Break apart your features into full-stack slices
I often see people split work into horizontal slices. Ticket A: database tables and models. Ticket B: controllers. Ticket C: front-end. There's something better — full-stack slices.
Make small, data-driven performance improvements
Performance issues are a form of technical debt, and we must pay them off by making informed incremental improvements.
Debugging a missing PostgreSQL connection on macOS
could not connect to server: No such file or directory. Is the server running locally and accepting connections on Unix domain socket?
TypeScript: Stop Using 'any', There's a Type For That
Chances are you've worked with the `any` type in TypeScript. It's widely overused, and subtly dangerous. Let's explore why you should avoid it, and when you might truly need to use it.
Data Science in Healthcare Event: Separating fact from fiction
Healthcare companies across the industry are jumping on the trend of creating data science teams, but many of them are jumping prematurely.
The world does not revolve around your product
A common problem I run into with product founders and larger organizations is the idea that their customers will be obsessed with their products.
Pay the cost up front. Don't distribute it to others.
Our communication practices can be very disrupting. Remote work has taught me to be more considerate of how I communicate with others. We should treat other people's time as we like ours to be treated.
Kudos to INDUSTRYconf for these great moments
The thoughtbot team shares what Product Strategy ideas stood out to them from this years INDUSTRYconf.
Beyond basic modal editing. Using vim's command-line mode.
Most people learn vim's `normal`, `insert`, and `visual` modes. But they're only casually acquainted with vim's powerful Ex commands. Let's take a look at some.
Keep Autogenerated Files Synced
Have you ever tried to find a bug that only exists in staging, and no one knows why? That's not nice at all.
Saying no to Diez (for now)
Evaluating Diez, a framework for creating and maintaining design tokens.
New panel: Your path to digital health startup success
We’re calling on health tech industry experts to discuss market incentives, partnerships, regulations, and other business strategy topics.
Consider the Tomato
Tomatoes are a bit of an ontological mess.
Turning COVID Unknowns into an Ongoing Product Strategy
How to strategically pivot your business and product roadmap by testing your assumptions and connecting with customers.
It's time for a new branch
It's easy to check out new branches in Git. We're moving forward with main and leaving master for the reflog.
When a Design Audit is Right for Your Team
Design audits are an eye-opening, rewarding tool. Identifying when to use them is a skill of its own. Let's explore the benefits for your brand and why a design audit might be the right choice for you and your team.
How thoughtbot helped the MBTA improve communication among train officials
We're excited to announce that our work with the MBTA is now featured in the Summer 2020 issue of Design Museum magazine, as well as in a new case study on thoughtbot.com.
Check your return values: APIs
Learn how to apply a little forethought and discipline to provide your users a more informative and stable app experience.
Advice for starting a health tech startup
Startups in the healthcare space have some unique decisions to make early on: which incentives model to use, how to organize a medical team, and identifying legal resources to name a few.
Using patient interviews to prioritize features for a health tech product
Conducting user interviews is especially important for heathcare companies. They help us shape our products, prioritize features, and sometimes even blow our minds.
Check your return values: the Web
Learn how to apply a little forethought and discipline to provide your users a more informative and stable Web experience.
Improving the usability and accessibility of a healthcare website by being mindful of reading level
Improving the reading level is often overlooked or downplayed as unglamorous work. Yet it is one of the most effective things you can do to make a product more usable.
Studio Culture and the Spirit of Vulnerability
A brief exploration into the beloved studio culture at thoughtbot and answering some poignant questions from the perspective of a newbie.
My first remote design sprint
How to be a good human and how to be good to other humans in a remote design sprint.
Flow control in react-navigation
Create asynchronous flow controls using react-navigation.
Join the Panel: How to Optimize Your Product Team During and Post COVID-19
Join us for an upcoming expert panel discussion on how to optimize your product teams during and post COVID-19.
I don’t want your job
It's arrogant to assume you can waltz into a client engagement and fix everything just because you're good at computers.
Understanding Elm's Type Mismatch Error
Breaking down Elm's Type Mismatch error in basic and complex cases.
Selling Technical Debt to the Business
Strategies for getting the budget needed to tackle technical debt.
Find opportunities for optimization and growth with a service blueprint
A service blueprint is a powerful tool for organizational change and product transformation. What does one look like? How is it made? How do you use it?
Gotta Catch an Elm
Using the PokeApi to learn a new language.
SwiftUI Prototype Tutorial 5 of 5: Profile View
In the final installment of our SwiftUI tutorial series, we'll create our Profile view.
SwiftUI Prototype Tutorial 1 of 5: Project Setup
SwiftUI can help us create high-resolution, interactive user interfaces quickly and easily. In this tutorial series, we'll build a SwiftUI prototype for a news app.
SwiftUI Prototype Tutorial 2 of 5: Category Card View
In this installment of our SwiftUI tutorial series, we'll build out our Category Card View.
SwiftUI Prototype Tutorial 4 of 5: Dynamic Categories & Navigation
In this installment of our SwiftUI tutorial series, we'll make our Categories list dynamic and add some navigation to it.
SwiftUI Prototype Tutorial 3 of 5: Categories List
In this installment of our SwiftUI tutorial series, we'll build out our Categories view.
New Online Workshop: How to launch a product in 8 weeks
New Online Workshop: How to launch a product in 8 weeks.
Thinking Through Your Two-Sided Marketplace
A preview of how we strategically think through a two-sided marketplace and an inputs worksheet for establishing engagement goals.
New workshop: There's a typo on the homepage! Website redesign strategy
Your marketing site can be the single most powerful tool at your disposal to amplify your brand and generate leads. So why is website management a headache at nearly every company? Join our upcoming workshop to learn our tips.
Empathy Online
Tips for better communication, even when you're not in person.
Pivoting to Antiracism
Working to iteratively improve thoughtbot is not enough. It is incumbent upon us to identify steps we can take to actively counter racism.
Let’s Build a Custom Publisher in Combine
Once you know the boilerplate, it's not hard to build a custom publisher in Combine.
Another opportunity to learn how to supercharge your Rails app with a Code Audit
We're re-running our online workshop "How to Supercharge Your Rails App with a Code Audit" and you're invited!
Getting Back to Work
Getting back to work after an extended leave-of-absence is hard. Here's some helpful tips to help get you back on track.
This is your threading bug
Solving these bugs often involves doing less, but thinking through them can be tricky.
The Self-Contained Test
Learn how to write tests so they're easy to read and your colleagues will thank you.
Querying with GraphQL optional arguments in Elm
How do optional arguments translate to a language with no such concept?
Powerful Git Macros For Automating Everyday Workflows
Improve your everyday git workflows by automating the boring stuff.
Authentication in Elixir Web Applications with Ueberauth and Guardian: Part 4
Part 4 in a series on Ueberauth and Guardian authentication. Let users register and log in using OAuth providers like Google.
New online workshop: Protect your Rails app against security threats during COVID-19
Join us as we discuss the rise of security threats during COVID-19, and how upgrading your Rails application can protect your business and users.
Authentication in Elixir Web Applications with Ueberauth and Guardian: Part 3
Part 3 in a series on Ueberauth and Guardian authentication. Let you users log in and log out of their existing accounts.
Authentication in Elixir Web Applications with Ueberauth and Guardian: Part 2
Part 2 in a series on Ueberauth and Guardian authentication. Let your users create accounts with an email address and password using Ueberauth and Guardian.
Authentication in Elixir Web Applications with Ueberauth and Guardian: Part 1
Part 1 in a series on Ueberauth and Guardian authentication. Build a basic Phoenix application with authentication pages to prepare for Guardian-based authentication features.
Using Design To Help Steel Warriors Fight Knife Crime
How we applied design thinking to tackle a problem in our community.
Confirm your changes at the end of a git rebase
It's not always obvious what changed in your code after a git rebase. This tool makes changes more visible and helps you undo them if needed.
Android Architecture Comparison: MVP vs MVVM
A brief look at two of the most common Android architecture patterns.
Building your product: from zero to MVP
If you're about to build a digital product, you may, like the rest of us, have some trouble getting started. Here's what we recommend.
Working Together to Prioritize Your Product
How design, engineering, and product management work together to prioritize your product.
New Online Workshop: How To Unstick Your Product Strategy with One Exercise
Watch thoughtbot Design Director Jaclyn Perrone facilitate a live, unscripted Lightning Design Jam with the product team at HBR.
On Quitting Vim
Vim has a reputation for being hard to quit. But it turns out there are so many ways to get out of it — it's like vim wants you to quit. Let's look at a few.
Web Security During the COVID-19 Pandemic
The COVID-19 pandemic has brought with it an increase in cyber threats, but we can fight back by being more thoughtful about web security.
Don't Worry, There's a Method to the Meeting
Make meetings productive by treating them like coding functions.
Working Remotely is a Skill
Recognizing it as a skill will help you and your team level up.
Fostering Inclusive Remote Workplaces
Learn strategies for fostering an inclusive culture when working remotely.
Variety is the spice of podcast: new season of Giant Robots Smashing Into Other Giant Robots
Giant Robots podcast will follow the trials and tribulations of 3 different startups in real time.
Playbook updates: New Rapid Product Validation Section and Designing Section Updates
Over the last few months, we've made some big changes to our playbook. We've added a new section, Rapid Product Validation, and updated our Designing section.
Strategies for transitioning your technical team to remote work
Explore strategies for effective communication and collaboration while your team is transitioning to remote work.
Priority Determines Product
Build a useful product by balancing speed, feedback and focus.
Running Your First Design Sprint (and how to do it remotely)
Go on a deep dive of how to run a design sprint, even when you can't be there in-person.
New Online Workshop: How to Supercharge Your Rails App with a Code Audit
Learn thoughtbot's approach and process around conducting code audits on Rails apps for our clients.
Going through changes with TypeScript
When we inevitably make changes to our codebase, any help is appreciated, and a type system can be your best friend.
Combine + Diffable Data Source
Let's explore two powerful native frameworks.
New online Q&A: Being human in the absence of humans
Join a panel of our experts as they answer your pre-submitted questions and share favorite tools, tips, and more for remote working in these challenging times.
How to start processes with dynamic names in Elixir
Good practices for using Registry to name processes dynamically.
Chromedriver/Chrome 80 cookie domain bug
Chrome 80 introduced tighter control around trusting TLS certificates, which unearthed an interesting bug for one of our projects running on CI.
Recurring Events and PostgreSQL
Scheduling, recurring events and relative dates have always been hard. Until now.
Modern TypeScript and React Development in Vim
Learn how to imbue your vim setup with the power of the TypeScript language server.
File Upload with Elm and ActiveStorage
Making Elm + Rails/ActiveStorage play nice together.
A Glossary for Data Engineering
We've doing more data engineering for clients lately. Every time I say we're doing that, I have to explain what it is and what we're doing! A brief glossary to describe data engineering and some common practices and technologies in the data engineering ecosystem.
Waiting for File Write Completion on iOS
It's straight forward to watch a directory for file writes, but how can you be alerted when a file has finished being written?
Little Library
A hackathon project to make a virtual bookshelf.
How to Get Better at Pair Programming
Pairing is an essential tool for designers and developers. This is a checklist of what we think you should consider every time you pair.
Problem-Solving Symbiosis
Approaching diversity and inclusion through a novel partnership.
Do you break your Elixir eggs on the big end or the little end?
From big-endian to little-endian through unsigned integers. A tale of two ends, and Elixir shines again.
Don't forget the silent step when you squash and merge
GitHub's squash and merge button is great. But make sure to write a good commit message before you confirm those changes.
How HTTP Cookies Work
How do browser cookies even work? Let's find out together in this story with a lucky ending.
Ruby Memoization and Alternatives
As Ruby developers, we tend to memoize too often.
Intro to Machine Learning
George Brocklehurst gives an overview of what Machine Learning is and what it can do, before live-coding a simple Machine Learning system.
Rails Path Helpers and the Mystery of the Missing Route Key
Rails Path Helpers embark on a quest to find a missing route key only for the tester to discover that errors lie just around the bend...
A designer developing for Android
Here's some advice for designers who find themselves developing Android apps.
Let's Set Up Your iOS Environments
A deep dive into configurations
Supporting Android permissions in React Native
Starting November 1st, all updates to Android apps on the Google Play Store will need to target API 26, which means supporting a new permission model.
Concise Media Queries with CSS Grid
Write less CSS and organize responsive layouts with ease.
Tab completion in GNU Readline: Ruby edition
Learn about the new Readline features coming to Ruby soon.
Announcing: Our Online Learning Platform Upcase is Now Free!
We've got some big news about our online learning platform Upcase, and we think you're gonna love it!
Is Elixir a scripting language?
Elixir is known for being a language made for building distributed applications that scale, are massively concurrent, and have self-healing properties. But is Elixir good enough for the mundane scripts of this world?
People, not resources
Hello, fellow resources!
Static Types In Medias Res
Adding static types after the fact can be a boon to your React Native codebase.
We Don’t Always Know What’s Better for Us
We self-selected open offices because they felt better. How do we ensure we're making good long term choices and not just choosing what feels good now?
Building a Startup is Hard, Let's Make it Easier
Purpose-built is a new resource center to bring expert advice to founders, no matter their level of technical expertise.
The Icebox is where stories go to die
Get rid of your Icebox. Reduce your overhead, clarify your roadmap, and make it easier to estimate timelines.
Write good commit messages by blaming others
To write good commit messages, you must read commit messages. And to read commit messages, you must use git blame effectively.
The Real Story Behind Story Points
I estimate a 13.
Deprecating static attributes in factory_bot 4.11
Static attributes have been the source of much confusion over the years. Their deprecation will come with a rubocop-rspec Cop to automatically replace with dynamic attributes.
Chess and Recursion: Part 1
It turns out solving chess moves with recursion and pattern matching is a lot of fun!
Recommending blog posts with machine learning
How we recommend similar posts with an LDA topic model.