| name | Scroll LinkedIn |
| description | Extract posts from LinkedIn feed via Libretto workflow, then analyze for comment-worthy and generally interesting content |
Scroll LinkedIn Feed
Runs the Libretto workflow to extract posts from LinkedIn, then analyzes the results for:
- Posts worth commenting on given your expertise
- Posts that are generally interesting to you
Always present comment-worthy posts first.
Usage
[skill:scroll-linkedin] [number of posts]
Default: 50 posts
Step 1: Run the Libretto Workflow
Run the extraction workflow headlessly with the saved auth profile:
libretto run ./workflows/scroll-linkedin.ts --headless --auth-profile linkedin.com --params '{"targetPosts": 50}'
To customize the target post count:
libretto run ./workflows/scroll-linkedin.ts --headless --auth-profile linkedin.com --params '{"targetPosts": 80}'
If the workflow fails with an auth error, the profile may have expired. Re-login:
libretto open https://linkedin.com --session login-linkedin
libretto save linkedin.com --session login-linkedin
libretto close --session login-linkedin
Then re-run the workflow.
Step 2: Analyze the Output
After the workflow completes, analyze the saved posts and present a two-part summary.
IMPORTANT: Present the full analysis as your final message to the user. The summary IS the deliverable.
Use call_llm for analysis but do not let it invent links.
User profile for filtering
Read profile.md from the project root to understand what topics the user cares about, what they're trying to grow, and what their engagement style is. Use this to judge which posts are comment-worthy vs. interesting vs. skippable.
Link rules (critical)
- Use
postUrl as the post link when it is present.
- If
postUrl is empty, fall back to authorProfileUrl.
- Do not invent or reconstruct LinkedIn URLs that are not present in the extracted data.
- If
externalLinks is non-empty, include them as supplementary links.
What belongs in Good posts to comment on
Include posts where the user has a real angle worth adding.
Be selective. 0-6 posts is normal.
For each such post, explain:
- why it is a good commenting opportunity
- what angle would be natural/helpful to take
Do not write the full comment unless explicitly asked.
What belongs in Interesting generally
Include posts aligned with the user's broader interests even if they are not obvious commenting opportunities.
What to Skip
- opinions/takes without a concrete link, demo, launch, deployment, or architecture detail
- speculative hype or generic AI discourse
- hiring posts, event announcements, vague teasers
- ads and sponsored content
- posts where the user would have no distinctive perspective
Formatting
Always present comment-worthy posts first.
Section 1: Good posts to comment on
Use this exact format for every post:
## Good posts to comment on
**<Title summary>** — <Why this is relevant to comment on>
> *"<Relevant snippet from the post>"* — **<Author Name>**
> **Why comment:** <1 sentence>
> **Angle:** <1 sentence describing the helpful angle to take>
> **Post:** <postUrl if present, else authorProfileUrl>
> **Supplementary:** [link 1](<url>), [link 2](<url>)
If there are no supplementary links, omit the Supplementary line.
If there are none, say:
## Good posts to comment on
No especially strong LinkedIn commenting opportunities this run.
Section 2: Interesting generally
Use this exact format:
## Interesting generally
**<Title summary>** — <Why this is interesting>
> *"<Relevant snippet from the post>"* — **<Author Name>**
> **Post:** <postUrl if present, else authorProfileUrl>
> **Supplementary:** [link 1](<url>), [link 2](<url>)
If there are no supplementary links, omit the Supplementary line.
Post Structure
Each post in the output file:
{
"author": "Person Name",
"authorProfileUrl": "https://www.linkedin.com/in/person-name/",
"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:123/",
"text": "Post content (truncated to 600 chars)...",
"reactions": "42",
"comments": "7 comments",
"reposts": "2 reposts",
"externalLinks": ["https://blog.example.com/article"]
}
Troubleshooting
- Auth expired - Re-login and save profile:
libretto open https://linkedin.com --session login && libretto save linkedin.com --session login
- Post URLs missing - LinkedIn often hides feed post permalinks in the DOM. The workflow captures them when available, otherwise falls back to author profile URLs.
- Few posts - LinkedIn may be throttling; try again later
- Scrolling stuck - The workflow uses
scrollIntoView which is the most reliable method for LinkedIn