Despite the catchy song from “Encanto” advising us otherwise, today we’re going to talk about Bruno, an API client, which has quickly become my go-to API client.
Our team, like many others, used Postman as our preferred REST API client. It helped streamline and simplify the process of interacting, debugging, and testing our endpoints and those of 3rd parties that we worked with.
Unfortunately, when Postman pivoted to a cloud-centric model, it greatly limited what you could do without a cloud account (something that we were not allowed to use because of company restrictions due to security risks).
This started a search for a new alternative. Little did we know, we’d end up finding something that would end up working out better for our needs and workflow.
The Search Criteria
Our journey began when Postman’s pivot to a cloud-centric model prompted us to seek an alternative that aligned more closely with our requirements:
Multiple Collections Support: Essential for organizing our API requests efficiently.
Environment Variables: A must-have feature for seamless switching between development and production environments.
Scripting Capabilities: Highly desirable for leveraging responses across endpoints and adding logic to our processes.
Local Support: A non-negotiable attribute, ensuring no reliance on cloud storage or external servers.
Cost-Effective: Free access was a critical factor, given the logistical challenges of obtaining approval for team-wide purchases.
Team Synchronization: Ideally, a solution that facilitates easy sharing and updating of collections among team members. This was a big nice to have. We were using the free tier of Postman so we had been passing around exported files to share collections between teammates. This led to out-of-sync collections and was a big hassle to maintain. This wasn’t the only team I had encountered this with, so I really wanted a solution to make this easier going forward.
The Contenders
Our evaluation included several promising tools, each with its unique strengths and limitations:
Insomnia: A strong Postman competitor that used to be my preference, but after an update, it also required a cloud account access similar to Postman and severely limited local only use of the application. (I haven’t gone back to try it out since, but it looks like they reversed this decision.)
Thunder Client: Being built into VS Code, meant that you don’t have to leave your IDE, but it only supported VS Code which not everyone in our team uses. The free tier only allows for 50 requests per collection which would also have meant that we would need to break down our collections.
Why Bruno Stood Out
Bruno emerged as the clear winner in our search. Here’s why:
Comprehensive Feature Set: Bruno offers an array of functionalities, from multiple collections and environment variables to scripting capabilities, without compromising on user experience.
Multi-Platform Support: There are multiple ways to use Bruno including a desktop app, CLI, and VS Code extension; making everyone on our team happy regardless of their preferences.
Versatile Import Support: We could easily import our Postman collections and environments into Bruno. It also supports importing Insomnia collections and OpenAPI v3 specs.
But the things that really stood out were:
Team Collaboration: Unlike our previous approach with Postman, Bruno’s git-friendly nature streamlines collection sharing and updates, fostering better team collaboration. No paid tier needed and no more passing export files back and forth!
Local, Open Source, and Free: Bruno’s commitment to local support and open source aligns perfectly with our team’s principles and logistical constraints.
What collections and API requests look like within Bruno.
Questions about Bruno
How does Bruno manage the collections?
After you point Bruno to a folder, Bruno automatically organizes your collections as subfolders within it and your API requests as plain text files. You can set this folder up as a Git repository so that you and your team can manage this with version control. Anyone else on your team that wants to use your collection, can just clone the repository and open the collection in Bruno.
You can check out Bruno’s sample repository as an example.
If it’s getting managed in Git, how do you prevent secrets from getting committed?
When using environment variables in Bruno, you may encounter sensitive data, like secrets, that shouldn’t be exposed in your repository. To protect these, ensure you mark them as “Secret” within Bruno. This action signals Bruno to handle these secrets discreetly, ensuring they are not recorded in the text files, thus maintaining the security of your sensitive information.
Make sure to check the “Secret” box for any environment variables that should not get committed.
Conclusion
Bruno stands out as an API client that offers a good blend of functionality, collaboration, and user-friendliness. For any team looking to enhance their API development and testing processes, Bruno is a compelling choice that is worth considering.