Getting Started
Posting is an HTTP client that lives in your terminal.
Posting 3 is a single, self-contained binary: there's no Python or other runtime to install.
Installation
Posting 3 is in beta. Install it with Homebrew, download a release, or build it with Go.
Homebrew
On macOS and Linux, install the beta from Posting's Homebrew tap:
brew install darrenburns/homebrew/posting@beta
Posting 2's Homebrew formula also installs a command called posting, so run
brew uninstall posting first if you have it.
Downloading a release
Each GitHub release has archives for macOS,
Linux and Windows. Extract the posting binary and put it in a directory on your PATH.
Go
If you have Go 1.25.5 or newer installed, run:
go install github.com/darrenburns/posting/v3/cmd/posting@latest
This builds Posting and puts the posting binary in $(go env GOPATH)/bin (usually ~/go/bin).
Make sure that directory is on your PATH, then run:
Building from source
To build from a clone of the repository instead:
git clone https://github.com/darrenburns/posting.git
cd posting
go build -o posting ./cmd/posting
./posting
Checking your installation
$ posting version
Posting 3 .0.0-beta.1
posting --help lists the options you can start Posting with.
Coming from Posting 2?
Posting 3 reads the same configuration file, collections and .env files as Posting 2,
so you can point it at your existing work straight away.
See Coming from Posting 2 for what's new and what's changed.
A quick introduction
This introduction walks through creating a POST request to the
JSONPlaceholder mock API, sending it, and saving it.
It focuses on the keyboard, but you can click on anything in Posting too.
atlas-api ◆ local you@devbox R e q u e s t s H is t o r y GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ Se arc h re q u e s ts … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h / Headers 8 Body Path Query 2 Auth Info Options Request G ET C u rr en t u s e r P OS L ogi n ☑ Accept application/json ✕ P OS R e f r es h s e ss io n ☑ Authorization Bearer ${API_TOKEN} ✕ D EL R e v ok e s es si on ☑ User-Agent Posting/3.0 ✕ ▼ p ro j e c t s / ☑ Cache-Control no-cache ✕ G E T G et p ro j ec t ☑ X-Request-ID ${$uuid} ✕ G E T L is t p r o j ec t s ☑ X-Client-Version 2026.10 ✕ P O S C re at e p r oj ec t ☑ Origin https://app.example.com ✕ P AT U pd a t e pr oj ect ☑ Accept- ✕ D EL A r c h i ve p roj ec t + Add a h Accept- Charset Character sets the client can handle ▼ t ea ms / Accept- Encoding Content encodings the client can handle G ET L i s t tea m s Accept- Language Preferred natural languages G E T T ea m m e mb ers P O S I nvi t e memb er DE L R em ov e me mber Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ us ers / G ET G et u ser { GE T Li s t u ser s "users" : [ P OS C rea te u ser • { PA T Up da t e us er "id" : 42 , DEL De l ete us er • "name" : "Ada Lovelace" , ▼ webh oo k s/ "email" : "ada@example.com" , GE T Lis t we b ho ok s "role" : "admin" , P OS C re a te w e bho ok "active" : true POS T e st d e liv ery }, DEL De le t e w ebh o ok { GET He al t h chec k "id" : 43 , OP T CO R S pref l igh t "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R eq u e s ts Hi sto ry GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S ea rch r eq ues t s … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ au t h/ Headers 8 Body Path Query 2 Auth Info Options Request G ET C urr en t us er P O S L ogi n ☑ Accept application/json ✕ P OS Re f r es h s es si on ☑ Authorization Bearer ${API_TOKEN} ✕ D EL Re vo ke s ess io n ☑ User-Agent Posting/3.0 ✕ ▼ p ro j ec ts / ☑ Cache-Control no-cache ✕ G ET Ge t pr oje c t ☑ X-Request-ID ${$uuid} ✕ GE T Li st pr o j ec ts ☑ X-Client-Version 2026.10 ✕ PO S Cr ea t e pr oj ec t ☑ Origin https://app.example.com ✕ PA T Up d a t e pr oj ect ☑ Accept- ✕ DE L A r chi ve p roj e c t + Add a h Accept- Charset Character sets the client can handle ▼ te am s / Accept- Encoding Content encodings the client can handle G E T Lis t te am s Accept- Language Preferred natural languages GE T T ea m m em ber s PO S I nv i te me m b er DE L R e mo ve me mbe r Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ us ers / G E T Ge t u ser { G ET L is t u se rs "users" : [ PO S C re a te us er • { P A T U p da te us e r "id" : 42 , DEL De le t e u se r • "name" : "Ada Lovelace" , ▼ web h oo ks / "email" : "ada@example.com" , G ET L is t w eb hoo ks "role" : "admin" , PO S C r ea te we bh o ok "active" : true POS T e st de l iv er y }, DE L De let e web hoo k { G ET He al t h che ck "id" : 43 , O PT CO RS pr e fli gh t "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e qu e st s H i s t or y GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S ea r ch r e q ue s ts … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h/ Headers 8 Body Path Query 2 Auth Info Options Request G E T C ur r en t u s er P O S L o gi n ☑ Accept application/json ✕ P OS Re f r e s h s e s s i o n ☑ Authorization Bearer ${API_TOKEN} ✕ D E L R e v o ke s e s s i o n ☑ User-Agent Posting/3.0 ✕ ▼ p r o je c ts / ☑ Cache-Control no-cache ✕ G E T G e t pr o je c t ☑ X-Request-ID ${$uuid} ✕ GE T L i st pr o je c t s ☑ X-Client-Version 2026.10 ✕ P O S Cr e at e p r oj e ct ☑ Origin https://app.example.com ✕ P A T U pd a t e pr o je ct ☑ Accept- ✕ D E L Ar c hi v e pr oj ect + Add a h Accept- Charset Character sets the client can handle ▼ t e a m s/ Accept- Encoding Content encodings the client can handle GE T L i st tea ms Accept- Language Preferred natural languages G ET T e a m m emb e rs P O S I nvi te m emb er D EL R e mov e me m ber Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ u se rs / G ET G e t u s er { GET Li st u se rs "users" : [ P OS Cr ea te u se r • { PA T Up da te u s er "id" : 42 , DE L De l ete user • "name" : "Ada Lovelace" , ▼ w ebh oo k s/ "email" : "ada@example.com" , GE T Li s t w e bho o ks "role" : "admin" , P OS C rea te w ebho o k "active" : true PO S Te st d eliv e ry }, DEL Dele te w ebh oo k { GET Heal th c hec k "id" : 43 , OP T CO RS p ref l igh t "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e q ues t s H i sto ry GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S ea rch r eq ue s ts … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h/ Headers 8 Body Path Query 2 Auth Info Options Request G ET C urr en t us er P OS L ogi n ☑ Accept application/json ✕ P OS Re fr es h s e s si on ☑ Authorization Bearer ${API_TOKEN} ✕ D EL Re vo ke s ess io n ☑ User-Agent Posting/3.0 ✕ ▼ p ro jec ts / ☑ Cache-Control no-cache ✕ G E T Ge t pr o je ct ☑ X-Request-ID ${$uuid} ✕ GE T L i st pr oj e c t s ☑ X-Client-Version 2026.10 ✕ PO S Cr e a te pr oj e c t ☑ Origin https://app.example.com ✕ P A T U p dat e pr o j ect ☑ Accept- ✕ DE L Ar c hi ve p roj ect + Add a h Accept- Charset Character sets the client can handle ▼ te am s/ Accept- Encoding Content encodings the client can handle GE T L is t tea ms Accept- Language Preferred natural languages G E T T ea m m emb e rs P O S I nv i te m em be r D E L R e mov e m em be r Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ u s ers / G ET G et u se r { GE T Li s t us er s "users" : [ P OS C re at e us e r • { PA T U pd a te u ser "id" : 42 , D EL D e let e us er • "name" : "Ada Lovelace" , ▼ w eb ho o ks/ "email" : "ada@example.com" , GE T L ist web hook s "role" : "admin" , PO S Cr e ate web hoo k "active" : true P OS T est del ive r y }, DE L De let e we b ho ok { GE T He alt h ch e ck "id" : 43 , OPT COR S pr e fl ig ht "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e q u es t s H i s to ry GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S e a rc h r e qu e st s… GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h/ Headers 8 Body Path Query 2 Auth Info Options Request G ET C ur r e n t us er P O S L o gi n ☑ Accept application/json ✕ P O S Re fr e s h se s s i on ☑ Authorization Bearer ${API_TOKEN} ✕ D E L Re v o ke s e ss i o n ☑ User-Agent Posting/3.0 ✕ ▼ p r oj ec t s / ☑ Cache-Control no-cache ✕ GE T G e t p ro j e ct ☑ X-Request-ID ${$uuid} ✕ G ET L is t p r o j e ct s ☑ X-Client-Version 2026.10 ✕ P O S C re a te p r o je c t ☑ Origin https://app.example.com ✕ P AT Up da t e p ro j e ct ☑ Accept- ✕ D E L Ar c h i v e p roj e ct + Add a h Accept- Charset Character sets the client can handle ▼ te a m s/ Accept- Encoding Content encodings the client can handle GE T L is t tea m s Accept- Language Preferred natural languages G ET T e a m m emb e rs P OS I nv i te m em ber D E L R e mo ve m emb er Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ u s ers / G E T Ge t use r { GE T L ist u se rs "users" : [ P OS Cr ea te us e r • { P AT Up d ate u se r "id" : 42 , DE L D elet e u se r • "name" : "Ada Lovelace" , ▼ we bh o oks / "email" : "ada@example.com" , G ET L i st w e bho o ks "role" : "admin" , PO S C rea t e w e bh oo k "active" : true PO S Te st d e li ve r y }, D EL Dele t e w eb hoo k { G ET Hea l th c he ck "id" : 43 , O P T C O RS p r e fli gh t "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e q u e s t s H i st o r y GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S e a r c h r e q u e s t s … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ au t h / Headers 8 Body Path Query 2 Auth Info Options Request G E T C ur r en t u s e r P OS L o gi n ☑ Accept application/json ✕ P O S Re fr e s h s es s i o n ☑ Authorization Bearer ${API_TOKEN} ✕ D E L Re v o k e s es s i o n ☑ User-Agent Posting/3.0 ✕ ▼ p r o j e c t s / ☑ Cache-Control no-cache ✕ G E T G e t p r oj e c t ☑ X-Request-ID ${$uuid} ✕ G E T L i s t p r o j ec t s ☑ X-Client-Version 2026.10 ✕ PO S C r e a t e p r o j e c t ☑ Origin https://app.example.com ✕ PA T U p d a t e p r o j e ct ☑ Accept- ✕ D E L A r ch i v e p roj ec t + Add a h Accept- Charset Character sets the client can handle ▼ t e a m s / Accept- Encoding Content encodings the client can handle G E T Li s t te ams Accept- Language Preferred natural languages GE T T ea m mem b e rs P O S I nv ite m em b er D E L R em ov e m e mb er Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ u s e rs / G ET Ge t use r { G E T Li st us er s "users" : [ P OS Cre at e u se r • { PA T U pd a te u ser "id" : 42 , DE L D e le te us er • "name" : "Ada Lovelace" , ▼ we bho o k s/ "email" : "ada@example.com" , G E T Li st we b ho ok s "role" : "admin" , P OS Cr eat e w eb hoo k "active" : true PO S Tes t del ive ry }, DE L D e l ete w ebh o ok { GE T H e a lth c hec k "id" : 43 , OP T C ORS p ref l i ght "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e q u e s t s H i s t o ry GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ S e a r c h r e q u e s t s … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h / Headers 8 Body Path Query 2 Auth Info Options Request G ET Cu r r en t us e r P O S L o gi n ☑ Accept application/json ✕ P OS R ef r e s h s e s s io n ☑ Authorization Bearer ${API_TOKEN} ✕ D E L R e v ok e s e s si o n ☑ User-Agent Posting/3.0 ✕ ▼ p r o j e c t s/ ☑ Cache-Control no-cache ✕ G E T G e t p r o je c t ☑ X-Request-ID ${$uuid} ✕ G E T L i s t p r o j ec t s ☑ X-Client-Version 2026.10 ✕ P O S C r e a t e p r o j ec t ☑ Origin https://app.example.com ✕ P A T U p d a t e p r o j e ct ☑ Accept- ✕ D EL A rc h i v e p r oj ec t + Add a h Accept- Charset Character sets the client can handle ▼ t ea m s / Accept- Encoding Content encodings the client can handle G E T L is t te ams Accept- Language Preferred natural languages G E T T e a m mem b e r s P O S I nv ite m e mb er DE L R emo v e me mbe r Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ u s e rs / G ET Ge t u ser { G E T Lis t use r s "users" : [ P O S C re ate us e r • { PA T U pda te u s er "id" : 42 , DEL De le te use r • "name" : "Ada Lovelace" , ▼ web hoo ks / "email" : "ada@example.com" , G E T Li s t w eb hoo ks "role" : "admin" , PO S C rea te we bho o k "active" : true PO S T est de liv e r y }, DEL De let e w eb ho o k { GET He alt h c he ck "id" : 43 , O PT CO RS p re fl i gh t "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help atlas-api ◆ local you@devbox R e q u e s t s H is t o r y GET List users ● ✕ POS Create user ✕ DEL Delete user ✕ + ▾ Se arc h re q u e s ts … GET ▾ ${BASE_URL} / users ? page = 1 & per_page = 20 200 ■ ■ ■■■■■ [ Send ] → http://localhost:8000/users?page=1&per_page=20 ▼ a u t h / Headers 8 Body Path Query 2 Auth Info Options Request G ET C u rr en t u s e r P OS L ogi n ☑ Accept application/json ✕ P OS R e f r es h s e ss io n ☑ Authorization Bearer ${API_TOKEN} ✕ D EL R e v ok e s es si on ☑ User-Agent Posting/3.0 ✕ ▼ p ro j e c t s / ☑ Cache-Control no-cache ✕ G E T G et p ro j ec t ☑ X-Request-ID ${$uuid} ✕ G E T L is t p r o j ec t s ☑ X-Client-Version 2026.10 ✕ P O S C re at e p r oj ec t ☑ Origin https://app.example.com ✕ P AT U pd a t e pr oj ect ☑ Accept- ✕ D EL A r c h i ve p roje c t + Add a h Accept- Charset Character sets the client can handle ▼ t ea ms / Accept- Encoding Content encodings the client can handle G ET L i s t team s Accept- Language Preferred natural languages G E T T ea m me mbers P O S I nvit e mem b er DE L Re m ove m e mber Body Headers 2 Cookies 1 Trace 335 B in 42.00 ms 200 OK Response ▼ us ers/ GE T Get u ser { GET Li s t use r s "users" : [ POS C reat e user • { PA T Upd at e us er "id" : 42 , DEL D el ete us er • "name" : "Ada Lovelace" , ▼ webho ok s/ "email" : "ada@example.com" , G ET Lis t web hook s "role" : "admin" , P OS Cre ate we bho ok "active" : true PO S T est de liv ery }, DEL De let e w ebho ok { GET He alt h c heck "id" : 43 , OPT COR S pref li ght "name" : "Grace Hopper" , application/json 29 lines JSON tree wrap on copy P o s t i n g 3 . 0 . 0 ^x Delete row ^r Toggle row ^o Jump ^j Send ^s Save ^n New tab ^p Commands F1 Help
Posting 3 with a collection in the sidebar and a JSON response on screen.
Collections
A collection is a directory of requests. Each request is stored in its own YAML file, so a
collection is easy to read, share and keep in version control.
If you start Posting without choosing a collection, your requests are saved to the default
collection , a directory Posting keeps for you. That's handy for quick, throwaway requests, but
for a project you'll probably want a collection of its own:
mkdir my-collection
posting --collection my-collection
The name of the collection is shown at the top of the sidebar on the left.
Learn more in Collections .
Choosing the method
When Posting opens, the cursor is in the URL bar of a new, empty request.
Press Ctrl + T to open the method menu. Each method has a letter you can press to choose it:
press P for POST.
Entering the URL
Posting moves you back to the method selector. Press Tab to move to the URL bar (or press
Ctrl + L from anywhere) and type:
https://jsonplaceholder.typicode.com/users
The URL is highlighted as you type, so typos are easy to spot.
Paste a curl command
You can also paste a whole curl command into the URL bar. Posting turns it into a request,
filling in the method, headers and body for you. See Importing curl commands .
Adding a JSON body
Press Ctrl + O to enter jump mode . Labels appear over every part of the screen: type the
label of the place you want to go. Press W to jump to the request's Body tab.
Press Down to move into the tab, which puts you on the body type selector, then press Right
to change the body type from None to Raw . JSON is already selected as the content type,
which is what we want, so press Tab twice to move past it and into the text area. Type or paste:
{
"name" : "John Doe" ,
"username" : "johndoe" ,
"email" : "john.doe@example.com"
}
The body is syntax highlighted, and Posting sends Content-Type: application/json for you
when the request goes out.
Sending the request
Press Ctrl + J to send the request. This works wherever you are in Posting.
You can also press Alt + Enter , or press Enter while the URL bar is focused.
The response appears in the Response panel, with its status, size and how long it took.
The JSON is formatted and highlighted for you.
Working with the response
Press Ctrl + O then A to jump to the response Body tab, and Down to move into the
body. From here you can:
scroll with the arrow keys, Page Up and Page Down
press Y to copy the whole body to your clipboard
press W to turn line wrapping on or off
press F3 to open the body in your pager, or F4 to open it in your editor
The Headers , Cookies and Trace tabs show the rest of the response. In the headers or
cookies, press Y to copy the value of the row under the cursor, N to copy its name, or B
to copy both. See Responses for more.
Saving the request
Press Ctrl + S to save the request. The first time you save, Posting asks for a name, and
where in the collection to put it:
Name : Create user
File name : leave it empty to use one made from the name (create-user)
Folder : leave empty to save at the top of the collection, or type a path such as users
to save into a folder, which is created if it doesn't exist
Press Enter to save. The request now appears in the sidebar, and it's written to
my-collection/users/create-user.posting.yaml. From now on, Ctrl + S saves your changes in place.
Finding your way around
A few keys will get you a long way:
Key
What it does
Ctrl + P
Open the command palette , which lists everything Posting can do
Ctrl + O
Enter jump mode
F1
Show the keyboard shortcuts
Ctrl + N
Open a new request tab
Ctrl + G
Search the requests in the collection
Ctrl + C
Quit
The footer at the bottom of the screen always shows the most useful keys for whatever is focused.
Making it yours
Try a different look: press Ctrl + P , choose Theme… , and move through the list to preview
each theme. See Themes .
Put the request and response side by side with Layout: side by side in the command palette.
Make these choices permanent in your configuration file :
theme : aurora
layout : horizontal