How I Built an Autonomous X Reply Agent with GPT-5.4 and Zero API Costs
A solo founder's guide to building an autonomous X reply system using Codex CLI, bird search, Chrome CDP, and the humanizer pattern. Zero API costs via ChatGPT Pro.
I needed my product (vaos.sh) to show up in every conversation about OpenClaw memory problems on X. Manually finding and replying to tweets was eating 2 hours a day. So I built a system that does it autonomously.
The Stack
- Bird CLI — free X search using browser cookies (no paid API)
- Codex CLI — GPT-5.4 via my ChatGPT Pro subscription (unlimited tokens, $0 extra)
- Chrome CDP — browser automation for posting (bypasses X API restrictions)
- Supabase — event bus for tracking what's been replied to
- Humanizer rules — anti-AI-slop prompt engineering
Total cost beyond my existing ChatGPT Pro subscription: $0.
How It Works
Every 30 minutes, the system:
- Picks a random search query from 15 OpenClaw-related topics
- Searches X via bird CLI (free, uses browser cookies)
- Filters out tweets I've already replied to
- Sorts by engagement (likes + replies)
- Sends the tweet to GPT-5.4 via Codex with humanizer rules
- GPT drafts a reply under 180 characters that sounds like a tired builder texting at 2am
- Posts via Chrome CDP with the account already logged in
- Logs to Supabase event bus
The Humanizer Prompt
The key insight: LLM-generated replies sound like LLM-generated replies. The humanizer rules fix this:
- No significance inflation or promotional language
- No em dashes (the #1 AI tell)
- No chatbot phrases ("Great question!", "I hope this helps")
- Vary sentence length. Short punchy. Then longer.
- Have opinions. React, don't report.
- Sound like a person texting, not a brand
Example output: "Yeah, stuffing everything into MEMORY.md is a dead end. Context bloats, the agent gets dumb, and you spend half your time re-explaining the repo."
That reads like a human. Because the prompt told the LLM to write like one.
Results
Day 1: The system found and replied to a tweet with 127 likes and 32 replies. The reply was contextually relevant, under 160 characters, and sounded natural.
The system runs via macOS launchd (like cron but persistent). It survives reboots. No server needed.
What I'd Do Differently
- Add engagement tracking so the system learns which reply styles get likes
- Route replies through a Critic agent that rejects anything too promotional
- Add multi-platform support (LinkedIn, Reddit)
The code is part of the VAOS infrastructure at vaos.sh. The agent hosting platform gives your AI persistent memory and behavioral corrections — the same tech that powers this reply system.
Follow the build in public journey: @StraughterG