Code Monkey home page Code Monkey logo

bruno's Introduction


Bruno - Opensource IDE for exploring and testing APIs.

GitHub version CI Commit Activity X Website Download

English | Українська | Русский | Türkçe | Deutsch | Français | Português (BR) | 한국어 | বাংলা | Español | Italiano | Română | Polski | 简体中文 | 正體中文 | العربية

Bruno is a new and innovative API client, aimed at revolutionizing the status quo represented by Postman and similar tools out there.

Bruno stores your collections directly in a folder on your filesystem. We use a plain text markup language, Bru, to save information about API requests.

You can use Git or any version control of your choice to collaborate over your API collections.

Bruno is offline-only. There are no plans to add cloud-sync to Bruno, ever. We value your data privacy and believe it should stay on your device. Read our long-term vision here

Download Bruno

📢 Watch our recent talk at India FOSS 3.0 Conference here

bruno

Golden Edition ✨

Majority of our features are free and open source. We strive to strike a harmonious balance between open-source principles and sustainability

You can buy the Golden Edition for a one-time payment of $19 !

Installation

Bruno is available as binary download on our website for Mac, Windows and Linux.

You can also install Bruno via package managers like Homebrew, Chocolatey, Scoop, Snap, Flatpak and Apt.

# On Mac via Homebrew
brew install bruno

# On Windows via Chocolatey
choco install bruno

# On Windows via Scoop
scoop bucket add extras
scoop install bruno

# On Windows via winget
winget install Bruno.Bruno

# On Linux via Snap
snap install bruno

# On Linux via Flatpak
flatpak install com.usebruno.Bruno

# On Linux via Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list

sudo apt update
sudo apt install bruno

Run across multiple platforms 🖥️

bruno

Collaborate via Git 👩‍💻🧑‍💻

Or any version control system of your choice

bruno

Sponsors

Gold Sponsors

Silver Sponsors

Bronze Sponsors

Important Links 📌

Showcase 🎥

Support ❤️

If you like Bruno and want to support our opensource work, consider sponsoring us via GitHub Sponsors.

Share Testimonials 📣

If Bruno has helped you at work and your teams, please don't forget to share your testimonials on our GitHub discussion

Publishing to New Package Managers

Please see here for more information.

Stay in touch 🌐

𝕏 (Twitter)
Website
Discord
LinkedIn

Trademark

Name

Bruno is a trademark held by Anoop M D

Logo

The logo is sourced from OpenMoji. License: CC BY-SA 4.0

Contribute 👩‍💻🧑‍💻

I am happy that you are looking to improve bruno. Please check out the contributing guide

Even if you are not able to make contributions via code, please don't hesitate to file bugs and feature requests that needs to be implemented to solve your use case.

Authors

License 📄

MIT

bruno's People

Contributors

ajaishankar avatar anusreesubash avatar arnaduga avatar awinder avatar brahma-dev avatar cwilper avatar dcoomber avatar dogukanurker avatar dozed avatar grubersjoe avatar helloanoop avatar its-treason avatar jaktestowac avatar jsoref avatar lared avatar lohxt1 avatar martinsefcik avatar mjhcorporate avatar mvmn avatar n00o avatar nelup20 avatar nikhil569 avatar notfounnd avatar pchaparro avatar sanjai0py avatar scotsoo avatar snippetkid avatar survivant avatar therealrinku avatar tpyle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bruno's Issues

Search and Copy functionality need to be supported in response

Currently, the functionality to search is limited to the request body and not available in the response body. In case of large response received for certain requests the user is unable to search in the response body. Similarly in case of copying the response also the user is restricted.

Proposal: Bruno Workflows

This is a proposal for implementing workflows in Bruno.

Somewhat related to Bruno Test Script RFC #46

Workflows:

  1. A workflow is an ordered sequence of API calls
  2. Data from the previous response can be used in the current request
  3. A developer can easily setup and run a sequence of api calls, as opposed to painfully copy pasting response snippets one by one before executing the next collection method
  4. This could also be used in test scripts to assert the final response.

Examples:

  1. Login and pass the auth token in further API calls
  2. A Shopping flow would search for products, add product(s) to the cart, encrypt payment method then checkout

A workflow would be a first class concept in Bruno similar to collections.

├── collections
│   ├── POST /login
│   └── PUT  /profile
└── workflows
    ├── Update Profile
    │   ├── 1. login
    │   └── 2. update profile
    └── Shop
        ├── 1. search products
        ├── 2. add item
        ├── 3. encrypt card
        └── 4. checkout

Defining a workflow is simple enough, but how do we pass variables over is the interesting part of this proposal.

In Postman after an API call we can run a "post request script" to set collection variables, which are then reused in rest of API calls. But usually it is difficult to understand what the script does, what variables are set, since these are well... scripts :)

Workflow implementation

  1. Every workflow runs in a new session
  2. A session holds a set of variables that can be embedded in request body or headers
  3. Each step in the workflow can declare a post request json config
  4. This config updates the session variables (using say json query) which are further used down the chain

The idea is... look ma, no scripts!

Update profile workflow steps

  1. login
    post script config
    {
       "token": "$res.data.token"
    }
  2. update profile schema
    {
      "method": "PUT",
      "url": "/profile",
      "headers": {
        "Authorization": "Bearer $token"
      },
      "body": {
      }
    }

Tests:

  • Rather than complex asserts in scripts, the workflow could define the expected json at the end of the workflow
  • Bruno would compare the final response to the expected json
  • The workflow runner could capture and show intermediate step failures.
    • Step gave a non 2xx response
    • Step succeeded but did not contain a value that was supposed to populate a variable

Everything being simple json provides a lot of benefits and opportunities.

@helloanoop I can do a PR if this is something you'd be interested in.

End to End Encrypted Collections

Description

Collections should be fully encrypted while being saved on the server (both for users and teams)

Why

Well, security is very important. And users should have the option to choose to have their collections stored end to end encrypted on the server

Problems

This requires the user to create a vault password for decrypting the collections locally. The problem with this is that if a user forgets the vault password (which is not that rare), then the whole collection is lost.

This gets trickier with teams, as you don't want the entire team to come to a standstill if the admin forgets his password.

Notes

  • I have reviewed Insomnia's approach of implementing e2ee and I like that approach of making team collections work using diffie hellman based key exchange. I'd be happy to hear other approaches.
  • The project is at very early stages, and I'd like first to have a decent platform built which supports teams and collaboration feature, before working on encryption. The plan is to allow provide an option to choose e2ee when collections are created.
  • The UI needed to enable a smooth e2ee experience will also need time to be designed well.

Package desktop app using Tauri

I added the package to build using tauri in #20

When I brought the app up on Webview on linux, it was a bit janky. The fonts were not smooth, the transitions were slow.
I am holding off a tauri build for v1.alpha and pushing it to v2.alpha

The good parts that came out of this exercise was that, I was able to decouple the nextjs app from being tightly coupled with electron. Now I plan to also make the app available on web

Initially I thought that I will have to ditch electron in favour of tauri. But after going through the exercise of splitting up the nextjs app separately and the electron packager into separate repos, this led me to the realisation that I can ship multiple distributions (electron, tauri, webapp, chrome extension)

In the long term Bruno will ship both Tauri and Electron builds.

Move bruno testbench into packages

The api testbench sits in a separate repo.
Since we are using npm workspaces and using a monorepo model, lets create a package for testbench and archive the older repo.

Need to Reload Panel or Quit From Window

When i launch bruno in my Linux Mint Desktop:

  1. Renaming workspace (I need to quit from window and start bruno, then I can see workspace name is changed)
  2. When I cancel to create a collection (I need to ctrl+r or click view > reload and my cursor work again)

Bruno version: v1.25.2 (On Desktop App)
File I downloaded is: bruno_0.1.0_amd64_linux.deb from Github Release Page


This project is amazing, if bruno have code request generator like Postman it will be nice 👍 and dark mode theme.
Where I can read CONTRIBUTION.md to know how it build and I can contribute to translate or documenting bruno.

Clone Request

Request dropdown should support to duplicate a request.

Clone Folder

As a user, I must be able to clone a folder.

Notes
I think users clone requests more often, then cloning entire folder.
Assigning this to v2 milestone

Save query params in request

Query params are currently being saved in url. They need to be saved in request too, and get hydrated in the UI upon reload.

Cannot delete the first workspace while deletion icon is active

I don't know whether this is a bug or intended behaviour, but either way something goes wrong.

The first workspace cannot be deleted like the other workspaces while it can be renamed.

If it cannot be deleted, the trash icon should not be shown in my opinion.

Collections icons partially working

On clicking icons, the action should be the same as clicking on the text alongside the icon. 'Import Collection' and 'Load Sample Collection' icons are clickable, but the Icons of 'Create Collection' and 'Add Collection to Workspace' has no action.

On hovering the icons, cursor should become pointer.

bruno-issue

Bring Your Own Version Control

Most of the open source api clients out there always bring in their custom flavour of version control to enable collaboration amongst teams. This is usually how the projects are able to earn some revenue.

While developing bruno, it occurred to me that we could mirror the structure of collection directly on the filesystem. And have the request stored as json files. This also enables people to keep their collections entirely private as well as use their preferred version control tool (like git) to enable team collaboration over collections.

I want bruno to offer both possibilities for the user.
The user can choose to use the teams feature (yet to be built) to collaborate with teams OR store the collection directly on filesystem.

Export and Import Bruno Collections

We need to have support for exporting and importing Bruno Collections.

I am not including this in the v1.alpha.
The goal of v1.alpha is to get the project out first.

Currently assigning this to v1.beta
If you are looking to contribute to the project, this is a good issue to pick up.

Request Save Button

Reported by @vyskh2498

Currently the shortcut for Save is Ctrl+S / Cmd+S
Need to see if we can add a save button in the UI

Also, When you close a tab which has unsaved changes, we need to show a popup whether they want to save the changes OR close the tab without saving

Graphql Support

  • Support for running graphql queries
  • Graphql Docs Explorer (similar to graphiql)

Docker Support

We need to support developers to run bruno on docker

Once you run npm run build:dev, it will create a build in the packages/bruno-app/out folder.
We need to take the contents of the "out" folder and create a docker image and be able to run the docker image on your local and use bruno.

Dockerfile will be located at the root of the project directory

A nice video to get NextJS builds running on docker
https://youtu.be/Pd2tVxhFnO4

Autocomplete for Request headers

Autocomplete for request header keys.
Like the user should not have to type the entire work "Content-Type"

image

We need to support the commonly used request header types as well as allow the user to enter custom headers.

Lets see if we can make this work without having to use any autocomplete react library.
I have implemented dropdown like this in an older project (that is not completed yet) see here

We will implement the Header Value autocomplete once this has been done for Header Names.

RFC - Test Scripts

I have tried to reason from first principles as much as possible while building bruno, and not be blinded by the current status quo (which is how postman does the same stuff).

Here is a page on how bruno thinks differently: https://www.usebruno.com/design

Test scripts are very big and important feature. And I'd like to take this opportunity to rethink from first principles before we build this feature.
Being a developer, I have used api clients mostly to connect with api's, but not to write automation tests for them.

So I'd like to hear out from the community

  1. What are your biggest pain points while writing test scripts in postman ?
  2. What are some of the features that you adore in postman or other similar tools ?
  3. Any additional suggestions or comments

GraphQL load schema is not using custom headers.

I have tried to use bruno with Shopify GraphQL.
It requires X-Shopify-Access-Token header to be set for authorization purposes.

Load schema function does not use custom headers, so fetch fails with status 401 and response:
{"errors":"[API] Invalid API key or access token (unrecognized login or wrong password)"}

Simple request works as expected, header is used normally. Schema load fails.

Theme Extension support

Bruno should be built with extensibility in mind to allow customization and enhancement of the application. It would be nice to have something similar to what VS Code have

Collections Page

Display Collections list upon clicking the collections icon in the menubar

Support Ordering of Requests

This feature is super critical before we introduce test scripts.
Because in test scripts, the order of execution matters.

Thinking of saving a new key called position in every request.
To start, Let's just build support for ordering requests under the same parent using drag and drop.

And then we can later extend it to moving requests anywhere inside the collection.
And then, much later, to move folders anywhere. This looks like a pretty challenging and fun feature to implement.

Importing Postman Collections

Postman is the de-facto tool when among developers.
It's very important to allow developers to be able to import a postman collection into bruno.

It must be noted that bruno has a lot less features than postman, but we do support the essentials for anyone to get started.

Resources:
Bruno's request schema: https://github.com/usebruno/bruno/tree/main/packages/bruno-schema
Importer for bruno collections: https://github.com/usebruno/bruno/blob/main/packages/bruno-app/src/utils/collections/import.js

Lets get started with just importing as much of a request data that we can import from postman.

Currently, we can create a new file called 'import-postman-collections.js'. Once this is coming along well, we can move the importers to a separate package called as "bruno-importers"

UX:
Right now, clicking on import brings up a file selector. We need to bring up a modal that has 2 links.
One to import bruno collection, another to import postman collection.
image

Ephermal Requests

As a user, I should be able to create ephermal requests.
When I click on the "+" icon, It should create a request with the name as "Untitled" and GET method with url being empty.
Upon clicking Save, it should show a location selector where I can select the folder where I want to save the request.

Workspaces - Add, Edit and Delete

  • User should be able to create, edit and delete
  • Edit should open a nested modal
  • Delete should ask for confirmation
  • Create should also open a new modal
  • Current workspace should cannot be deleted (disable delete button)

Better Schema Error Parsing

Currently if there is a schema validation error due to workspace or collection not matching the schema, we are not parsing the error thrown by yup.

We need to write a parser that can parse the errors and humanize the message

export const addWorkspace = (workspaceName) => (dispatch) => {
  const newWorkspace = {
    uid: uuid() + "junk",
    name: workspaceName
  };

  return new Promise((resolve, reject) => {
    workspaceSchema
      .validate(newWorkspace)
      .then(() => saveWorkspaceToIdb(window.__idb, newWorkspace))
      .then(() => dispatch(_addWorkspace({
        workspace: newWorkspace
      })))
      .then(resolve)
      .catch((err) => reject(parseError(err)));
  });
};

Dark Mode

Bruno's layout is inspired by VSCode layout and colors.
For the dark theme colors, please refer the vscode dark theme.

Goal here is to get a dark theme out soon (based on vscode dark theme)

PS: In the future, we will add support for custom themes.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.