linkedin-automation
LinkedIn automation — post (with image upload), comment (with @mentions), edit/delete comments, repost, read feed, analytics, like monitoring, engagement tracking, and content calendar with approval workflow. Uses Playwright with persistent browser profile. Use for any LinkedIn task including content strategy, scheduled publishing, engagement analysis, and audience growth.
What this skill does
# LinkedIn Automation
> **Author:** Community Contributors
>
> ⚠️ **DISCLAIMER — PERSONAL USE ONLY**
> This skill is provided for **personal, non-commercial use only**. It automates your own LinkedIn account for personal productivity and engagement. Do NOT use this skill for spam, mass outreach, scraping other users' data, or any commercial automation service. Use responsibly and in accordance with [LinkedIn's User Agreement](https://www.linkedin.com/legal/user-agreement). The author assumes no liability for misuse or account restrictions.
Automate LinkedIn interactions via headless Playwright browser with a persistent session.
## Prerequisites
- Python 3.10+ with Playwright installed (`pip install playwright && playwright install chromium`)
- A logged-in LinkedIn browser session (persistent Chromium profile)
- Adjust paths in `scripts/lib/browser.py` to match your setup
## Commands
```bash
CLI={baseDir}/scripts/linkedin.py
# Check if session is valid
python3 $CLI check-session
# Read feed
python3 $CLI feed --count 5
# Create a post (text only)
python3 $CLI post --text "Hello world"
# Create a post with image (handles LinkedIn's image editor modal automatically)
python3 $CLI post --text "Hello world" --image /path/to/image.png
# Comment on a post (supports @Mentions — see below)
python3 $CLI comment --url "https://linkedin.com/feed/update/..." --text "Great insight @Betina Weiler!"
# Edit a comment (match by text fragment)
python3 $CLI edit-comment --url "https://..." --match "old text" --text "new text"
# Delete a comment
python3 $CLI delete-comment --url "https://..." --match "text to identify"
# Repost with thoughts
python3 $CLI repost --url "https://..." --thoughts "My take..."
# Engagement analytics for recent posts
python3 $CLI analytics --count 10
# Profile-level stats (followers, views)
python3 $CLI profile-stats
# Monitor your likes for new ones (for comment suggestions)
python3 $CLI scan-likes --count 15
# Scrape someone's activity
python3 $CLI activity --profile-url "https://linkedin.com/in/someone/" --count 5
```
All commands output JSON. Enable debug logging: `LINKEDIN_DEBUG=1`.
## @Mentions
Comments support `@FirstName LastName` syntax. The skill:
1. Types `@FirstName` → waits for typeahead dropdown
2. Progressively types last name letter by letter if needed
3. Clicks the match only if first+last name both match
4. Falls back to plain text if person not found (returns `mention_failed` warning)
Check `mentions` in the JSON result to see if mentions succeeded.
## Like Monitor
The `scan-likes` command checks your recent likes/reactions activity and returns any **new likes since the last check**. State is persisted to avoid duplicate alerts. Ideal for cron/heartbeat integration:
```
# In HEARTBEAT.md or cron job:
python3 $CLI scan-likes → if new likes found → suggest comment for each
```
## ⚠️ Golden Rule
**NEVER post, comment, repost, edit, or delete anything without EXPLICIT user approval.**
Always show the user exactly what will be posted and get a clear "yes" before executing. Read-only actions (feed, analytics, check-session, scan-likes) are safe to run freely.
## Content Calendar (Scheduled Publishing)
Full approval-based publishing workflow with auto-posting. See **[references/content-calendar.md](references/content-calendar.md)** for setup.
- **Webhook** (`scripts/cc-webhook.py`): Receives approve/edit/skip from a frontend UI
- **Auto-apply**: Simple edits (`"old text -> new text"`) applied instantly by webhook
- **Agent processing**: Complex edits flagged for AI-powered text rewriting
- **Auto-post**: Approved posts past their scheduled time are posted automatically via cron
- **Image strategy**: Real photos + AI-generated story overlays (not stock photos)
```bash
# Start the webhook (or install as systemd service)
python3 scripts/cc-webhook.py
# Env vars for config:
# CC_DATA_FILE=/path/to/cc-data.json
# CC_ACTIONS_FILE=/path/to/actions.json
# CC_WEBHOOK_PORT=8401
```
## Content Strategy & Engagement
- **[references/content-strategy.md](references/content-strategy.md)** — Hook formulas, post structure, posting times, hashtag strategy, 4-1-1 rule
- **[references/engagement.md](references/engagement.md)** — Algorithm signals, comment quality formula, rate limits, weekly routine
- **[references/dom-patterns.md](references/dom-patterns.md)** — Known LinkedIn DOM patterns for troubleshooting
- **[references/content-calendar.md](references/content-calendar.md)** — Content calendar setup, data format, webhook API
## Rate Limits
| Action | Daily Max | Weekly Max |
|--------|----------|-----------|
| Posts | 2–3 | 10–15 |
| Comments | 20–30 | — |
| Likes | 100 | — |
| Connection requests | 30 | 100 |
## Setup
1. Install dependencies: `pip install playwright && playwright install chromium`
2. Configure browser profile path in `scripts/lib/browser.py` (or set `LINKEDIN_BROWSER_PROFILE` env var)
3. Log in to LinkedIn manually once (the session persists)
4. Run `python3 scripts/linkedin.py check-session` to verify
5. **Learn your voice:** Run `python3 scripts/linkedin.py learn-profile` — this scans your recent posts and comments to learn your tone, topics, language, and style. The agent uses this profile when suggesting comments/posts so they sound like **you**, not like a generic bot.
## Voice & Style
On first setup, `learn-profile` analyzes your content and saves a style profile (`~/.linkedin-style.json`) containing:
- **Language** (de/en/mixed)
- **Tone** (casual / professional / professional-friendly)
- **Emoji usage** (heavy / moderate / minimal)
- **Top hashtags** you use
- **Sample posts and comments** for voice reference
The agent should ALWAYS read this profile (`get-style`) before drafting any comment or post suggestion. Never impose a foreign voice — match the user's natural style.
## Post Age Warning
**CRITICAL:** Before suggesting a comment on any post, check how old the post is:
- **< 2 weeks:** Safe to comment
- **> 2 weeks:** Warn the user explicitly ("⚠️ This post is X weeks old — commenting on old posts can look like bot behavior. Still want to?")
- **> 1 month:** Strongly discourage unless there's a specific reason
Commenting on old posts makes it look like you're mining someone's history with a bot. Always flag post age.
## Troubleshooting
- **Session expired**: Log in again via browser profile
- **Selectors broken**: LinkedIn updates UI frequently — check `references/dom-patterns.md` and update `scripts/lib/selectors.py`
- **Debug screenshots**: Saved to `/tmp/linkedin_debug_*.png` on failure
Related in Ads & Marketing
ads
IncludedMulti-platform paid advertising audit and optimization skill. Analyzes Google, Meta, YouTube, LinkedIn, TikTok, Microsoft, and Apple Ads. 250+ checks with scoring, parallel agents, industry templates, and AI creative generation.
banana
IncludedAI image generation Creative Director powered by Google Gemini Nano Banana models. Use this skill for ANY request involving image creation, editing, visual asset production, or creative direction. Triggers on: generate an image, create a photo, edit this picture, design a logo, make a banner, visual for my anything, and all /banana commands. Handles text-to-image, image editing, multi-turn creative sessions, batch workflows, and brand presets.
rpg-migration-analyzer
IncludedAnalyzes legacy RPG (Report Program Generator) programs from AS/400 and IBM i systems for migration to modern Java applications. Extracts business logic from RPG III/IV/ILE source code, identifies data structures (D-specs), file operations (F-specs), program dependencies (CALLB/CALLP), and converts RPG constructs to Java equivalents. Generates migration reports, complexity estimates, and Java implementation strategies with POJO classes, JPA entities, and service methods. Use when modernizing AS/400 or IBM i legacy systems, analyzing RPG source files (.rpg, .rpgle, .RPGLE), converting RPG to Java, mapping data specifications to Java classes, planning legacy system migration, or when user mentions RPG analysis, Report Program Generator, RPG III/IV/ILE, AS/400 modernization, IBM i migration, packed decimal conversion, or mainframe application rewrite.
brand-library-architect
IncludedBuild a complete brand library for a product — visual asset render pipeline, brand documentation set (BRAND, COPY, MANIFESTO, BIOS, FAQ, GLOSSARY, TONE, PRICING), open-source convention files (README, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT), and a self-contained press kit. This skill should be used when the user asks to "build a brand library / brand kit / press kit / brand assets" for a product, "set up a brand library workflow," "create a positioning manifesto plus visual identity," or any combination of brand documentation + visual asset pipeline. Apply phase-by-phase or run end-to-end. Templates are product-agnostic and use {{TOKEN}} placeholders the skill prompts the user to fill.
writing-tech-post
IncludedAuthors engineering blog posts end-to-end: launch deep-dives, incident postmortems, architecture migrations, performance case studies, tutorials, AI/agent system writeups, security disclosures, and research-to-product translations. Picks the correct archetype, plans the abstraction ladder, enforces an evidence cadence (diagrams, benchmarks, profiles, traces, code, ablations), tunes voice against publisher house styles (Datadog, Vercel, GitHub, AWS, Meta, Cloudflare, Jane Street), and runs a pre-publish gate for narrative momentum and disclosure ethics. Use when drafting a new engineering post, restructuring a draft that feels flat, deciding which evidence form belongs where, validating that depth and product context are balanced, or preparing a postmortem, migration, or performance narrative for external publication. Do not use for API reference documentation, README authoring, marketing copy, release notes, generic SEO content, ghost-written executive thought leadership, or non-engineering long-form essays.
blog-google
IncludedGoogle API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity analysis for E-E-A-T, YouTube video search for embedding, and Google Ads Keyword Planner. Progressive feature availability based on credential tier (API key, OAuth/service account, GA4, Ads). Shares config with claude-seo at ~/.config/claude-seo/google-api.json. Use when user says "google data", "page speed", "core web vitals", "search console", "indexation", "GA4", "keyword research", "nlp entities", "blog performance", "youtube search", "google api setup".