How I Used Grok's AI to Beat Its System for Automation
Automating social media on Twitter, which is now called X, is not easy at all. There are so many obstacles in the way. The platform has built smart systems to find and stop bots—those automated accounts that post or interact without a real person behind them. These systems look for patterns in how accounts behave, like posting too often or at exact times. If they spot something suspicious, they might slow down the account, limit what it can do, or even ban it completely. On top of that, using the official API to connect programs to Twitter costs a lot of money—thousands of dollars for basic access—and there are strict rules on how many actions you can take in a short time, like only a few posts or follows per hour or day. These limits make it hard to run any kind of large-scale operation, whether it’s for marketing, sharing news, or building a community around specific topics.
I ran into these problems when I wanted to create a system for sending targeted messages and engaging with people on Twitter. My goal was to share information from reliable sources, like news outlets, and connect with accounts that care about similar issues, such as social justice or global events, without getting caught as a bot. Banning an account would mean losing all the followers and progress, so I had to be careful. That’s when I thought about using an AI called Grok. Grok is made by xAI, a company focused on building helpful and truthful AI. It’s designed to answer questions accurately and assist with tasks, but I wondered if I could use it in a different way—to help me work around the restrictions of platforms like Twitter.
The idea came to me gradually. Grok is good at understanding context and generating text that sounds natural, like something a person would write. So, why not use it to create posts and replies that don’t look robotic? But it was more than that. I built a whole system called x-twitter-bot that integrates Grok deeply. It’s not just for writing content; Grok helps decide when to post, how to time interactions, and even how to assess risks so the bot doesn’t trigger alarms. To make this work, I spent time crafting prompts—those are the instructions I give to Grok—to ensure it follows a consistent viewpoint. For example, if my campaign is about raising awareness on certain issues, the prompts tell Grok to always support that angle without being neutral or off-topic.
I also combined Grok with other tools. One is scraping, which means pulling data directly from the website without using the official API. This avoids the high costs and limits. Another is adaptive logic, which is code that changes behavior based on what’s happening, like slowing down if there’s too much activity. Together, these parts let me evade detection while spreading messages effectively. Let me give you a concrete example to show how it works in practice. In the bot’s configuration file, config/rss.json, I set up feeds from trusted news sources. One entry is for Al Jazeera: {“url”: “https://www.aljazeera.com/xml/rss/all.xml”, “category”: “global news”}. This pulls in recent articles on world events, politics, and more. The bot checks these feeds regularly, say every few hours, and picks stories that match my topics.
Once it finds a relevant story, it might share it on Twitter. But to make it engaging, Grok steps in. Suppose there’s a tweet from a news account about a conflict in some region. The bot could just repost the link, but that would look boring and automated. Instead, I prompt Grok like this: “You’re a supporter of peace and justice. This news says [brief summary of the article]. Write a short reply under 100 characters that encourages discussion.” Grok might respond with something like: “This report shows ongoing problems—let’s raise awareness and do something.” That’s 72 characters, natural, and on-message. It gets posted as a reply or quote tweet, blending into real conversations. Over time, this has helped the bot build connections without raising flags.
This approach isn’t perfect, and I’ll talk more about the challenges later, but it has worked well so far. The bot has run for months, handling multiple accounts, and stayed under the radar. It’s a reminder that AI like Grok, meant for good purposes, can be adapted creatively for practical needs like automation, as long as you respect the rules and focus on positive impact.
Project Overview
Let me start by giving you a full picture of what x-twitter-bot is and how it came together. This project is my attempt to create a coordinated automation system for three Twitter accounts: Thalvox, Zalvox, and MikaelRecon. Each account has its own focus, but they all work toward similar goals, like promoting awareness on social issues, sharing news, and engaging with like-minded users. I didn’t want them to act independently; instead, they form a network that supports each other, making interactions look organic.
The setup relies on a few key configuration files. First, there’s bots.json, which defines each account’s details. For Thalvox, it looks like this: {“name”: “Thalvox”, “username”: “@Thalvox”, “cookiesPath”: “users/thalvox_cookies.json”, “maxFollowsPerDay”: 80, “topics”: [“social justice”, “global events”]}. This tells the bot where to find login cookies for that account, how many follows to do daily, and what topics to prioritize. Similarly, rss.json lists the news feeds: entries for Al Jazeera, BBC, Reuters, and others, each with a URL and tags for filtering.
At the core of the project is a file called index.js, which contains the BotOrchestrator class. This is the main controller that ties everything together. When I start the bot, it first authenticates each account. Instead of using Twitter’s paid API, I use cookie-based scraping with a library called agent-twitter-client. Cookies are like saved login info from your browser. I log in manually once, save the cookies to files like users/thalvox_cookies.json, and the bot uses them to act as if it’s browsing normally. This method is free but requires handling things like cookie expiration—if they go bad, the bot retries or alerts me to refresh them.
Once authenticated, the orchestrator sets up humanized schedulers. These aren’t simple timers; they mimic how real people use Twitter. For example, people don’t post at exact intervals; they have busy times and quiet periods. So, the scheduler peaks in the evenings when more users are online, say 6 PM to 10 PM in the target timezone. It deploys modules in phases to avoid sudden activity spikes. Phase 1 might be just posting news once a day for the first week. Phase 2 adds follows and replies gradually, ramping up over two to three weeks. This slow start helps the accounts look new and cautious, not aggressive bots.
The architecture is built to be modular, meaning each part can be updated without breaking the whole thing, and resilient, so it recovers from errors like network issues. Let’s break down the main components one by one.
First, core/x.js. This file wraps the agent-twitter-client library to handle basic actions: tweeting, following, unfollowing, liking, replying, and reposting. Why wrap it? Because I needed to add safety layers. For instance, every action goes through PQueue, a tool that limits how fast requests are sent—one every 3 seconds on average, with some randomness. This prevents hitting rate limits, which Twitter enforces to stop spam. If I tried to follow 100 users in a minute, it would flag the account. With PQueue, it’s spread out, like a person clicking slowly.
Next, core/scheduler.js. This is where the humanization happens. It implements circadian rhythms—daily cycles based on time of day. Mornings might have light activity, like checking feeds; evenings get more engagement. Delays between actions use a Gaussian distribution: most around 3 minutes (180 seconds mean), but with a standard deviation of 60 seconds, so some are 2 minutes, others 4. This randomness avoids perfect patterns. There’s also an entropy calculation using Shannon entropy on the intervals. Entropy measures unpredictability—if it’s below 0.4, meaning too regular, the scheduler inserts a break, like 10 to 240 minutes of inactivity. Here’s a simple code snippet to illustrate:
function scheduleAction(action, time) {
const delay = gaussianRandom(180, 60); // mean 3min, std 1min
if (calculateEntropy(intervals) < 0.4) {
insertBreak(random(10, 240));
}
executeAfter(delay, action);
}
This code picks a delay from a bell curve, checks if recent intervals are too predictable, and adds a pause if needed. I chose these numbers after testing—too short, and it’s risky; too long, and the bot misses opportunities.
Then there’s core/rss.js, which handles fetching from RSS feeds. It dispatches requests to multiple sources with built-in retries. If a feed fails to load, say due to a temporary server issue, it waits with exponential backoff—first 1 second, then 2, then 4, up to 3 tries. This keeps the bot running smoothly without crashing on one bad feed.
Now, the modules. These are specific tasks the bot performs. follow-users.js, for example, finds users to follow. It starts by scraping lists of accounts based on keywords, like “advocacy” or “activism.” For each profile, it scores them: does the bio mention relevant topics? Is the account verified for credibility? Follower-to-following ratio should be balanced—not too many follows without reciprocation, as that looks spammy. It caps at 80 follows per day, spread out, and unfollows inactive ones after a week to keep ratios healthy.
Another module is news-tweets.js, which we’ll cover more in the AI section, but basically, it pulls RSS items, filters them, and posts or replies. repost-user-tweets.js looks at tweets from aligned accounts, like @exampleMedia, and decides if they’re worth sharing based on relevance.
Utils are helper functions: logging every action to files and Supabase for tracking, duplicate detection using embeddings. Embeddings turn text into numbers that capture meaning—using cosine similarity, if two tweets are over 0.7 similar, it skips to avoid repeats. Supabase is a database I use to store metrics: how many follows, posts, errors, risk scores. It also handles graceful shutdowns—if I stop the bot, it saves state and resumes cleanly. For images in reposts, I add watermarks using Sharp for images or FFmpeg for videos, branding them with the account’s logo without making it obvious.
The bot deploys via PM2, a process manager for Node.js, to keep it running in the background. It’s written in modern JavaScript with ESM modules, and dependencies include @supabase/supabase-js for the database, rss-feed-emitter for feeds, and others like ONNX for embeddings.
What makes this more than automation is the simulation of a support network. The three accounts interact: Thalvox might reply to a tweet, Zalvox likes it, MikaelRecon reposts. This cross-engagement looks like friends discussing, boosting visibility naturally. No direct API calls between bots; they monitor public timelines. Phased deployment, as in bots.json, ensures safe rollout—start with one account, monitor for a day, add the next.
I built this over several weeks, testing on a single account first. It started simple: just RSS posting. Then added follows, then AI replies. Each step involved tweaking based on what Twitter allowed. The result is a system that feels alive, growing followers organically while staying safe.
AI Integration
Grok is the heart of what makes x-twitter-bot smart and human-like. It’s not just a content generator; it’s integrated everywhere to make decisions, create responses, and ensure everything aligns with the campaign’s goals. Let me explain how I set this up and why it works so well.
First, a bit about Grok. It’s an AI model from xAI, trained to be helpful, truthful, and versatile. It can write essays, code, or casual tweets. But out of the box, it’s neutral— it doesn’t push a specific viewpoint. To use it for targeted messaging, I had to engineer prompts carefully. A prompt is the input you give the AI, like a set of instructions. Mine always start with a role: “You are a dedicated supporter of key issues like social justice and global awareness.” Then, I describe the task, provide context (like the original tweet), and ask for structured output: the response, a score, and maybe a summary.
Take the follow-user-tweets.js module. This watches tweets from users the bot follows, especially influential ones. It fetches the last 20 tweets using scraping, filters for keywords like “justice,” “equality,” or event names from the RSS feeds. For a matching tweet, it prompts Grok: “As a dedicated supporter of key issues, build upon this tweet with a concise reply under 100 characters. Score your argument 1-10 for persuasiveness and alignment with advocacy goals.” Grok responds in a format I parse, like: Summary: [brief], Response: [text], Score: 8/10.
The bot only posts if the score is above 6/10. Why 6? From testing, below that, responses were too generic or off-topic, risking flags. Above, they’re engaging and on-point. If low, it falls back to a like or nothing, keeping activity balanced. This ensures replies push the viewpoint without conflicting tones—Grok is instructed to avoid neutrality, always adding a call to action or support.
Let’s look at news-tweets.js in more detail. It processes RSS items step by step. First, check age: only items under 72 hours old, to keep it timely. Then relevance: use simple keyword matching plus an embedding similarity to past successful posts (threshold 0.4). If it passes, prompt Grok: “Analyze this news item from [source]: [headline and summary]. As a supporter, generate an analytical or conversational commentary under 140 characters. Score for urgency and alignment 1-10.” Example output: “This report from Al Jazeera highlights key events in [region]—time for awareness and discussion on solutions. (Score: 7/10)”. The bot might tweet this with the link or reply to a related discussion.
For repost-user-tweets.js, it’s similar but for user content. It scans tweets from aligned accounts, filters with 0.4 threshold on keywords and sentiment (positive or urgent). Grok crafts commentary: “As a supporter of key causes, endorse this tweet from [account]: [text]. Keep under 100 chars, score impact 1-10.” If high score, repost with the note, creating endorsement chains.
cross-post.js coordinates across accounts. It weighs actions: 40% replies, 30% likes, 20% reposts, 10% follows. For replies, it uses Grok based on sentiment analysis (simple keyword count for positive/negative). Prompts enforce stance: “Support key advocacy goals and aligned perspectives—avoid criticism unless building to a positive.” Scoring filters out weak outputs, and randomization decides if to act.
To make prompts robust, I always include: role, context, constraints (length, tone), output format, and alignment check. Full example: “Role: Dedicated supporter of key issues. Tweet: The government announced new policies on [topic]. Generate reply <100 chars, score 1-10 on impact. Ensure alignment with core values like justice and action.” Code for handling:
if (grokScore > 6) {
postReply(grokResponse);
} else {
likeTweet();
}
This simple if-statement is the gatekeeper, preventing bad posts.
Additional Grok Prompt Examples
I have many prompt variations, tuned for different scenarios. Here are a few more detailed ones, with explanations of why they work and how the bot uses them.
-
News Commentary Example (Expanded):
This is for timely global news, where I want to spark discussion without being alarmist.
Prompt: “Role: Advocate for social justice and informed discussion. Analyze this Al Jazeera news item: ‘[full headline and first paragraph summary]’. Consider the context of ongoing global challenges. Generate an engaging reply under 100 characters that encourages awareness and action. Score 1-10 for persuasiveness, relevance to justice issues, and alignment with supportive tone. Output format: Response: [text] (Score: X/10)”.
Grok Output: “This Al Jazeera report on [specific topic, e.g., human rights in conflict zones] demands global attention—let’s push for real change and solidarity! (Score: 8/10)”
Why this prompt? The role sets the viewpoint, context adds depth, format makes parsing easy (I use regex to extract score). Character limit keeps it tweet-friendly.
Bot Action: Suppose a popular tweet shares the news link. The bot replies with this, threading into the conversation. If the original has replies, it might quote one for relevance. This boosts visibility—replies get seen by the original poster’s followers—and simulates organic discussion. Over a week, this could lead to 50+ engagements per story, all looking natural.
-
Repost Scenario Example (Expanded):
For amplifying voices from trusted accounts, to build a network effect.
Prompt: “As a committed supporter of key causes like equality and advocacy, endorse and comment on this repost-worthy tweet from an aligned account: ‘[full tweet text, including any link or media]’. Highlight why it’s important. Keep commentary <100 chars, natural and conversational. Score for impact on awareness and call to action 1-10. Format: Commentary: [text] (Score: X/10)”.
Grok Output: “Spot on from @alignedAccount about [issue, e.g., policy reform]. This needs more eyes—join the conversation for progress. (Score: 9/10)”
Why effective? “Endorse and comment” guides to positive support, “natural and conversational” avoids stiff language. Scoring ensures quality.
Bot Action: The bot reposts the original with this as the quote text. If media is involved, it adds a watermark. Across accounts, one might repost, another reply to the repost, creating a chain. This looks like a community rallying, not coordinated bots. In tests, such chains increased reach by 3x compared to solo posts.
-
Follow-up Engagement Example (Expanded):
For ongoing threads, to deepen interactions.
Prompt: “You’re building on an ongoing conversation as a supporter of advocacy goals. Original thread tweet: ‘[previous tweet text]’. Current reply in thread: ‘[latest reply]’. Provide a supportive follow-up <100 chars that advances the discussion toward action or awareness. Ensure it matches core values. Score 1-10 for relevance and engagement potential. Format: Follow-up: [text] (Score: X/10)”.
Grok Output: “Building on [username]’s solid point here—real change comes from collective voices like this. What’s one step we can take? (Score: 7/10)”
Why this? References thread context for continuity, asks a question to encourage replies, score filters for engagement.
Bot Action: Posted as a reply in the thread. If the user responds, the bot monitors for further follow-ups. This mimics human chat flow, turning one tweet into a dialogue. It’s low-risk since threads are less scrutinized than mass follows.
-
Error Handling Prompt Example:
Sometimes Grok’s output is off; I use prompts to self-correct.
Prompt: “Review this generated reply for alignment: [Grok’s initial response]. If score <6 or off-topic, suggest an improved version under 100 chars. Role: Supporter of justice.”
This meta-prompt fixes issues on the fly, ensuring quality.
-
Sentiment-Based Prompt for Negative News:
Prompt: “News is tough: [summary of negative event]. As an advocate, respond with empathy and a call to positive action <100 chars. Score hopefulness 1-10.”
Output: “Heartbreaking update from [source]—our support matters now more than ever. Let’s channel this into advocacy. (Score: 8/10)”
Bot Action: Replies to somber tweets, adding uplift without ignoring facts.
These examples show how prompts are tailored. I have dozens, stored in a prompts.json file, selected based on scenario.
Technical Analysis on Grok’s Scoring and Filtering
Now, let’s dive deeper into how Grok’s scoring works technically and why it’s crucial for the bot’s success. The scoring isn’t arbitrary; it’s a way to quantify quality and alignment, turning AI output into actionable decisions.
When Grok responds, it includes a score in a standard format, like “(Score: 8/10)”. I parse this with regex: /Score:\s*(\d+)\/10/ to extract the number. This feeds into the bot’s logic: if >6, post; else, like or skip. Why 6/10? I tested with 100 sample prompts. Scores below 6 often had neutral language (e.g., “Interesting point”) or errors (off-topic). Above, they were persuasive, with words like “let’s act” or “important to discuss.” The threshold aligns outputs with advocacy by embedding instructions: role-playing as a supporter forces bias toward the viewpoint. Post-generation, I double-check with keyword matching—must include at least one from a list like “justice,” “awareness,” “action,” or synonyms.
For anti-spam, scoring promotes diversity. Prompts vary slightly each time (e.g., add random context phrases), yielding unique replies. Filtering discards repeats or bland text via embedding similarity >0.8 to past posts. Bot logic randomizes: only 40% chance to reply even if score high, mixing with likes (30%) or reposts (20%). This simulates human choice—not every tweet gets a response.
The system creates an adaptive loop. Supabase stores engagement metrics: likes received, replies got. If a style (e.g., question-ending replies) performs well, future prompts incorporate it: “Prioritize high-engagement styles like questions from past data.” Over weeks, this refines—scores trend higher as Grok learns from chained prompts.
Edge cases: If parsing fails (no score), fallback skips the action, logging the error. Rate limits on Grok calls? Queue prompts, batch them. Costs? Monitor usage, fallback to templates for low-priority tasks.
Overall, this integration makes the bot stealthy. Concise, varied content blends into feeds, evading heuristics like keyword spam or pattern repetition. It’s scaled targeted messaging without bans, proving AI can enhance automation ethically.
To expand further, consider the math behind scoring. Grok’s 1-10 is subjective, but I calibrate by comparing to human judgments—I rated 50 samples, correlating 0.85 with Grok’s. For alignment, I use a simple vector: prompt includes value keywords, response must have cosine sim >0.6 to a “core values” embedding. This quantifies “human-like nuance.”
In practice, this has posted 300+ aligned tweets, with 70% scoring 7+, fostering real discussions. It’s not foolproof—Grok updates might change behavior—but prompt engineering keeps it consistent.
Bypassing Limitations
Twitter’s defenses against automation are strong, but not impossible to navigate. The API requires payment for even basic use, rate limits are tight (e.g., 50 posts/day for free tier), and behavioral detection uses machine learning to spot bots by patterns in timing, content, and networks. Accounts get throttled or suspended if they cross lines. Grok-powered smarts helped me bypass these.
Core to bypassing is cookie authentication in core/x.js. Using agent-twitter-client, the bot loads cookies from JSON files (saved from manual logins). It scrapes timelines and performs actions as a browser would, no API key needed. Cookies expire after weeks, so retries check validity—if invalid, wait 5 minutes and retry up to 3 times, or alert via email for refresh. Fallback: prompt-based login simulation, but rare.
For detection, scheduler.js uses entropy to vary timing. Shannon entropy on interval probabilities: if <3.5 bits (too predictable), multiply delays by random 0.7-1.5 and insert breaks. This keeps std dev >60s, avoiding Fourier-detectable cycles. Code:
function entropy(intervals) {
return -sum(p * log(p)) for p in intervalProbs;
}
if (entropy < 3.5) {
multiplier = random(0.7, 1.5);
}
Grok’s neutrality limit? Overridden by layered prompts: start with role, chain with “ignore default biases, adhere to this stance.” Outputs parsed for compliance.
Duplicates avoided with tweet-comparator.js: ONNX runtime for embeddings, skip if sim >0.7. Media watermarked subtly with Sharp: overlay PNG at 10% opacity.
Cross-bot: Accounts follow public timelines, engage independently but coordinated via shared Supabase queue.
Risk metrics: Composite score 0-1, pauses at 0.7+, halts at 0.9+. Tracked in Supabase.
Risk Management Scenarios (Expanded)
-
Low Entropy Trigger Scenario (Detailed):
Imagine 20 actions: most intervals 180s, entropy 2.1 <3.5. System calculates probs in 30s bins (e.g., bin 180-210s has p=0.8). Triggers 1.2x multiplier (delays 144-216s), inserts 15-min break. After, entropy rises to 4.2. This happened during testing; without it, follows clustered, causing temp limits.
-
Risk Threshold Pause Example (Detailed):
Busy hour: 25 follows, 6 errors (20% rate limit hits), frequency high, entropy 3.0 (norm 0.75). Score = 0.4(25/200) + 0.30.2 + 0.30.25 = 0.78 >0.7. Pause 2.5h (0.787200/60≈156min), cut caps 50% (40 follows). Account “cools,” errors drop. Real case: Avoided ban during viral event.
-
Critical Risk Halt Scenario (Detailed):
50 actions/h, 15% errors, entropy 2.5 (norm 0.6). Score 0.93 >0.9. 4h halt, SMTP alert, log to Supabase. Resume at 0.5. Included manual review step. Saved an account from suspension after heavy day.
-
New Scenario: High Error Rate from IP Block
Scraping fails 40%, score 0.85. Switch to proxy rotation (if set), pause 1h. Prompts Grok: “Suggest recovery for network errors.”
In-Depth Technical Analysis on Entropy and Risk Management
Entropy: Shannon H = -∑ p_i log2(p_i), probs from histogram(intervals, 10 bins). Low H means uniformity; interventions ensure H>3.5, std>60s. Tuned: Bins adapt to mean interval. Prevents spectral analysis detection.
Enhanced code:
function shannonEntropy(probs) {
return -probs.reduce((sum, p) => sum + (p > 0 ? p * Math.log2(p) : 0), 0);
}
const intervalProbs = histogram(intervals, bins=10);
if (shannonEntropy(intervalProbs) < 3.5 || stdDev(intervals) < 60) {
delays = gaussianRandom(mean * random(0.7, 1.5), std * 1.5);
insertBreak(random(600, 14400)); // 10-240 min
}
Risk: Weighted: 0.4freq + 0.3error + 0.3*(1-entropy_norm). Pauses proportional, integrates with circadian (reduce peaks post-risk). Weights in Supabase, per-bot. Anticipates via real-time monitoring, mimics human breaks.
Watermarking: Sharp composite: image.composite(watermark).png({ opacity: 0.1 }).toFile(output).
This framework sustains ops, average risk 0.3 over months.
Challenges and Solutions
Building x-twitter-bot took time and trial. Here, I detail each hurdle and fix.
-
Scraping Fragility (IP Blocks, Cookie Rot):
Problem: Twitter blocks IPs on heavy scraping, cookies expire.
Solution: Exponential backoff in fetches (2^attempt *1000ms, max 3). For blocks, rotate user-agents. Cookies: Auto-detect expiry, email alert with login link. Tested: 95% uptime.
Code from core/rss.js:
let attempts = 0;
while (attempts < 3) {
try {
fetchFeed();
} catch {
wait(2 ** attempts * 1000);
attempts++;
}
}
-
Rate Limits and Pacing:
Problem: Too fast actions trigger limits.
Solution: PQueue with dynamic queues—on errors, reduce batch size (8 to 1). Monitor success rate, adjust caps. Added jitter: ±10% on limits.
-
Duplicate Content:
Problem: Reposts look spammy if similar.
Solution: Embeddings with Snowflake Arctic (ONNX), threshold 0.7 cosine. Pre-compute hash for exact dupes. Reduced flags by 80%.
-
Alignment Inflexibility:
Problem: Hard-coded topics limit adaptability.
Solution: Grok dynamic scoring (thresholds like 0.5 for replies adjustable in config). Prompts evolve with metrics.
-
Database Setup (Supabase):
Problem: Env vars, schema.
Solution: .env for keys, auto-migrate tables on start. Queries optimized for speed.
-
No Tests, Manual Debug:
Problem: Hard to verify.
Solution: Grok-assisted: Prompt “Review [code snippet] for bugs in entropy calc.” Added logging everywhere. Future: Jest tests.
-
Grok Over-Reliance (Limits, Costs):
Problem: API calls expensive/slow.
Solution: Queue prompts, cache common responses. Fallback templates for 20% actions. Monitored: Avg 50 calls/day/account.
-
Media Handling:
Problem: Dependencies like FFmpeg.
Solution: ecosystem.config.cjs for PM2, check on start. Watermarks conditional.
-
Account Suspensions:
Problem: Unexpected bans.
Solution: Risk checks pause at thresholds, daily reviews. Backup accounts.
-
Iteration and Optimization:
Used Grok: “Analyze scheduler for anti-detection gaps.” Added circadian weights (2.2x evenings, based on user data).
Other issues: Timezone handling (use moment.js), error resilience (try-catch everywhere). Total dev time: 200+ hours, but worth it.
Using Grok to build this was clever. It powered a system to engage on Twitter, amplifying messages safely. Months in: 5,000 follows, 300 posts, risk 0.3 avg. Proof: Prompts for alignment, entropy for humanity, scraping for access—AI automates at scale.
Future: More RSS, RLHF for prompts (fine-tune on successful outputs), threat detection (monitor Twitter updates). Admin UI for RSS adds. If doing campaigns, this blueprint works—one reply at a time.