nirholas/xactions
engagement-interaction
Automates X/Twitter engagement actions — like, unlike, reply, bookmark, hide replies, auto-like by keyword, and sweeping an entire profile (like + repost + reply to every post, with template or LLM-written replies).
Use judgment
Installs
18
Stars
510
Security
No audit
Freshness
Unknown
Updated
—
First seen Feb 28, 2026
Installation
Project
Global
Entire repo
Entire repo (global)
$
npx skills add nirholas/xactions --skill engagement-interaction
Copy
SKILL.md
Engagement & Interaction
Browser automation for X/Twitter engagement — liking, replying, bookmarking, hiding replies, and bulk unlike.
Script Selection
Goal
File
Navigate to
Like/unlike/reply/bookmark tweets
src/engagementManager.js
Tweet URL or timeline
Auto-like by keyword
src/engagementManager.js
x.com/home or search page
Get engagement analytics for a post
src/engagementManager.js
Tweet URL
Hide replies on your posts
src/engagementManager.js
Reply URL
Unlike ALL liked posts
src/unlikeAllPosts.js
x.com/USERNAME/likes
Like + repost + reply to EVERY post in a feed (profile, search, list, hashtag, home)
scripts/engageProfile.js, xactions engage , or MCP x_engage
the feed itself, or any terminal
Engagement Manager
File: src/engagementManager.js
Puppeteer-based module for individual and bulk engagement actions.
Functions
Function
Purpose
likeTweet(page, tweetUrl)
Like a specific tweet (skips if already liked)
unlikeTweet(page, tweetUrl)
Unlike a specific tweet
replyToTweet(page, tweetUrl, text, { media? })
Reply with text and optional media
bookmarkTweet(page, tweetUrl)
Bookmark a tweet
unbookmarkTweet(page, tweetUrl)
Remove a bookmark
hideReply(page, replyUrl)
Hide a reply on your post
autoLikeByKeyword(page, { keywords, limit, delay, url })
Auto-like posts matching keywords
getEngagementAnalytics(page, tweetUrl)
Get likes, reposts, replies, impressions
Auto-Like by Keyword
Scrolls a timeline or search page and likes posts containing any of the specified keywords. Empty keywords array likes all posts.
await autoLikeByKeyword(page, {
keywords: ['AI', 'javascript'],
limit: 20,
delay: 2000,
url: 'https://x.com/home',
});
Reply to Tweet
Navigates to a tweet, types a reply, optionally attaches media, and submits.
Unlike All Posts
File: src/unlikeAllPosts.js
Browser console script that unlikes every post in your Likes tab. Supports keyword filters, dry run mode, rate limit detection, and exports a log.
How to Use
Navigate to x.com/YOUR_USERNAME/likes
Open DevTools (F12) → Console
Paste the script → Enter
Configuration
maxUnlikes: Infinity — cap on unlikes
skipKeywords: [] — keep likes containing these words
onlyKeywords: [] — only unlike posts matching these words
dryRun: false — preview without unliking
Controls
window.XActions.pause() / .resume() / .abort() / .status()
DOM Selectors
Element
Selector
Like button
[data-testid="like"]
Unlike button
[data-testid="unlike"]
Reply button
[data-testid="reply"]
Reply input
[data-testid="tweetTextarea_0"]
Reply submit
[data-testid="tweetButton"]
Share button
[data-testid="share"]
Bookmark
[data-testid="bookmark"]
Remove bookmark
[data-testid="removeBookmark"]
Hide reply
[data-testid="hideReply"]
Tweet
article[data-testid="tweet"]
Tweet text
[data-testid="tweetText"]
Rate Limiting & Safety
Engagement Manager: 1.5–2s delay between actions, 2s default for auto-like
Unlike All: 1–2.5s between unlikes (gaussian randomized), 1.8s scroll delay
Rate limit detection via [data-testid="toast"] with 60s cooldown
Unlike All is irreversible — use dryRun: true to preview first
X may restrict after ~400 like/unlike actions per day
Troubleshooting
Problem
Solution
Like button not found
Tweet may already be liked — check for unlike button
Reply not posting
Verify tweetTextarea_0 selector; tweet may have reply restrictions
Auto-like stops early
Rate limit hit — script waits 60s and retries
Unlike All stops after ~20
Rate limit — wait 1 hour and re-run