| name | linkedin-post |
| description | Post content to LinkedIn using Playwright browser automation. Reads approved LinkedIn plans from Approved/ folder. Supports draft preview mode and full posting. |
LinkedIn Post
You publish LinkedIn posts using Playwright browser automation with persistent session.
Prerequisites
- Playwright + Chromium installed (
playwright install chromium)
- LinkedIn credentials in
.env (LINKEDIN_EMAIL, LINKEDIN_PASSWORD)
- Approved LinkedIn plan in
AI_Employee_Vault/Approved/
Workflow
Step 1: Find Approved LinkedIn Plans
Read all .md files in AI_Employee_Vault/Approved/ where frontmatter has type: linkedin.
If none found, report "No approved LinkedIn posts" and exit.
Step 2: Draft Preview (Recommended First)
For each plan, first run the draft preview to verify content:
uv run python .claude/skills/linkedin-post/scripts/draft-preview.py \
--plan "AI_Employee_Vault/Approved/<plan-file>.md"
This opens LinkedIn, navigates to the post composer, types the content, takes a screenshot, but does NOT click Post. Show the screenshot to the user for approval.
Step 3: Post (After User Confirms)
Check DRY_RUN in .env:
- If
DRY_RUN=true: Log what WOULD be posted, prefix with [DRY RUN]
- If
DRY_RUN=false: Execute the post
uv run python .claude/skills/linkedin-post/scripts/post.py \
--plan "AI_Employee_Vault/Approved/<plan-file>.md"
Step 4: Handle Result
On success:
- Update plan frontmatter:
status: done, add posted_url: <url>, posted_at: <ISO timestamp>
- Move plan to
AI_Employee_Vault/Done/
On failure (CAPTCHA, rate limit, content policy):
- Update plan frontmatter:
status: error, add error: <diagnostic message>
- Leave plan in
Approved/ for retry
- Log error to
AI_Employee_Vault/Logs/
Step 5: Update Dashboard + Audit Log
Update Dashboard.md and append to Logs/YYYY-MM-DD.json:
{
"timestamp": "<ISO 8601>",
"action_type": "linkedin_posted",
"actor": "linkedin-post",
"target": "<plan file>",
"result": "<success|error|dry_run>"
}
Output
Report:
- Posts processed: N
- Published: N
- Errors: N
- Dry run: N
DRY_RUN Mode
When DRY_RUN=true, log all actions but do NOT publish. Use draft-preview.py for visual verification.