├── .eslintrc.json ├── .github └── workflows │ └── build.yml ├── .gitignore ├── .nvmrc ├── LICENSE ├── jsconfig.json ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── posts ├── announcing-version-1.md ├── bootstrapping.md ├── launching-bruno-cli.md ├── the-saas-dilemma.md └── welcoming-samagata-as-our-founding-sponsor.md ├── public ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── github.svg └── images │ ├── bruno-cli.png │ ├── bruno-face-reveal.png │ ├── bruno-first-commit.png │ ├── foss-3.0-booth.png │ ├── foss-3.0.png │ ├── github-collection-2.png │ ├── landing-2.png │ ├── local-collections.png │ ├── monthly-users-oct-2023.png │ ├── run-anywhere.png │ ├── sponsors │ ├── commit-company.png │ ├── samagata.png │ └── zuplo.png │ ├── star-counter.png │ ├── team │ ├── anoop-pic.jpeg │ ├── anoop.png │ ├── anusree-pic.jpeg │ ├── bruno.png │ ├── lohit-pic.jpeg │ └── sanjai-pic.jpeg │ ├── testimonials │ ├── DivyMohan.png │ ├── NooclearWessel.png │ ├── arnaud.png │ ├── barath.png │ ├── bramhoven.png │ ├── daputzy.png │ ├── david.png │ ├── lasko.png │ ├── lonewalk.png │ ├── matthewtrow5698.png │ ├── nesbert.png │ ├── power-tester.png │ ├── ptrdlbrg.png │ ├── ramiawar.png │ ├── ramiawar2.png │ ├── retrocoder.png │ ├── rosh.png │ ├── sudeep.png │ ├── sumit.png │ ├── tobias.png │ ├── vijay.png │ └── vysakh.png │ └── version-control.png ├── readme.md ├── scripts └── generate-rss.js ├── src ├── components │ ├── Blogpost │ │ ├── StyledWrapper.js │ │ └── index.js │ ├── Bruno │ │ └── index.js │ ├── Footer │ │ ├── StyledWrapper.js │ │ └── index.js │ ├── Navbar │ │ ├── Dropdown │ │ │ └── index.js │ │ ├── FlyoutMenu │ │ │ └── index.js │ │ ├── StyledWrapper.js │ │ └── index.js │ └── PaypalCheckout │ │ └── index.js ├── globalStyles.js ├── pages │ ├── _app.js │ ├── _document.js │ ├── about.js │ ├── blog.js │ ├── blog │ │ └── [slug].js │ ├── bru.js │ ├── buy-golden-edition.js │ ├── changelog.js │ ├── compare │ │ └── bruno-vs-postman.js │ ├── downloads.js │ ├── golden-edition-demo.js │ ├── index.js │ ├── manifesto.js │ ├── perpetual-fallback-license.js │ ├── pricing.js │ ├── privacy-policy.js │ ├── sponsors.js │ ├── support.js │ └── terms.js ├── styles │ ├── globals.css │ └── markdown.css └── themes │ └── default.js └── tailwind.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals", 3 | "rules": { 4 | "react/no-unescaped-entities": "off", 5 | "@next/next/no-html-link-for-pages": "off" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | env: 10 | CI: true 11 | NODE_ENV: 'test' 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - name: checkout 19 | uses: actions/checkout@v4 20 | 21 | - name: setup node 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version-file: '.nvmrc' 25 | 26 | - name: install 27 | run: npm ci 28 | 29 | - name: build 30 | run: npm run build 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | 36 | rss.xml -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Anoop M D and Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "allowSyntheticDefaultImports": false, 5 | "baseUrl": "./", 6 | "paths": { 7 | "components/*": ["src/components/*"], 8 | "pageComponents/*": ["src/pageComponents/*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", "dist"] 12 | } -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | compiler: { 4 | styledComponents: { 5 | pure: true, 6 | } 7 | }, 8 | publicRuntimeConfig: { 9 | PAYPAL_CLIENT_ID: process.env.PAYPAL_CLIENT_ID, 10 | PAYPAL_ORDERS_API: process.env.NODE_ENV === 'development' ? 'http://localhost:4000/api/paypal/orders' : 'https://bruno-payments-ad6f4acc582a.herokuapp.com/api/paypal/orders' 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bruno-website", 3 | "private": true, 4 | "engines": { 5 | "node": "18.x" 6 | }, 7 | "scripts": { 8 | "dev": "next dev", 9 | "build": "next build", 10 | "prebuild": "node scripts/generate-rss.js", 11 | "start": "next start", 12 | "lint": "next lint" 13 | }, 14 | "dependencies": { 15 | "@headlessui/react": "^2.1.2", 16 | "@paypal/react-paypal-js": "^8.1.3", 17 | "@tabler/icons": "^1.100.0", 18 | "@vercel/analytics": "^1.1.0", 19 | "feed": "^4.2.2", 20 | "gray-matter": "^4.0.3", 21 | "marked": "^4.3.0", 22 | "next": "13.5.5", 23 | "react": "^18.2.0", 24 | "react-dom": "^18.2.0", 25 | "react-is": "^18.3.1", 26 | "react-markdown": "^9.0.1", 27 | "react-switch": "^7.0.0", 28 | "react-tabs": "^6.0.2", 29 | "react-use": "^17.4.0", 30 | "styled-components": "^5.3.3" 31 | }, 32 | "devDependencies": { 33 | "autoprefixer": "^10.4.17", 34 | "css-loader": "^6.5.1", 35 | "eslint": "8.4.1", 36 | "eslint-config-next": "12.0.7", 37 | "postcss": "^8.4.35", 38 | "style-loader": "^3.3.1", 39 | "tailwindcss": "^3.4.1" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /posts/announcing-version-1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'announcing version 1.0.0' 3 | date: '2 Nov 2023' 4 | description: 'announcing bruno version 1.0.0' 5 | --- 6 | 7 | Hello everyone! 👋 8 | 9 | We're happy to announce that the **Version 1.0.0** is finally here! 🎉 10 | 11 | In the post, we'd like to share what V1 means for Bruno, some of the highlights of the journey so far, and what's next. 12 | 13 | 14 | ## Version 1.0.0 15 | 16 | We actually wanted to get a [lot of things](https://github.com/usebruno/bruno/discussions/384) done before we release V1. But the community [felt that](https://github.com/usebruno/bruno/issues/643#issuecomment-1766707137) we are already there, and that a lot of people and teams are already using Bruno in production. 17 | 18 | This made sense to us. V1 does not mean that we have all the bells and whistles. It's more of a message that we are ready for production use. We have a stable API, we have a stable CLI, and we have a stable UI. We have a lot of features, and we have a lot of things to improve. But we are ready for production use. 19 | 20 | 21 | ## Beginnings 22 | 23 | Bruno started as a passion project in late 2021. I set out to build a beautiful curl UI. 24 | 25 | ![first commit of bruno](/images/bruno-first-commit.png) 26 | 27 | I worked on it, mostly alone, for 2 years until the stars aligned on September 28th 2023. 28 | The project got visibility and it has been a wild ride since then. 29 | I wrote about the [early days and struggles here](https://github.com/usebruno/bruno/discussions/269) 30 | 31 | You can also read about the origins of the git nature of Bruno [here](/blog/the-saas-dilemma). 32 | 33 | 34 | ## Github Stars 35 | 36 | The star counter went crazy, we experienced vertical liftoff. 37 | It tooks us **2 years** to got from **0 to 500 ⭐**, and **10 days** to got from **500 to 5000 ⭐**. 38 | 39 | As of this writing, we have over **7k stars**. 40 | ![star counter](/images/star-counter.png) 41 | 42 | ## Monthly active users 43 | 44 | Its not just stars, we also massive growth of people who use bruno. For 23 months, we had around 100-200 people who used Bruno every month. But in the Oct 2023, we had **over 20,000 people** use Bruno. 45 | 46 | ![monthly users oct 2023](/images/monthly-users-oct-2023.png) 47 | 48 | ## Contributors 49 | 50 | Bruno's community has experienced remarkable growth, seemingly out of nowhere. In the span of a single month, from October, the number of contributors surged from **15** to a remarkable **86**. What's even more impressive is that during October alone, we successfully merged over **200 pull requests**. 51 | 52 | And there are still over **50 pull requests** waiting to be [merged](https://github.com/usebruno/bruno/pulls). 53 | 54 | This rapid pace of growth is also a testament to the quality and robustness of our codebase, which allowed us to readily accept these contributions and scale up with confidence. 55 | 56 | We can't thank enough 💛 to all the people who contributed to Bruno and helped us get here. 57 | 58 | ## Reaction 59 | 60 | It has been exhilarating to see the reaction of the community. We are not an alternative, but a new way of working with API Collections. We are re-inventing the Api Client. 61 | 62 | You can check out the testimonials on our landing page. If you'd like to share your experience with Bruno, please [write here](https://github.com/usebruno/bruno/discussions/343) 63 | 64 | People love the opensource, git-friendly, fully-offline approach of Bruno. 65 | 66 | ## FOSS 3.0 Conference 67 | 68 | Our talk was selected for the FOSS 3.0 conference. We also had a booth setup and we met a lot of people who use Bruno. It was a great experience. 69 | You can [watch the talk here](https://www.youtube.com/watch?v=7bSMFpbcPiY) 70 | 71 | We'd like to thank [FOSS United](https://fossunited.org/) for giving us the opportunity to share our story at IndiaFOSS 3.0. 72 | 73 | ![foss 3.0 talk](/images/foss-3.0.png) 74 | 75 | ![foss 3.0 booth](/images/foss-3.0-booth.png) 76 | 77 | ## Bruno ? 78 | 79 | I shared the story of how Bruno got its name [here](https://youtu.be/7bSMFpbcPiY?si=Gno9M7G5LFdwa1Yg&t=869). You can go to the 14:30 mark in the video to hear the story. 80 | 81 | Here is Bruno. The prince who will be fetching your Api's. 82 | 83 | ![bruno](/images/bruno-face-reveal.png) 84 | 85 | ## What's Next ? 86 | 87 | I have been documenting the journey of Bruno [publicly here](https://github.com/usebruno/bruno/discussions/269). You can checkout our [roadmap](https://github.com/usebruno/bruno/discussions/384) 88 | 89 | Our mission is to 90 | 91 | * Build the most simple, beautiful, and powerful API client that developers love. 92 | * And uphold these principles 93 | * 👩‍💻 Opensource - build collaboratively, code released under MIT license 94 | * 🔒 Privacy - Collections are stored locally 95 | * 🕊️ Freedom - Free to use and modify. 96 | * 🤝 Community - Foster a thriving community of contributors and users 97 | * 📜 Transparency - Document the journey openly and engage in public discussions 98 | * 🤑 Sustainability and Incentives - Generate income along the way 99 | 100 | As far as how we build a sustainable business, we are still in the process of figuring out a right balance that works for the community, the contributors and the creator. We are exploring a few options. We are also open to ideas and suggestions. If you have any ideas, please [share here](https://github.com/usebruno/bruno/discussions/384). 101 | 102 | We are here for the long run. We want to give developers what they have always wanted. A beautiful curl UI. 103 | 104 | Godspeed 🖖 🐶 💛 105 | 106 | 107 | -------------------------------------------------------------------------------- /posts/bootstrapping.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'bootstrapping' 3 | date: '13 Dec 2023' 4 | description: 'bootstrapping bruno' 5 | --- 6 | Hey everyone, This is Anoop, creator and lead maintainer of Bruno. 7 | 8 | This is in some way a personal post and covers some of my worldviews and my thought process that went into deciding to bootstrap Bruno. 9 | 10 | ### Summary 11 | * I will be working full-time on Bruno from Jan 2024. 12 | * Despite VC interest (8 VCs reached out in last 2 months), I have chosen not to explore raising money for Bruno. Reasons being: 13 | - Would like to grow slowly, preserve full liberty and freedom over the product direction. 14 | - Have confidence in building a profitable enterprise through Golden Edition purchases as well as building ancillary products around Bruno. 15 | * Will be setting up a monthly community call to discuss the product, roadmap, anything and everything related to Bruno (first wed of every month at 5 PM GMT.) 16 | 17 | ### Business ? 18 | In the past, my vision for Bruno didn't involve establishing a company or hiring individuals. The plan was to earn income from the project by offering select features under the Golden Edition (closed source) while working on Bruno part-time. 19 | 20 | Bruno's exponential growth has surpassed those initial plans. Currently, there are over 400 pending issues and 80 pull requests awaiting review, despite merging 250 PRs in the last two months alone (averaging 4 merges per day). Balancing this part-time alongside my day job as a tech lead is no longer feasible. 21 | 22 | Here are some of the highlights that happened in the last 2 months compared to the previous two years: 23 | * Grew from 500 to ➡️ 25,000 monthly active users 24 | * Github stars skyrocketed from 500 ➡️ 9,000 25 | * Launched [version 1.0.0](https://www.usebruno.com/blog/announcing-version-1) 26 | * Presented Bruno at [India Foss 3.0](https://www.youtube.com/watch?v=7bSMFpbcPiY) 27 | * Opensource Contributors increased from 15 ➡️ 100 28 | * Number of PRs merged grew from 50 ➡️ 250 29 | * VC inbound interest to explore increased from 2 ➡️ 8 30 | * GitHub Sponsorships revenue grew from 0$ ➡️ 40$/month 31 | 32 | ### Thoughts on VC funding 33 | I would like to first clarify that I am not against VC funding. It's the reason why many of us in the industry have well paying jobs in swanky offices. They inject capital and help push the ecosystem forward. 34 | 35 | When it comes to Bruno, my stance on VC funding remains the same. An API client is not venture scale. 36 | 37 | Some friends and colleagues are baffled on why I would reject an opportunity to explore funding when there is inbound interest from VC's. The irony is that - before Sep 2023, I would have accepted funding in the blink of an eye; but now despite inbound interest, I am no longer interested. 38 | 39 | Looking back, I had nothing. Just an innovative api client with little to no visibility. That may be the reason that would have accept taken VC funding in the past. Just to "matter", to be "heard", to gain some visibility. 40 | 41 | Its not the case anymore today. We have a growing community and contributors who help make Bruno better. 42 | We have feedback where people literally say - "I love Bruno". What more do I need as a creator (as long as I figure out a way to make a living out of it)? 43 | 44 | ### Perils of VC funding 45 | Many opensource projects that raise funding may end up struggling to make enough revenue to justify the valuation. Then they start to paywall features which were previously free, and the users start looking for alternatives. That is what has happened in the API client ecosystem (many times over). 46 | 47 | Most founders eventually lose control over the product direction and may be forced to make decisions that are not in the best interest of the community. 48 | 49 | ### Money and Altruism 50 | Lets get into this uncomfortable topic. 51 | 52 | Just like 99.99% of you, I am motivated by money and would like to have nice things. And secure the financial freedom for my family. I just don't have outsized ambitions to raise money and build a unicorn. Would be happy with a small business that makes enough money to live a comfortable life. 53 | 54 | Most people who deny and say that they start a company to change the world are lying. There is always an element of self-interest. If they still say that they are not motivated by money, ask them to hand over half of their shares to a non-profit. They won't. Very few people get to a place where they are no longer motivated by money. 55 | 56 | The business model for Bruno is simple. Its just aligning the incentives. 57 | * Build and maintain most of the features as opensource (most things a developer needs) 58 | * Offer select features under the paid plans (features that a business needs) 59 | * Foster a thriving community of contributors and users 60 | * Be transparent and do right by the community always 61 | * Maintain full autonomy over the company and product direction 62 | * Continue to build and ship cool stuff, provide value and have fun along the way 63 | 64 | ### Rebellion 65 | Bruno, at its core is a [rebellion](/manifesto) against the status quo of the API client ecosystem. 66 | 67 | Its quite common these days to raise money and go big when your opensource project gains traction and a certain number of github stars. Many api clients have done that. 68 | 69 | The spirit of rebellion (challenging the status quo, rethinking from first principles) continues in the choice to bootstrap Bruno. Explicitly choosing to not raise money and grow slowly. 70 | 71 | ### What's on the Horizon? 72 | Starting January 2024, I'll be devoting my full attention to Bruno. Priorities include tackling our backlog of issues, PRs, and fulfilling feature requests. 73 | 74 | I am going to bootstrap a self-sustaining developer tools company crafting tools that delight developers. 75 | Starting alone, will expand the team as we grow. 76 | 77 | Moreover, as Bruno matures, we will build more products around the API development ecosystem. 78 | 79 | The path ahead is the one less travelled. I look forward to sharing lessons as I trek this journey and continue to make Bruno Awesome, an API client that developers "love". 80 | 81 | Thank you for all your support ❤️ 82 | 83 | Best,
84 | Anoop 85 | -------------------------------------------------------------------------------- /posts/launching-bruno-cli.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'launching bruno cli' 3 | date: '3 April 2023' 4 | description: 'launching bruno cli' 5 | --- 6 | Hello everyone! 7 | 8 | I am excited to announce the release of Bruno CLI, a new addition to Bruno. The CLI allows you to run API collections from the command line interface, making it easier to test and automate your APIs. 9 | 10 | ![bruno cli](/images/bruno-cli.png) 11 | 12 | 13 | ## Installation 14 | To install the Bruno CLI, use the node package manager of your choice, such as NPM: 15 | ```bash 16 | npm install -g @usebruno/cli 17 | ``` 18 | 19 | ## Getting started 20 | Navigate to the directory where your API collection resides, and then run: 21 | ```bash 22 | bru run 23 | ``` 24 | This command will run all the requests in your collection. You can also run a single request by specifying its filename: 25 | 26 | ```bash 27 | bru run request.bru 28 | ``` 29 | 30 | Or run all requests in a folder: 31 | ```bash 32 | bru run folder 33 | ``` 34 | 35 | If you need to use an environment, you can specify it with the --env option: 36 | ```bash 37 | bru run folder --env Local 38 | ``` 39 | 40 | ## Support 41 | If you encounter any issues or have any feedback or suggestions, please raise them on our [GitHub repository](https://github.com/usebruno/bruno) -------------------------------------------------------------------------------- /posts/the-saas-dilemma.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'the saas dilemma' 3 | date: '28 March 2023' 4 | description: 'the saas dilemma' 5 | --- 6 | When I first set out to build Bruno, my goal was to create a lightweight alternative to Postman that companies could self-host. Over time, Postman had become bloated and slow, and even the open-source alternatives (insomnia,hoppscotch etc) had closed server-side implementations. 7 | 8 | But as I continued building, I had an epiphany that changed the trajectory of the project forever. What if the folders and requests within the API collection could be mapped to folders and files on the filesystem? I spent months debating whether to create an offline client that works with plain text files or stick with the self-hosted model that involved saving API collections in a database. 9 | 10 | Moving away from a server hosted model also meant that any future upside of offering a hosted saas platform no longer exists. 11 | 12 | Ultimately, I realized that file-based API collections were the future. Unlike other tools, such as Postman or Insomnia, Bruno would allow users to maintain their collections in a source code repository using Git for collaboration. 13 | 14 | The 3 core benefits that I saw in the offline file based model were 15 | * **Colocation**: I believe that things that are cohesive (closely related to each other) should live together. Your API collections are nothing but living examples of how to use your api (a.k.a documentation). They should live in your source code repository. 16 | * **Git**: All the alternatives out there shoehorn users to use a custom centralized proprietary version control for collaboration. On the other hand, File based api collections allow you to chose git for collaboration and store api collections in the source code repo itself. 17 | * **Privacy**: The freedom of using git meant that you no longer needed to have your api collections stored on postman's (or any other saas provider) servers. File based api collections enables developers to move from centralised systems to decentralised systems. 18 | 19 | I was excited to challenge the status quo and revolutionize the decade long norm on how developers collaborated on API collections. I chose the offline, file-based model and [refactored](https://github.com/usebruno/bruno/commit/76b0729af317b5bda68aacd500b51519f19f8c22) our codebase to read and write directly to the filesystem. 20 | 21 | Since our launch six months ago, Bruno has attracted over 1000 users, and over 300 stars on our github repo. The feedback and support has been exhilarating. 22 | 23 | I am reminded of a quote from the movie The Big Short by Micheal Burry. The subtlety here is that he uses the word **when** and not **if** 24 | 25 | > "when" the bonds fail, I want to be certain of payment incase of insolvency issues with your bank. 26 | 27 | I'm convinced that it's not a matter of **if**, but **when**, developers will adopt file-based API collections as the standard.. 28 | 29 | The clock is ticking. -------------------------------------------------------------------------------- /posts/welcoming-samagata-as-our-founding-sponsor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'welcoming samagata as our founding sponsor' 3 | date: '12 Jan 2024' 4 | description: 'welcoming samagata as our founding sponsor' 5 | --- 6 | Hey everyone ! 7 | 8 | I am so happy to share that we have received a grant of Rs 5 lakhs (USD 6000) from Samagata Foundation 💛 9 | 10 | [Samagata Foundation](https://samagata.org/) is a non-profit organisation in India that supports projects and ideas—even the little ones—that bring value to society. They work across areas including science, culture, art, technology, and education with a specific focus on the creation of public commons, institutions, and community spaces. 11 | 12 | Bruno is an Opensource, Fast and Git-Friendly Opensource API client aimed at revolutionizing the status quo represented by Postman, Insomnia and similar tools out there. Bruno stores your collections directly in a folder on your filesystem using a plain text markup language, Bru. You can use git or any version control of your choice to collaborate over your API collections. 13 | 14 | As of today, Bruno has been downloaded over 100,000 times, has garnered over 10,000 stars on Github and is used by over 25,000 developers every month. 15 | 16 | Majority of the features in Bruno are free and open source. We strive to strike a harmonious balance between open-source principles and sustainability. 17 | The funding grant will help us continue to expand our open-source work. 18 | 19 | Onwards and upwards! 🚀 20 | 21 | Best, 22 | 23 | Anoop 24 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/favicon.ico -------------------------------------------------------------------------------- /public/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/bruno-cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/bruno-cli.png -------------------------------------------------------------------------------- /public/images/bruno-face-reveal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/bruno-face-reveal.png -------------------------------------------------------------------------------- /public/images/bruno-first-commit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/bruno-first-commit.png -------------------------------------------------------------------------------- /public/images/foss-3.0-booth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/foss-3.0-booth.png -------------------------------------------------------------------------------- /public/images/foss-3.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/foss-3.0.png -------------------------------------------------------------------------------- /public/images/github-collection-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/github-collection-2.png -------------------------------------------------------------------------------- /public/images/landing-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/landing-2.png -------------------------------------------------------------------------------- /public/images/local-collections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/local-collections.png -------------------------------------------------------------------------------- /public/images/monthly-users-oct-2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/monthly-users-oct-2023.png -------------------------------------------------------------------------------- /public/images/run-anywhere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/run-anywhere.png -------------------------------------------------------------------------------- /public/images/sponsors/commit-company.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/sponsors/commit-company.png -------------------------------------------------------------------------------- /public/images/sponsors/samagata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/sponsors/samagata.png -------------------------------------------------------------------------------- /public/images/sponsors/zuplo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/sponsors/zuplo.png -------------------------------------------------------------------------------- /public/images/star-counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/star-counter.png -------------------------------------------------------------------------------- /public/images/team/anoop-pic.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/anoop-pic.jpeg -------------------------------------------------------------------------------- /public/images/team/anoop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/anoop.png -------------------------------------------------------------------------------- /public/images/team/anusree-pic.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/anusree-pic.jpeg -------------------------------------------------------------------------------- /public/images/team/bruno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/bruno.png -------------------------------------------------------------------------------- /public/images/team/lohit-pic.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/lohit-pic.jpeg -------------------------------------------------------------------------------- /public/images/team/sanjai-pic.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/team/sanjai-pic.jpeg -------------------------------------------------------------------------------- /public/images/testimonials/DivyMohan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/DivyMohan.png -------------------------------------------------------------------------------- /public/images/testimonials/NooclearWessel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/NooclearWessel.png -------------------------------------------------------------------------------- /public/images/testimonials/arnaud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/arnaud.png -------------------------------------------------------------------------------- /public/images/testimonials/barath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/barath.png -------------------------------------------------------------------------------- /public/images/testimonials/bramhoven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/bramhoven.png -------------------------------------------------------------------------------- /public/images/testimonials/daputzy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/daputzy.png -------------------------------------------------------------------------------- /public/images/testimonials/david.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/david.png -------------------------------------------------------------------------------- /public/images/testimonials/lasko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/lasko.png -------------------------------------------------------------------------------- /public/images/testimonials/lonewalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/lonewalk.png -------------------------------------------------------------------------------- /public/images/testimonials/matthewtrow5698.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/matthewtrow5698.png -------------------------------------------------------------------------------- /public/images/testimonials/nesbert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/nesbert.png -------------------------------------------------------------------------------- /public/images/testimonials/power-tester.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/power-tester.png -------------------------------------------------------------------------------- /public/images/testimonials/ptrdlbrg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/ptrdlbrg.png -------------------------------------------------------------------------------- /public/images/testimonials/ramiawar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/ramiawar.png -------------------------------------------------------------------------------- /public/images/testimonials/ramiawar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/ramiawar2.png -------------------------------------------------------------------------------- /public/images/testimonials/retrocoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/retrocoder.png -------------------------------------------------------------------------------- /public/images/testimonials/rosh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/rosh.png -------------------------------------------------------------------------------- /public/images/testimonials/sudeep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/sudeep.png -------------------------------------------------------------------------------- /public/images/testimonials/sumit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/sumit.png -------------------------------------------------------------------------------- /public/images/testimonials/tobias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/tobias.png -------------------------------------------------------------------------------- /public/images/testimonials/vijay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/vijay.png -------------------------------------------------------------------------------- /public/images/testimonials/vysakh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/testimonials/vysakh.png -------------------------------------------------------------------------------- /public/images/version-control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usebruno/bruno-website/e950c32da45446d825fef6418f02448c78ddeccf/public/images/version-control.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # bruno-website 2 | Website for usebruno.com built using NextJS 3 | 4 | ### Requirements 5 | * Node v18 6 | * Npm v8 7 | 8 | ### Workflow 9 | ```bash 10 | # dev 11 | npm run dev 12 | 13 | # build 14 | npm run build 15 | ``` 16 | 17 | ### License 18 | [MIT](LICENSE) 19 | -------------------------------------------------------------------------------- /scripts/generate-rss.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const { Feed } = require("feed"); 4 | const matter = require("gray-matter"); 5 | const { loadEnvConfig } = require("@next/env"); 6 | 7 | loadEnvConfig(process.cwd()); 8 | 9 | const getPostsSortByDate = () => { 10 | const files = fs.readdirSync(path.join("posts")); 11 | let posts = files.map((filename) => { 12 | const markdownWithMeta = fs.readFileSync( 13 | path.join("posts", filename), 14 | "utf-8" 15 | ); 16 | 17 | const { data } = matter(markdownWithMeta); 18 | data.slug = filename.replace(".md", ""); 19 | return data; 20 | }); 21 | 22 | return sortPostsInDesc(posts); 23 | }; 24 | 25 | const sortPostsInDesc = (posts) => { 26 | return posts?.sort( 27 | (first, next) => new Date(next.date) - new Date(first.date) 28 | ); 29 | }; 30 | 31 | const generateRSSFeed = () => { 32 | const siteUrl = process.env.NEXT_PUBLIC_VERCEL_URL; 33 | const posts = getPostsSortByDate(); 34 | const feed = new Feed({ 35 | title: "Bruno Blog | RSS Feed", 36 | description: "RSS Feed for Bruno Blog", 37 | id: siteUrl, 38 | link: siteUrl, 39 | image: `${siteUrl}/favicon-32x32.png`, 40 | favicon: `${siteUrl}/favicon.ico`, 41 | copyright: "Anoop M D and Contributors", 42 | feedLinks: { 43 | rss2: `${siteUrl}/feed.xml`, 44 | }, 45 | }); 46 | 47 | posts.forEach((post) => { 48 | feed.addItem({ 49 | title: post.title, 50 | id: `${siteUrl}/blog/${post.slug}`, 51 | link: `${siteUrl}/blog/${post.slug}`, 52 | description: post.description, 53 | date: new Date(post.date), 54 | }); 55 | fs.writeFileSync("./public/rss.xml", feed.rss2()); 56 | }); 57 | console.log("RSS Feed generated!"); 58 | }; 59 | 60 | generateRSSFeed(); 61 | -------------------------------------------------------------------------------- /src/components/Blogpost/StyledWrapper.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Wrapper = styled.div` 4 | .blog-title { 5 | font-size: 2rem; 6 | font-weight: 600; 7 | font-family: Lora, serif; 8 | text-align: center; 9 | margin-top: 1.5rem; 10 | } 11 | 12 | .blog-date { 13 | margin-bottom: 2.5rem; 14 | font-size: 1rem; 15 | color: #5a5d60; 16 | font-family: Lora, serif; 17 | text-align: center; 18 | } 19 | `; 20 | 21 | export default Wrapper; 22 | -------------------------------------------------------------------------------- /src/components/Blogpost/index.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | import Navbar from 'components/Navbar'; 3 | import Footer from 'components/Footer'; 4 | import GlobalStyle from '../../globalStyles'; 5 | import StyledWrapper from './StyledWrapper'; 6 | 7 | export default function Layout({ title, keywords, description, children }) { 8 | return ( 9 | 10 | 11 | {title} 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 |
{children}
21 |
22 |