Use when someone wants to grow reach through comments, replies, groups, or outreach on LinkedIn — a commenting roster, a connection request note, a DM or InMail, a networking plan, or a check on whether their outreach volume is safe. Triggers on "who should I engage with", "write a connection request", "cold DM", "LinkedIn outreach", "networking strategy", "how many invites can I send". Builds a weekly comment roster inside a real time budget, assembles one message at a time and refuses templates, and caps volume against LinkedIn's limits. Nothing is ever sent.
From a standing start your posts reach almost nobody, and publishing harder does not fix it. A substantive comment on a post that already has an audience puts your name, headline, and a paragraph of thinking in front of people already reading about your subject, for six minutes of work — the cheapest distribution on the platform, and the most badly used.
Nothing here sends anything — no credentials, no API calls. Automated connecting, messaging, commenting, liking, and sharing are prohibited by User Agreement §8.2.
1. Build the comment roster. Name 8-12 accounts they would read anyway, with audience overlap and rough size tier, then:
python3 scripts/comment_target_planner.py --account "Priya Raman:5:4:larger" \
--account "Tomas Lind:5:3:peer" --minutes-per-day 18 --output human
Tiers are huge (10x+, crowded), larger (2-10x, the best ratio), peer (~1x, where
reciprocity compounds), smaller (goodwill). The roster caps any account at twice a week —
commenting daily on one person reads as following them around — and keeps the huge tier under
half of any day. It builds the roster, never the comments: a generated comment is exactly
what §8.2 names, and it is recognisable anyway.
2. Outreach — check the volume before writing anything.
python3 scripts/outreach_volume_guard.py --invites 20 --pending 5 --minutes 120 \
--acceptance 0.42 --output human
Exit 0 safe / 2 tight / 3 over a cap or the time budget / 4 refused above 40 invitations a day, because nobody reads that many profiles and writes that many specific lines. Pending invitations count against the weekly limit (observed around 100), and acceptance below 20% is a stop signal — it is the pattern LinkedIn reviews, and the targeting is wrong.
3. Write one message, for one person.
python3 scripts/outreach_message_builder.py --type connection \
--recipient "Priya" --specific-line "..." --reason "..." --output human
It refuses without a person-specific line, refuses an ask in a first-touch connection note,
and enforces the 200-character cap (300 with --premium). In large third-party samples a
note barely moves acceptance (~26.4% either way) but roughly doubles the post-accept reply
rate: the note earns the conversation, not the meeting.
4. The order that works. Comment on their work for two weeks. Then invite, referencing something specific from that reading. Then, after acceptance and a pause, ask once, small.
| Script | Role |
|---|---|
| scripts/comment_target_planner.py | Weekly roster from scored accounts, inside a time budget, with per-account and per-tier caps. |
| scripts/outreach_message_builder.py | Assembles one message; refuses templates, premature asks, and 14 dead phrases. |
| scripts/outreach_volume_guard.py | Caps invitations against the observed weekly limit, pending backlog, acceptance floor, and the hours available. |
references/comment_strategy.md — tiers, what a comment competes on, pods, replying to your own posts (7 sources)
references/outreach_ethics_and_benchmarks.md — the benchmark numbers with their provenance, and the personalisation claim corrected (7 sources)
assets/outreach_worksheet.md — fillable per-person prep sheet
assets/example_outreach.json — input shape for the builder
linkedin-content — writes posts. A comment is a different craft on a different budget.marketing-skill/cold-email — email. Different channel, law, and caps.business-growth/, commercial/ — sales process and deal economics, not networking.Version: 1.0.0
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/linkedin-engagement · pinned to the source commit
# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/linkedin-engagement" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/linkedin-engagement" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/linkedin-engagement
Scanner static-checks@0.1.0 · commit 19392f7a0826. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.