hive.linkedin-automation
Read before automating LinkedIn with browser_* tools. LinkedIn combines shadow DOM (#interop-outlet), strict Trusted Types CSP that silently drops innerHTML, Lexical composer, native beforeunload dialogs that hang the bridge, and aggressive spam filters — each has bitten us at least once. Verified flows for profile messaging, connection-request acceptance, feed composition, and search. Requires hive.browser-automation. Verified against logged-in production 2026-04-11.
npx skills add aden-hive/hive --skill linkedin-automation --agent claude-code
Same command for any agent — swap --agent for codex, cursor, copilot.
Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.
What it does
Automates LinkedIn actions using browser-automation tooling. It covers profile messaging, connection-request acceptance, feed posting, and search-related flows. It requires hive.browser-automation and is verified against logged-in production as of 2026-04-11. The skill documents how to work around LinkedIn's shadow DOM, CSP, and dynamic elements, including explicit guidance on taking screenshots and using coordinates over selectors.
How it works
- Activates browser-automation first and relies on visual identification (screenshots) to locate targets, then converts coordinates for clicks to reach shadow DOM, iframes, and React elements.
- Uses direct evaluation to find, filter, and interact with profile messaging links, then focuses the modal composer via coordinate clicks and inserts text through a focused typing mechanism, followed by sending via a shadow-rooted Send button, with checks to ensure the input reached the editor before sending.
- For connection acceptance, navigates to the invitation manager, scans cards, filters out non-targets (e.g., follow/subscribe invitations), and collects first_name and button coordinates to accept; processes up to 25 per 24-hour window with randomized delays between actions.
- For feed posting, navigates to the feed, triggers the post composer, selects the editor, types the content, verifies the Send button is enabled, and posts when ready. When attaching an image, uses a direct browser_upload to a hidden file input rather than attempting to use the OS file picker, and validates the image preview before posting.
When to use it
Use whenever automating LinkedIn actions as described: profile messaging, invitation acceptance, feed posting, and image-enabled posts. The skill emphasizes a coordinate-based approach over selectors due to frequent class-name churn and shadow DOM boundaries, and warns about unreliable inline iframe paths.
What it can touch
- browser_screenshot
- browser_coords
- browser_click_coordinate
- browser_type_focused
- browser_type
- browser_navigate
- browser_evaluate
- browser_click
- browser_upload
- browser_get_rect
- sleep
- random
Caveats
- Requires hive.browser-automation.
- LinkedIn imposes strict constraints: shadow DOM, CSP, and native beforeunload dialogs that can hang integrations; all guidance assumes those constraints are encountered and mitigated via the described workflow.
- Verification notes include post-send checks and a hard cap of 25 operations per 24-hour window for connection acceptance to respect rate limits.
# LinkedIn Automation LinkedIn is the hardest mainstream site to automate because it combines **shadow DOM** (`#interop-outlet` for messaging), **strict Trusted Types CSP** (silently drops `innerHTML`), **heavy React reconciliation** (injected nodes get stripped on re-render), **native `beforeunload` draft dialogs** (hang the bridge), and **aggressive spam filters**. Every one of those has bit us at least once. This skill documents what actually works. **Always activate `browser-automation` first.** This skill assumes you already know about CSS-px coordinates, `browser_type`/`browser_type_focused`, and `browser_shadow_query`. The guidance below is LinkedIn-specific; general browser rules are there. ## Rule #0: screenshot + coordinates, not selectors LinkedIn changes class names aggressively and hides composers inside shadow roots AND iframes. **Selectors break constantly.** Your default strategy on every LinkedIn page should be: 1. `browser_screenshot()` — see the page visually 2. Pick the target's position from the image 3. `browser_coords(image_x, image_y)` → get CSS pixels 4. `browser_click_coordinate(css_x, css_y)` — reaches shadow DOM, iframes, and React elements indifferently
- Rule #0: screenshot + coordinates, not selectors
- Invitation manager — inline message button path is BROKEN
- Timing expectations
- Verified selectors
- Profile Message flow (verified end-to-end 2026-04-11)
- Connection request acceptance flow
- Feed post composer flow
- Posting WITH an image attached
- Rate limits and safety
- Common pitfalls
- Auth wall detection
- Deduplication pattern
- See also
sqlite3 "<db_path>" "SELECT status FROM tasks WHERE payload LIKE '%\"profile_url\":\"<url>\"%' AND payload LIKE '%\"action\":\"<action>\"%';"
What does the hive.linkedin-automation skill do?
Read before automating LinkedIn with browser_* tools. LinkedIn combines shadow DOM (#interop-outlet), strict Trusted Types CSP that silently drops innerHTML, Lexical composer, native beforeunload dialogs that hang the bridge, and aggressive spam filters — each has bitten us at least once. Verified flows for profile messaging, connection-request acceptance, feed composition, and search. Requires hive.browser-automation. Verified against logged-in production 2026-04-11.
How do I install it?
Run `npx skills add aden-hive/hive --skill linkedin-automation --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.
Where does this skill come from?
From aden-hive/hive, a repository with 10,850 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.
Is a popular skill a good skill?
Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.
