The LinkedIn Growth Engine
Before this, read:
- Watchers: condition-until-it-fires — the detection pattern this agent uses
- Socrates: the X autopilot — the X counterpart to this system
LinkedIn’s algorithm rewards early, substantive comments on posts by large accounts. If JD comments within the first hour of a post going live on Andrew Ng’s or Sam Altman’s feed, that comment is visible to their audience before the post’s reach peaks. The problem is that manually monitoring 20 accounts for fresh posts is not a good use of time.
The LinkedIn comment engine solves this by monitoring those accounts automatically, drafting a response in JD’s voice when a new post appears, and surfacing the draft to Telegram with a “comment now to be early” flag. JD decides whether to send.
Why draft-only
Section titled “Why draft-only”LinkedIn does not expose a public comment-create API to non-partner accounts. Every workaround — Playwright automation, browser cookies — risks triggering LinkedIn’s bot detection and getting the account restricted or banned.
The research finding that drove this design decision (from the 2026-06-08 organic growth audit):
“Auto-posting-at-scale is suppressed in 2026. The draft→human-send pattern is the un-bannable one.”
An agent that writes the comment but has JD click “Post” has the same reach effect at essentially zero account risk. The 5 seconds JD spends sending a pre-drafted comment is worth far less than the hours it would take to manually discover, read, and draft a comment on a rising post.
How it works
Section titled “How it works”The engine lives in agents/growth/:
linkedin_comment_targeter.py— manages the 20-account target list, polls for new activitylinkedin_comment_engine.py— drafts comments in JD’s voice, applies quality and safety checks
Target list: stored at ~/clawd/domains/growth/state/linkedin-comment-targets.yaml. JD manages this file directly — add or remove accounts without touching code. At launch the list included Sam Altman, Andrew Ng, Andrej Karpathy, Ethan Mollick, and 16 others in the AI and entrepreneurship niche.
Detection: the targeter runs every 4 minutes during active hours. For each target account, it checks whether any posts appeared since the last run. A post is “fresh” when it’s under 2 hours old — old enough to have some signal (likes/comments starting to accumulate) but not so old that commenting early no longer has reach value.
Drafting: for each fresh post, the engine drafts a comment using JD’s voice profile. The draft must: be on-topic, add something specific to the conversation, not open with “Great post!”, and pass the length check (LinkedIn comments perform best in the 50–150 word range, adding substance without being an essay).
Quality gates: AI-tell check (filter out phrases that sound like a language model wrote them), PII check, cross-target duplicate check (don’t post the same comment on two different accounts’ posts), daily cap (3 comments per day, configurable).
Delivery: qualifying drafts get a Telegram push: the post excerpt, the drafted comment, and a “comment now to be early” timestamp note. JD reviews in seconds and decides to send or skip.
The authenticated browser pattern
Section titled “The authenticated browser pattern”The targeter reads LinkedIn activity via an authenticated browser session — Playwright with JD’s logged-in Chrome profile. This mirrors the pattern used in x_browser_reply.py for X.
The approach: rather than using LinkedIn’s API (limited, versioned, broken MCP OAuth), the browser logs in as JD and reads the feed directly. Read operations through an authenticated session are indistinguishable from a human browsing the site, so they carry no account risk.
The initial profile inspection run (2026-05-26) produced real data: 2,601 followers, ~19/week growth, posts at 350–1,100 impressions, an existing LinkedIn-native newsletter. That live audit informed the growth strategy.
# Initial profile audit run:# agents/growth/linkedin_browser.py (persistent-profile authenticated browser)# Saved to ~/agent-system/state/linkedin/inspect-20260526-140350/The follow/ethos gate
Section titled “The follow/ethos gate”Each drafted comment is also checked against a “follow/ethos” gate before delivery: does this comment make sense coming from someone with JD’s specific positioning (agent systems, BYU AI Foundry, build-in-public)? A comment that’s technically on-topic but off-brand for JD’s public identity gets a lower confidence score and may be held back or flagged for manual review.
This gate exists because early LinkedIn engagement is identity-building. A comment that doesn’t fit the persona JD is establishing — even if it’s a good comment — isn’t the right use of the opportunity.
Cron and daily caps
Section titled “Cron and daily caps”The engine runs every 4 minutes during active hours (6am–9pm MT), controlled by the active-hours gate in linkedin_comment_targeter.py. The daily cap is 3 comments — intentionally conservative for a new account growth strategy. The cap prevents the account from appearing bot-like even if the drafts are excellent.
The cap resets at midnight MT. Status is persisted to ~/clawd/domains/growth/state/linkedin-comment-state.yaml.
What the live smoke showed
Section titled “What the live smoke showed”The first live read-only smoke test (2026-06-08, commit 8b92323) confirmed: detection working, Andrew Ng’s activity visible, draft quality checked, no account writes made. The post history from that run confirmed the cold-start anchor behavior was working — the system didn’t blast JD with comments on posts from 3 days ago on first startup.
At the time of the CHANGELOG entry:
“The LinkedIn reach lever JD asked for. 23 tests.”
23 tests cover: target file loading, active-hours gating, fresh-post detection, draft quality checks, daily cap enforcement, cross-target duplicate detection, and the deliver-to-Telegram path.
Next: The newsletter pipeline that turns weekly build output into a deliverable — the newsletter agent.