Date: February 24, 2026
Auditor: GitHub Copilot (Claude Opus 4.6)
Scope: All src/*.js files (52), all skills/*/SKILL.md files (27), all scripts/twitter/ files (66)
- Executive Summary
- src/*.js File Quality Scores
- skills/*/SKILL.md Assessment
- scripts/twitter/ Overview
- Feature Gap Analysis
- Top 10 Scripts Needing Improvement
- Recommendations
| Metric | Value |
|---|---|
Total src/*.js files |
52 (51 scripts + 1 index) |
| Total lines of code in src/ | 8,046 |
| Average quality score (src/) | 5.4 / 10 |
scripts/twitter/ files |
66 |
skills/*/SKILL.md files |
27 |
| Average SKILL.md quality | 6.1 / 10 |
| Features with NO coverage | 19 major gaps |
| Scripts needing major work | 10 critical |
- Two script types coexist poorly: 37 browser IIFEs and 15 Puppeteer ES modules live in the same
src/folder with no clear naming convention - No script has rate-limit detection — the #1 cause of account restrictions
- Zero scripts have selector fallbacks — when X updates their DOM, everything breaks simultaneously
- Legacy scripts are untouched:
unfollowEveryone.js,unfollowback.js, andunfollowWDFBLog.jsare 2024-era code with no updates - The scripts/twitter/ folder is significantly higher quality than src/ with better documentation, structure, and patterns
| Criteria | Weight | Description |
|---|---|---|
| Error Handling | High | try/catch around DOM interactions |
| Retry Logic | High | Recovers from transient failures |
| Progress Reporting | Med | Console logs showing progress |
| Rate-Limit Detection | Critical | Detects X's rate limits and backs off |
| Configurable Options | Med | User-adjustable CONFIG object |
| Export Results | Med | JSON/CSV download of results |
| Selector Fallbacks | High | Alternative selectors when primary fails |
| Code Quality | Med | Clean code, comments, validation |
| # | File | LOC | Error Handling | Retry | Progress | Rate-Limit | Config | Export | Selector Fallbacks | Score |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | engagementAnalytics.js |
174 | ✅ Partial | ✅ 3 retries | ✅ Per-10 | ❌ | ✅ Good | ✅ JSON | ❌ | 7 |
| 2 | bestTimeToPost.js |
180 | ✅ Partial | ✅ 3 retries | ✅ Count | ❌ | ✅ Good | ✅ JSON | ❌ | 7 |
| 3 | hashtagAnalytics.js |
170 | ✅ Partial | ✅ 3 retries | ✅ Count | ❌ | ✅ Good | ✅ JSON | ❌ | 7 |
| 4 | bookmarkOrganizer.js |
155 | ✅ Partial | ✅ 5 retries | ✅ Report | ❌ | ✅ Good | ✅ JSON+CSV | ❌ | 7 |
| 5 | auditFollowers.js |
162 | ✅ Partial | ✅ 3 retries | ✅ Count | ❌ | ✅ Good | ✅ JSON | ❌ | 7 |
| 6 | continuousMonitor.js |
208 | ✅ Partial | ✅ 3 retries | ✅ Detailed | ❌ | ✅ CONFIG const | ❌ | ❌ | 7 |
| 7 | competitorAnalysis.js |
167 | ✅ try/catch | ✅ 3 retries | ✅ Per-account | ❌ | ✅ Good | ✅ JSON | ❌ | 7 |
| 8 | monitorAccount.js |
174 | ✅ Partial | ✅ 5 retries | ✅ Detailed | ❌ | ❌ Minimal | ✅ TXT download | ❌ | 6 |
| 9 | detectUnfollowers.js |
165 | ✅ Partial | ✅ 5 retries | ✅ Detailed | ❌ | ❌ Minimal | ✅ TXT download | ❌ | 6 |
| 10 | newFollowersAlert.js |
136 | ✅ Partial | ✅ 5 retries | ✅ Count | ❌ | ❌ Minimal | ❌ | ❌ | 6 |
| 11 | backupAccount.js |
180 | ✅ try/catch | ✅ 5 retries | ✅ Per-section | ❌ | ✅ Sections toggle | ✅ JSON | ❌ | 6 |
| 12 | sendDirectMessage.js |
176 | ✅ try/catch | ❌ | ✅ Per-user | ❌ | ✅ Good + limits | ❌ | ❌ | 6 |
| 13 | blockBots.js |
136 | ✅ Partial | ❌ | ✅ Count | ❌ | ✅ Heuristics | ✅ JSON | ❌ | 6 |
| 14 | autoRepost.js |
143 | ✅ try/catch | ❌ | ✅ Per-repost | ❌ | ✅ Good filters | ❌ | ❌ | 6 |
| 15 | removeFollowers.js |
135 | ✅ try/catch | ❌ | ✅ Results | ❌ | ✅ Good + dryRun | ❌ | ❌ | 6 |
| 16 | listManager.js |
186 | ✅ Partial | ✅ 5 retries | ✅ Per-action | ❌ | ✅ Multi-mode | ✅ JSON | ❌ | 6 |
| 17 | reportSpam.js |
120 | ✅ try/catch | ❌ | ✅ Count | ❌ | ✅ + dryRun | ❌ | ❌ | 5 |
| 18 | muteByKeywords.js |
122 | ✅ try/catch | ❌ | ✅ Per-mute | ❌ | ✅ Good | ❌ | ❌ | 5 |
| 19 | joinCommunities.js |
113 | ✅ try/catch | ❌ | ✅ Count | ❌ | ✅ + dryRun | ❌ | ❌ | 5 |
| 20 | scrapeSpaces.js |
113 | ✅ Partial | ✅ scroll retries | ✅ Report | ❌ | ✅ Good | ✅ JSON | ❌ | 6 |
| 21 | schedulePosts.js |
155 | ✅ try/catch | ❌ | ✅ Per-post | ❌ | ✅ Good | ❌ | ❌ | 5 |
| 22 | postThread.js |
132 | ❌ Minimal | ❌ | ✅ Per-tweet | ❌ | ✅ + dryRun | ❌ | ❌ | 5 |
| 23 | createPoll.js |
130 | ❌ Minimal | ❌ | ✅ Preview | ❌ | ✅ Validation | ❌ | ❌ | 5 |
| 24 | updateProfile.js |
133 | ✅ Partial | ❌ | ✅ Per-field | ❌ | ✅ Good | ❌ | ❌ | 5 |
| 25 | manageMutedWords.js |
119 | ✅ try/catch | ❌ | ✅ Per-word | ❌ | ✅ + dryRun | ❌ | ❌ | 5 |
| 26 | clearAllReposts.js |
68 | ✅ try/catch | ✅ 5 retries | ✅ Per-10 | ❌ | ✅ Config | ❌ | ❌ | 5 |
| 27 | massBlock.js |
102 | ✅ try/catch | ❌ | ✅ Count | ❌ | ✅ + dryRun | ❌ | ❌ | 5 |
| 28 | massUnblock.js |
73 | ✅ try/catch | ✅ 5 retries | ✅ Per-10 | ❌ | ✅ Config | ❌ | ❌ | 5 |
| 29 | massUnmute.js |
69 | ✅ try/catch | ✅ 5 retries | ✅ Per-10 | ❌ | ✅ Config | ❌ | ❌ | 5 |
| 30 | unlikeAllPosts.js |
70 | ✅ try/catch | ✅ 5 retries | ✅ Per-10 | ❌ | ✅ Config | ❌ | ❌ | 5 |
| 31 | clearAllBookmarks.js |
88 | ✅ try/catch | ✅ 5 retries | ✅ Per-10 | ❌ | ✅ Config | ❌ | ❌ | 5 |
| 32 | leaveAllCommunities.js |
106 | ✅ Partial | ✅ sessionStorage | ✅ Per-community | ❌ | ❌ | ❌ | ❌ | 5 |
| 33 | downloadAccountData.js |
80 | ✅ Partial | ❌ | ✅ Status | ❌ | ✅ Minimal | ❌ | ❌ | 4 |
| 34 | qrCodeSharing.js |
88 | ✅ try/catch | ❌ | ✅ URL | ❌ | ✅ Good | ✅ PNG download | ❌ | 5 |
| 35 | unfollowback.js |
61 | ❌ None | ✅ 3 retries | ❌ Minimal | ❌ | ❌ | ❌ | ❌ | 3 |
| 36 | unfollowEveryone.js |
60 | ❌ None | ✅ 3 retries | ❌ Minimal | ❌ | ❌ | ❌ | ❌ | 3 |
| 37 | unfollowWDFBLog.js |
76 | ❌ None | ✅ 5 retries | ❌ Minimal | ❌ | ❌ | ✅ TXT download | ❌ | 3 |
| # | File | LOC | Error Handling | Retry | Progress | Rate-Limit | Config | Export | Selector Fallbacks | Score |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | postComposer.js |
375 | ✅ try/catch | ❌ | ❌ Console only | ❌ | ✅ Options params | ✅ Structured JSON | ❌ | 6 |
| 2 | engagementManager.js |
272 | ✅ Partial | ❌ | ❌ | ❌ | ✅ Options params | ✅ Structured JSON | ❌ | 6 |
| 3 | profileManager.js |
269 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Options params | ✅ Structured JSON | ❌ | 6 |
| 4 | settingsManager.js |
261 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Options params | ✅ Structured JSON | ❌ | 6 |
| 5 | premiumManager.js |
231 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Function params | ✅ Structured JSON | ❌ | 6 |
| 6 | discoveryExplore.js |
213 | ✅ Partial | ❌ scroll retries | ❌ | ❌ | ✅ Good | ✅ Structured JSON | ❌ | 6 |
| 7 | dmManager.js |
200 | ✅ Partial | ❌ | ❌ | ❌ | ✅ Options params | ✅ Structured JSON | ❌ | 5 |
| 8 | businessTools.js |
194 | ✅ Partial | ❌ scroll retries | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 9 | creatorStudio.js |
182 | ✅ Partial | ❌ | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 10 | spacesManager.js |
175 | ✅ Partial | ❌ | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 11 | articlePublisher.js |
175 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 12 | notificationManager.js |
171 | ✅ Partial | ❌ scroll retries | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 13 | pollCreator.js |
164 | ✅ try/catch | ❌ | ❌ Console only | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
| 14 | bookmarkManager.js |
146 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Options | ✅ JSON+CSV | ❌ | 5 |
| 15 | grokIntegration.js |
152 | ✅ try/catch | ❌ | ❌ | ❌ | ✅ Options | ✅ Structured JSON | ❌ | 5 |
Score 3: ███ 3 files (5.8%) — Legacy unfollow scripts
Score 4: █ 1 file (1.9%) — downloadAccountData
Score 5: ██████████████████████████████ 30 files (57.7%) — Functional but basic
Score 6: ██████████████████ 12 files (23.1%) — Decent quality
Score 7: ███████ 6 files (11.5%) — Good quality
Score 8+: 0 files (0%) — No production-grade scripts
| Issue | Impact | Affected Files |
|---|---|---|
| No rate-limit detection | Account can get restricted/suspended | 51/51 (100%) |
| No selector fallbacks | Scripts break when X updates DOM | 51/51 (100%) |
| No graceful degradation | One selector fail = script crash | ~40/51 (78%) |
| No estimated time remaining | Users don't know when scripts finish | ~45/51 (88%) |
| No pause/resume capability | Can't recover interrupted sessions | 51/51 (100%) |
| No total count preview | Don't know how many items exist | ~35/51 (69%) |
| Hardcoded sleep times | No adaptive delay based on response | 51/51 (100%) |
| # | Skill | Words | Covers All Scripts? | Quality Score | Issues |
|---|---|---|---|---|---|
| 1 | analytics-insights | 635 | ✅ 5/5 scripts | 8 | Best skill doc. Has usage, output, config examples |
| 2 | messaging-engagement | 619 | ✅ Good | 7 | Formerly named poorly (message+engagement overlap) |
| 3 | blocking-muting-management | 541 | ✅ 6/6 scripts | 7 | Good selector table and usage instructions |
| 4 | settings-privacy | 529 | ✅ Good | 7 | Covers toggle, blocked, muted, data download |
| 5 | content-posting | 512 | ✅ Good | 7 | Thread, poll, schedule, compose |
| 6 | profile-management | 486 | ✅ Good | 6 | Covers update, avatar, header, scrape |
| 7 | posting-content | 486 | 5 | Duplicate skill with content-posting | |
| 8 | content-cleanup | 431 | ✅ 3/3 scripts | 6 | Clear, direct instructions |
| 9 | premium-subscriptions | 424 | ✅ Good | 6 | Tier comparison is useful |
| 10 | engagement-interaction | 412 | ✅ Good | 6 | Like, reply, bookmark, hide |
| 11 | growth-automation | 385 | 5 | References scripts/twitter scripts not src/ | |
| 12 | spaces-live | 384 | ✅ Good | 6 | Covers scrape, create, schedule |
| 13 | discovery-explore | 382 | ✅ Good | 6 | Search, trends, topics |
| 14 | xactions-mcp-server | 382 | ✅ Good | 6 | MCP integration docs |
| 15 | lists-management | 352 | ✅ Good | 6 | Create, add, export |
| 16 | grok-ai | 344 | ✅ Good | 6 | Query, image gen, summarize |
| 17 | creator-monetization | 342 | ✅ Good | 5 | Light on examples |
| 18 | direct-messages | 338 | ✅ Good | 6 | Send, export, requests |
| 19 | business-ads | 336 | ✅ Good | 5 | Brand monitoring, audience |
| 20 | twitter-scraping | 335 | 5 | Doesn't list all scrapers | |
| 21 | notifications-management | 307 | ✅ Good | 5 | Basic coverage |
| 22 | follower-monitoring | 305 | ✅ 4/4 scripts | 6 | Detect, monitor, audit, alert |
| 23 | bookmarks-management | 304 | ✅ Good | 5 | Organize, export, clear |
| 24 | articles-longform | 298 | ✅ Good | 5 | Publish, draft, list articles |
| 25 | unfollow-management | 263 | ✅ 4/4 scripts | 6 | Concise and accurate |
| 26 | xactions-cli | 234 | 4 | Missing CLI command examples | |
| 27 | community-management | 176 | 4 | Missing joinCommunities coverage |
- Duplicate skills:
content-postingandposting-contentcover the same topic - community-management only documents
leaveAllCommunities.js— missingjoinCommunities.js - twitter-scraping doesn't enumerate all scraper modules in
src/scrapers/ - xactions-cli is very thin at 234 words with no command examples
- growth-automation references
scripts/twitter/files but skill docs should map tosrc/modules
66 scripts total. These are a newer, higher-quality generation of browser scripts with:
- Consistent JSDoc block headers with @name, @author, @version, @date
- Better documentation with ASCII art banners
- Named async IIFEs instead of anonymous
- More sophisticated patterns (localStorage tracking, multi-phase workflows)
| Script | LOC | Quality | Notable |
|---|---|---|---|
growth-suite.js |
360 | 8 | Multi-action suite, session tracking, localStorage state, limit checks |
smart-unfollow.js |
302 | 8 | Two-phase workflow, whitelist, grace period, dry-run mode |
viral-tweets-scraper.js |
288 | 8 | Threshold filters, JSON+CSV export, media detection |
followers-growth-tracker.js |
278 | 7 | Historical data, visual charts in console, daily dedup |
multi-account.js |
375 | 7 | Account rotation, usage tracking, dashboard, schedule |
Key finding: The scripts/twitter/ scripts are 1-2 quality points higher than equivalent src/ scripts on average (avg ~7.5 vs ~5.4). They represent the project's future quality bar.
| scripts/twitter/ file | Equivalent in src/ |
|---|---|
smart-unfollow.js |
❌ No equivalent (smarter than unfollowback.js) |
growth-suite.js |
❌ No equivalent |
viral-tweets-scraper.js |
❌ No equivalent |
followers-growth-tracker.js |
❌ No equivalent |
multi-account.js |
❌ No equivalent |
interact-by-place.js |
❌ No equivalent |
interact-by-hashtag.js |
❌ No equivalent |
interact-with-likers.js |
❌ No equivalent |
interact-by-users.js |
❌ No equivalent |
like-by-location.js |
❌ No equivalent |
comment-by-hashtag.js |
❌ No equivalent |
comment-by-location.js |
❌ No equivalent |
find-fake-followers.js |
Partial via auditFollowers.js |
protect-active-users.js |
❌ No equivalent |
whitelist.js / blacklist.js |
❌ No equivalent |
rate-limiter.js |
❌ Critical — needed by all scripts |
filter-manager.js |
❌ No equivalent |
thread-unroller.js |
❌ No equivalent |
| # | Feature | Priority | Difficulty | Notes |
|---|---|---|---|---|
| 1 | Tweet deletion / bulk delete old tweets | 🔴 Critical | Medium | One of the most-requested Twitter automation features. No script exists anywhere in the project. |
| 2 | Pinned tweet management | 🟡 Medium | Easy | Pin/unpin tweets programmatically. Would be ~50 LOC. |
| 3 | Shadowban checker | 🔴 Critical | Medium | Extremely popular utility. Check if account is search-banned, ghost-banned, or reply-deboosted. |
| 4 | Account health monitor | 🔴 Critical | Medium | Composite score: engagement trend, follower ratio, suspension risk, rate limit proximity. |
| 5 | Automated replies / auto-respond | 🟡 Medium | Medium | Monitor mentions and auto-reply with templates. Different from auto-liker. |
| 6 | Content calendar management | 🟡 Medium | Medium | Visual schedule of planned posts, manage queue. |
| 7 | A/B testing posts | 🟡 Medium | Hard | Post variants, measure engagement, declare winner. |
| 8 | Sentiment analysis on mentions | 🟡 Medium | Medium | businessTools.js has basic keyword sentiment but no dedicated script. Needs NLP. |
| 9 | Viral tweet detection | 🟢 Low | Easy | scripts/twitter/viral-tweets-scraper.js exists but no src/ equivalent. |
| 10 | Tweet performance comparison | 🟡 Medium | Easy | Compare two specific tweets' metrics side by side. |
| 11 | Audience demographics analysis | 🟡 Medium | Hard | Bio parsing for location, industry, interests at scale. |
| 12 | Engagement rate calculator | 🟢 Low | Easy | engagementAnalytics.js calculates rates but no standalone calculator. |
| 13 | Follow/unfollow ratio optimizer | 🟡 Medium | Medium | Automated balancing of following/follower ratio over time. |
| 14 | Auto-DM new followers | 🟡 Medium | Medium | Welcome message automation. sendDirectMessage.js exists but not triggered on new followers. |
| 15 | Circle/Close Friends management | 🟢 Low | Medium | X's "Close Friends" feature has no automation. |
| 16 | Highlight tweets (Premium) | 🟢 Low | Easy | No script to manage highlighted tweets. |
| 17 | Connected apps management | 🟢 Low | Easy | Revoke third-party app access programmatically. |
| 18 | Safety mode management | 🟢 Low | Easy | Toggle safety mode on/off. |
| 19 | Two-factor authentication setup | 🟢 Low | Hard | Security-sensitive, probably should NOT automate. |
| Feature | Current State | Gap |
|---|---|---|
| Follower growth tracking over time | newFollowersAlert.js + scripts/twitter/followers-growth-tracker.js |
No persistent dashboard; data in localStorage only |
| Profile picture/banner upload | profileManager.js has uploadAvatar() and uploadHeader() (Puppeteer) |
No browser console version |
| Quote tweet automation | postComposer.js has quotePost() |
No browser console script version |
| Twitter Blue/Premium feature automation | premiumManager.js has tier info |
Read-only info, doesn't automate Premium features |
| Advanced search automation | discoveryExplore.js has advancedSearch() |
Good coverage in Puppeteer, no browser version |
| Account switching | scripts/twitter/multi-account.js exists |
No src/ equivalent |
| Data portability/GDPR requests | downloadAccountData.js + settingsManager.requestDataDownload() |
Two overlapping scripts, neither robust |
| Display/theme customization | settingsManager.js has content preferences |
No display/theme/dark mode toggle |
| Email/push notification settings | notificationManager.js has getNotificationSettings() |
Read-only, can't toggle specific settings |
Issues:
- Last updated: March 2024 (nearly 2 years old)
- Zero error handling (no try/catch)
- Uses
Promise.all()on clicks — causes race conditions with confirm dialog - No CONFIG object — nothing is configurable
- No progress reporting beyond count
- No page validation
- No rate-limit awareness
- UPPERCASE console messages feel unprofessional
- Fix: Rewrite using the pattern from
clearAllReposts.jsas a template
Issues:
- Same 2024 codebase as
unfollowEveryone.js Promise.all()race condition on sequential DOM mutations- Recursive
nextBatch()without stack overflow protection - No configurable options
- No progress reporting
- No dry-run mode
- Fix: Rewrite.
scripts/twitter/smart-unfollow.jsis the vastly superior replacement
Issues:
- Same as above but with logging
sleep()takes seconds not milliseconds (inconsistent with all other scripts)- Sequential processing but no error handling per-user
- No configurable limits
- Fix: Merge functionality into a unified unfollow script with modes
Issues:
- Only 80 LOC — too thin for what it claims
- Searches for buttons by
textContent— extremely fragile - No configurable options to speak of
- No retry on password prompt
- checkInterval/maxChecks CONFIG exists but monitoring loop is never implemented
- Overlaps with
settingsManager.requestDataDownload() - Fix: Either flesh out or consolidate with settingsManager
Issues:
typeText()function is broken — usesInputEvent+document.execCommandsimultaneously- Native scheduler date/time picker interaction is incomplete (has TODO comment)
- No validation that scheduled time is in the future
- No timezone handling
- No media upload support
- Fix: Needs complete rewrite of the scheduling interaction
Issues:
- No error handling around DOM interactions
- Uses
document.execCommand('insertText')which is deprecated - No media upload per tweet
- No recovery if one tweet in thread fails
- Character count validation exists but no URL shortening awareness
- Fix: Add try/catch, media support, graceful partial failure
Issues:
- Navigates via
window.location.href— loses script execution context - Report flow uses fragile
textContentmatching instead ofdata-testid - No confirmation that report was actually submitted
- No bulk rate-limit handling
- Fix: Needs flow rewrite; possibly should be Puppeteer-only
Issues:
- Uses
sessionStoragekeyxactions_left_idsbut SKILL.md saysxactions_left_communities— documentation mismatch - Recursive
run()without depth limit — could stack overflow - No configurable limit on communities to leave
- No dry-run mode
- Format of community tracking differs from other scripts
- Fix: Add limit config, dry-run, fix docs, add iteration instead of recursion
Issues:
- Uses
$pollButtonselector[data-testid="pollButton"]— likely wrong for 2026 (should be[aria-label="Add poll"]) - Poll option selectors
pollOptionTextInput_0differ frompostComposer.js'spollOption_0— inconsistency - No verification that poll was actually posted
document.execCommand('insertText')is deprecated- Duration setting is not implemented (only days)
- Fix: Reconcile selectors with postComposer.js, add duration UI interaction
Issues:
- Uses
window.location.hreffor navigation — loses execution between profiles - Can only analyze one profile before script context is lost
- Should use
window.open()in new tab or fetch-based approach - No caching of results between navigations
- No rate-limit detection for sequential profile crawling
- Fix: Redesign to work without page navigation, or convert to Puppeteer-only
-
Create
src/bulkDeleteTweets.js— Most-requested missing feature. Template fromclearAllReposts.js. -
Create
src/shadowbanCheck.js— Extremely popular utility. Check search bans, ghost bans, reply deboosting by queryingx.com/search?q=from:USERNAMEand checking if results appear. -
Create
src/accountHealth.js— Composite health score: engagement trend, follower ratio, rate limit proximity, bio completeness, verification status. -
Create a shared
src/utils/rateLimiter.js—scripts/twitter/rate-limiter.jsalready exists. Port it to a reusable util. Every script should import and use it. -
Create a shared
src/utils/selectorFallbacks.js— Central selector registry with fallbacks for every data-testid, so when X updates the DOM, only one file needs updating. -
Rewrite the 3 legacy unfollow scripts — Replace
unfollowEveryone.js,unfollowback.js,unfollowWDFBLog.jswith a singleunfollowManager.jsthat has modes:all,non-followers,logged.
-
Migrate best scripts/twitter/ patterns to src/ — Particularly
smart-unfollow.js,growth-suite.js,viral-tweets-scraper.js,followers-growth-tracker.js. -
Add rate-limit detection to all scripts — Watch for HTTP 429 indicators in the DOM (error messages, "Rate limit exceeded" text), and implement exponential backoff.
-
Add selector fallbacks pattern — Every script should try multiple selectors:
const btn = document.querySelector('[data-testid="like"]') || document.querySelector('[aria-label="Like"]') || document.querySelector('button[role="button"] svg[viewBox*="like"]');
-
Add pause/resume to all long-running scripts — Store progress in sessionStorage, allow
window.stopXActions()and restart to resume. -
Consolidate duplicate skills — Merge
content-postingandposting-contentSKILL.md files. -
Add
joinCommunities.jsto community-management SKILL.md.
| Priority | Script | Estimated LOC | Based On |
|---|---|---|---|
| 🔴 P0 | bulkDeleteTweets.js |
~120 | clearAllReposts.js pattern |
| 🔴 P0 | shadowbanCheck.js |
~150 | Search + comparison logic |
| 🔴 P0 | accountHealth.js |
~200 | Composite of existing metrics |
| 🟡 P1 | autoReplyMentions.js |
~180 | sendDirectMessage.js pattern |
| 🟡 P1 | pinnedTweetManager.js |
~80 | Simple click automation |
| 🟡 P1 | viralTweetsDetector.js |
~170 | Port of scripts/twitter/viral-tweets-scraper.js |
| 🟡 P1 | followGrowthTracker.js |
~180 | Port of scripts/twitter/followers-growth-tracker.js |
| 🟡 P1 | tweetPerformanceCompare.js |
~120 | engagementAnalytics.js pattern |
| 🟢 P2 | contentCalendar.js |
~200 | schedulePosts.js + localStorage queue |
| 🟢 P2 | highlightManager.js |
~80 | Simple Premium feature toggle |
| 🟢 P2 | connectedAppsManager.js |
~100 | Settings page automation |
| 🟢 P2 | displayThemeToggle.js |
~80 | Settings display page |
| Category | Count | Avg Quality |
|---|---|---|
| Browser IIFE scripts (src/) | 37 | 5.2 / 10 |
| Puppeteer modules (src/) | 15 | 5.5 / 10 |
| scripts/twitter/ (sampled) | 5/66 | 7.6 / 10 |
| SKILL.md docs | 27 | 6.1 / 10 |
Overall project grade: B- — Impressive breadth (80+ scripts covering most X features), but depth and robustness need significant work. The gap between the newer scripts/twitter/ quality and the older src/ quality suggests the project is actively improving, but the core src/ scripts that users encounter first haven't kept pace.