Getting started

Install and set up

Ten minutes the first time, because you have to create your own LinkedIn app. Every step after that is one command.

1. Install

The installers detect your OS and CPU, prefer a per-user location so you don't need admin rights, and warn you if the install directory isn't on your PATH.

macOS · Linux
curl -fsSL https://raw.githubusercontent.com/aswathas/postiee/main/install.sh | sh
Windows · PowerShell
irm https://raw.githubusercontent.com/aswathas/postiee/main/install.ps1 | iex

From source

Needs Go 1.26.9 or newer. The sudo mv is the only step that needs admin rights; build it anywhere you like.

git clone https://github.com/aswathas/postiee.git
cd postiee
go build -o postiee ./cmd/postiee
sudo mv postiee /usr/local/bin/

No Go toolchain needed for the one-liners — those download a prebuilt binary for your platform.

2. Create your LinkedIn app

There is no shared client ID. Every person needs their own app, because LinkedIn grants scopes per application. Both products below are required: one lets you post, the other lets postiee work out who you are.

  1. Go to linkedin.com/developers/apps and click Create app.
  2. Products tab → add Share on LinkedIn. This grants w_member_social, which is what writes the post. Self-serve, no review.
  3. Products tab → add Sign In with LinkedIn. This grants openid and profile. Without it postiee cannot resolve your own member ID, and every post fails.
  4. Auth tab → add this exact redirect URL:
http://127.0.0.1:8085/callback

Copy that exactly, including 127.0.0.1. LinkedIn compares redirect URLs as exact strings, and localhost is not the same value to it as 127.0.0.1. Registering localhost is the single most common reason login fails with "redirect_uri does not match the registered value".

If you already registered a different value, set POSTIEE_REDIRECT_URI to match it instead. auth login prints the exact URI it is sending before it opens your browser, so you can compare the two directly.

Back on the Settings tab you'll see a Client ID and Client secret. You need both.

Never paste either value into a chat, an issue, or a commit. The secret is a password for your app. The next step puts them in a local file that nothing else can read.

3. Store your credentials

Write them to a file rather than passing them as flags — a flag value lands in your shell history and in process listings.

mkdir -p ~/.config/postiee
chmod 700 ~/.config/postiee

cat > ~/.config/postiee/credentials.toml <<'EOF'
client_id = "your_client_id"
client_secret = "your_client_secret"
EOF

chmod 600 ~/.config/postiee/credentials.toml

On Windows the same file lives at %USERPROFILE%\.config\postiee\credentials.toml.

4. Log in

postiee auth login --port 8085

Your browser opens, you approve, and the token is stored. postiee prints the exact redirect URI it is sending before it opens the browser — compare it against your Auth tab if login fails. The window stays open 15 minutes, which is enough for a password, a 2FA prompt, and an email code.

Token life is 60 days. Programmatic refresh is reserved for LinkedIn partners, so after expiry you re-run auth login. If you're still signed in to LinkedIn, the consent screen is skipped.

5. Check it works

postiee doctor
postiee auth status

doctor reports where it found your config and credentials, whether a token is loaded, and whether api.linkedin.com is reachable. auth status confirms the token in one line.

Then make the post that proves it:

postiee post "first post via postiee" -v CONNECTIONS

It prints a permalink and the post is on your feed. Nothing on LinkedIn can show you that record later — from here on, postiee history is how you find it. That is the whole reason this tool exists.

6. Take it back down

If you want the test post gone, unpublish deletes it on LinkedIn and then removes it from your local history. The URN is in the output of the post you just made.

postiee unpublish urn:li:share:12345 --dry-run   # see what it would do
postiee unpublish urn:li:share:12345

This one is permanent. There is no undo, and no API can read a deleted post back to rebuild it. --dry-run prints the plan without touching anything.

If you only want it out of your local search results and not off LinkedIn, use forget instead. See Commands.

Where your files live

What macOS / Linux Windows
App credentials — you write these ~/.config/postiee/credentials.toml %USERPROFILE%\.config\postiee\credentials.toml
Access token — postiee writes this after login ~/.local/share/postiee/ %USERPROFILE%\.local\share\postiee\
History database ~/.config/postiee/history.db %USERPROFILE%\.config\postiee\history.db

postiee doctor prints the resolved path of each one, so you never have to guess.

Back up history.db. It is the only surviving record of your posts — see why. Copying one file is the whole backup.

If something goes wrong

Run postiee doctor first; it names what it found and what it couldn't. Then the troubleshooting table maps LinkedIn's error text to a fix.

Next

Commands — every command and flag, or the limits page to find out what this can't do before you rely on it.