← back to projects
LIVE2025

Twitter AI Bot — Autonomous Growth Engine

The Twitter AI Bot is a Node.js automation engine that maintains a consistent, on-brand Twitter presence without manual effort. It uses Playwright with the stealth plugin to operate through a browser session (cookie-based auth), bypassing the need for Twitter API credentials entirely. A local Ollama LLM (llama3 by default, configurable) generates all content guided by a personality.json profile and a weighted rotation across five content pillars: backend systems, AI/LLMs, dev productivity, career/remote, and hot takes. Each tweet is also assigned one of five format types — short take, numbered insight, hot take, Gen-Z tone, or CTA — using a weighted random selection to keep the feed varied. A portfolio scraper fetches live content from buildwithkulshresth.com and triggers showcase tweets 20% of the time to surface real project work. Rate limiting enforced via JSON state files caps daily output and prevents aggressive posting patterns. A reply engine handles two engagement flows: home feed replies (contextual responses to people the account follows) and search-based replies (discovery via keyword tracking). Four cron schedules coordinate everything: tweets every hour 8am–10pm IST, home feed replies at 10am, search replies at 2pm and 7pm.

$ Architecture

  • Browser automation layer — Playwright + playwright-extra + puppeteer-extra-plugin-stealth. Persistent cookies.json session maintained via import-cookies.js. No official Twitter API credentials required; all interactions go through the browser DOM.
  • AI generation (ollama.js) — Ollama HTTP API at configurable endpoint (default localhost:11434). Weighted pillar selection (backend 25%, AI/LLMs 20%, dev productivity 20%, career 20%, hot takes 15%). Weighted format selection (short take 35%, numbered insight 25%, hot take 20%, Gen-Z 15%, CTA 5%). Prompt constructed from personality.json + pillar + format instruction. Startup health check aborts if Ollama is unreachable.
  • Posting pipeline (twitter.js) — Playwright navigates to Twitter compose, fills the tweet text, and clicks post. Random 1–4 minute pre-post delay jitter added after generation to avoid predictable timing patterns. 20–30% random skip rate per cron window for organic cadence.
  • Rate limiting (rateLimit.js) — daily tweet count stored in JSON state file. configurable maxPerDay cap enforced before every post attempt.
  • Topic tracker (topicTracker.js) — topic bank loaded from topics.json. Tracks which topics have been used in the current cycle; rotates to next cycle when all are exhausted. Cycle count and remaining count logged on each run.
  • Reply engine (replyBot.js) — runHomeFeedReplySession scans home feed for recent posts from followed accounts and generates contextual replies. runReplySession runs keyword-based search to discover and reply to relevant conversations outside the follow graph.
  • Portfolio scraper (portfolioScraper.js) — fetches live content from buildwithkulshresth.com, extracts project/blog items, feeds a random item into generateShowcaseTweet for a 20% chance on each posting cycle.

$ Tech Stack

Node.jsPlaywrightOllamanode-cronplaywright-extraStealth Plugin

$ Outcomes

Zero Twitter API cost — entirely browser-driven via Playwright stealth; works without API keys or developer account
Local Ollama LLM for generation — no OpenAI/Claude API bills; all inference runs on local hardware
Five weighted content pillars: backend systems, AI/LLMs, dev productivity, career/remote, hot takes — rotating for variety and reach
Five tweet format types with weighted selection: short take, numbered insight, hot take, Gen-Z tone, CTA — no two consecutive posts feel the same
Portfolio showcase mode: scrapes live site, generates tweets about real projects — 20% activation rate per posting cycle
Reply automation: home feed engagement (10am daily) + search-based discovery replies (2pm and 7pm) — two distinct conversation surfaces covered
Random skip rate (20–30% per window) + 1–4 minute post delay jitter — organic timing that does not look like a bot
Daily rate cap enforced via JSON state file — configurable maxPerDay hard ceiling
Topic cycle tracking: exhausts full topic bank before repeating, logs remaining count and cycle number on every run