/decisions · 2026-09-04 · newsletter · linkedin-write-rail

LinkedIn write rail — register the app, one OAuth grant, rail is live

Notion task 3cbf7d49-36d1-8182-8cd2-dbf6525e268e · "Ray can post to LinkedIn after founder approval." Owner: Founder (one-time app registration + OAuth grant). Priority: Medium. Due 2026-09-11.

Same shape as the X write rail you already unblocked: nothing can ship until a LinkedIn app exists and you grant it one OAuth login. Unlike X, there's no existing app to flip a permission on — this one starts from zero, so the first step is registering it in the LinkedIn Developer portal.

Standing policy unchanged. Ray never posts autonomously. Every draft gets its own HQ approval page; your tap sends the canonical DECISION:<slug>:APPROVE line via iMessage; the post script requires that exact string and logs it.

Your unblock (in order)

  1. Sign in at developer.linkedin.com → Create app. Associate it with your personal LinkedIn profile or the Ray Data Co page (your call — either works for personal posting).
  2. Under Products, request Share on LinkedIn (grants the w_member_social scope). This is usually auto-approved for personal-use apps, no review wait.
  3. Under Auth, add a redirect URL: http://localhost:8721/callback (matches the same local OAuth helper pattern as the X rail).
  4. Grant Ray the one-time OAuth login (Ray runs the auth-code exchange against the app's client ID/secret, which you paste into the 1Password "Ray Agent" vault — no secrets on disk).
  5. Tap "Approve" below — Ray registers the token, builds the post script + per-draft approval page (same pattern as X), and confirms the rail is live before flipping this ticket to Done.

What this unblocks

Lock in

Approve

You've registered the app and are ready to do the OAuth grant when Ray sends the login link.

Approve + send
Archive

Drop the LinkedIn rail — X + SC newsletter stay the only Ray-posts-after-approval surfaces for now.

Archive + send
Split

Register the app now, but hold the OAuth grant until a specific launch trigger.

Split + send
Defer

Push this out to a specific date — Ray resurfaces then.

Defer + send