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.
curl -fsSL https://raw.githubusercontent.com/aswathas/postiee/main/install.sh | sh 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.
- Go to linkedin.com/developers/apps and click Create app.
- Products tab → add Share on LinkedIn.
This grants
w_member_social, which is what writes the post. Self-serve, no review. - Products tab → add Sign In with LinkedIn.
This grants
openidandprofile. Without it postiee cannot resolve your own member ID, and every post fails. - 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.