So, yeah, we built X_bot just for fun!!!
A tiny content scout running on an old Raspberry Pi.
It does not just “find links.”
It scans topics, extracts articles, checks relevance, scores credibility and interestingness, writes X drafts, sends everything to Telegram for review, and only then helps publish.
After 3 days: $0.16 total OpenAI cost.
The bot starts from configured themes: clean energy, renewables, energy efficiency, heat pumps, triathlon, endurance training, shooting sports, long-range shooting, ballistics, and business finance.
Each topic has its own keywords and RSS sources. One big feed cannot dominate because candidates are round-robin selected across sources.
Every scan fetches RSS candidates, cleans tracking URLs, skips already-seen links, detects near-duplicate titles, downloads the article, extracts the readable body, canonical URL, source, author, date, excerpt, and og:image preview metadata.
So Telegram receives a candidate with context, not internet noise.
Before scoring, every article goes through a topic-relevance gate.
Triathlon needs real triathlon/IRONMAN/swim-bike-run signals.
Ballistics needs model/data/validation signals.
Shooting needs competitive rifle/pistol/shotgun context.
Energy needs grid, storage, solar, wind, efficiency, HVAC, etc.
This kills spam, politics, promo junk, and off-topic feed drift.
Then scoring happens.
The bot asks OpenAI for strict JSON: credibility, evidence quality, novelty, relevance, interestingness, overall score, notes, action, and rejection reason.
But it also has a deterministic fallback: reputable domains, author/date, body length, metrics, primary-source terms, hype penalties, affiliate penalties.
Cautious by design.
Candidates must pass thresholds before they become postable.
Default gate: credibility >= 7 and interestingness >= 7.
Rejected candidates are still stored with reasons. Pending candidates get drafts.
The local DB already has 263 candidates, 360 drafts, 10 posted/marked posts, and 142 learned interest signals.
Drafting is not “summarize this article.”
The prompt asks for an English X Premium-style practitioner take: concrete problem first, sober insight second, URL included, no hype, no “game changer,” no generic AI tone, no markdown bold, no invented facts.
Fallback writers exist per topic when OpenAI is unavailable.
Telegram is the control room.
For each candidate it sends: title, source, topic, URL, status, problem, solution, credibility score, interestingness score, notes, draft, and preview image metadata.
Buttons: Open X compose, Mark posted, Reject, Regenerate, Prev, Next, Open article.
You can also paste any link into Telegram and it reviews it manually.
Posting is intentionally safe.
Default mode is manual_intent: Telegram opens X composer with the selected draft already filled in. After publishing, you tap “Mark posted.”
Then the bot records the post, prevents repeats, and learns from it.
Direct X API posting exists, but only behind approval and explicit flags.
The bot learns only from what was actually posted.
After a post, it records topic, source domain, and concrete phrases like “solar capacity,” “heat pump,” “swim bike run,” “battery storage.”
Future scans get a small ranking boost for similar narrow themes.
No X scraping. No likes. No follows. No engagement farming.
One real scan checked 19 feeds, found 160 candidates, interest-ranked the pool, skipped duplicates and irrelevant stories, stored 5 serious candidates, kept 4 pending, and sent the best one to Telegram.
That is the part I like: tiny infrastructure, real editorial workflow.
After 3 days of running, total OpenAI spend was $0.16.
Sixteen cents.
On an old Raspberry Pi.
The interesting AI product here is not a giant agent. It is a small, stubborn, cheap system with taste, memory, filters, and a human approval loop.
Small bots are back. This time they have judgment.
If you want to know more, just ask... 😀