MAC HOW-TO

How to keep your API requests in Git as plain files on a Mac

Updated

Short answer

Keep each request as a text file in the repository, so it's reviewed and versioned with the code: curl commands in a script, .http files that your editor runs, or a collection folder from a file-based API client. Keep passwords and tokens out of those files: use variables, and keep the values somewhere private, like your Mac's Keychain.

The free ways

Free: curl commands in a script

  1. Write each request as a curl command in a shell script in the repository (an example is below).
  2. Read tokens from environment variables; never type them into the file.
  3. Run the script in Terminal. curl comes with macOS.
#!/bin/sh
# requests/get-user.sh
curl -s https://api.example.com/users/42 \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Accept: application/json"

Free: .http files in your editor

  1. Save requests in a .http file: the method and address on one line, headers on the lines below, a blank line, then the body.
  2. Run them with the REST Client extension in Visual Studio Code, or with the HTTP Client in JetBrains IDEs; both read .http files.
  3. Use the editor's variables for the host and tokens, and keep their values out of Git.

Free: Bruno, an open-source file-based client

  1. Bruno (usebruno.com) is an open-source API client. Its site says collections are plain-text files in your repository, with no cloud sync, no account and no login (checked Oct 18, 2026).
  2. Make a collection in a folder inside your repository and commit its files like code.

Where the free ways stop

  • curl scripts and .http files have no history, environments or tests beyond what you build yourself.
  • When tokens sit in files or shell history, it's easy to commit one by accident.
  • Editor extensions live inside the editor, not as a Mac app of their own.

How Plainwire does it

Plainwire is a Mac app we make: a native API client for your Mac that keeps requests in plain files.

  1. Choose File › New Collection… and pick a folder in your repository: each request is one .yml file, in the OpenCollection format Bruno 3 uses.
  2. Send REST, GraphQL and WebSocket requests. Files you didn't change are written back byte for byte, so Git diffs show only your edits.
  3. Passwords, tokens and API keys go to your Mac's Keychain; the file gets a {{variable}} in their place.
  4. Import Postman collections and environments, OpenAPI and cURL; Request › Paste cURL as New Request (⇧⌘V) turns a copied command into a request.
A request and its JSON response, with the collection's plain files in the sidebar
Environments for each server, with secret values kept in the Keychain

Free to use without a key: unlimited requests, history, one collection folder, every import and cURL export.

$15.99 one-time for Pro, no subscription. Buy a license key to unlock Pro: environments with secret values in your Keychain, scripts and tests in JavaScript, and more than one collection folder open at a time.

macOS 14 Sonoma or later. Apple silicon and Intel.

Questions

Does Plainwire work with Bruno?

Yes. Plainwire reads and writes OpenCollection YAML in the layout Bruno 3 uses, so Bruno and its command-line runner open the same folder. It also opens .bru collections, read only.

Where do my passwords and tokens go?

To the Keychain on your Mac. The file gets a {{variable}} in their place, so each person who uses the collection adds their own values.

Can I bring my Postman collections?

Yes. Export the collection as Collection v2.1 and each environment as a file in Postman, then choose File › Import › Postman Collection… and Postman Environment… in Plainwire. Tokens and passwords go to your Keychain, not the files.

What can I do without buying it?

Unlimited requests, history, one collection folder, every import and cURL export. Pro adds environments, scripts and tests, and more than one collection folder open at a time.