Atriumbot Tweet Radar


Automated tweet monitoring with one-click engagement

Role: Automations Engineer, Atrium Academy
Client: Atrium Academy
Scale: 74 high-signal tweets, 592 total processed (so far)
Stack: n8n, Twitter/X API, Typefully API, Slack Block Kit, Claude Haiku

The Problem

Atrium runs the Uniswap Hook Incubator, and keeping the program visible means staying active on X. In practice that meant somebody watching the timeline for relevant activity from Uniswap, the Uniswap Foundation, partner protocols, and hook builders, deciding what was worth engaging with, and writing the quote copy when a post deserved more than a retweet. It's judgment work, it's easy to let slide on a busy day, and in a shared social channel there was no coordination, so two people could end up retweeting the same thing or nobody would because everyone figured someone else had it covered.

I built a bot that does the watching and a first pass of the judgment, then hands the team a short ranked list of tweets worth acting on with the action a click away in Slack.


What it does

Once a day it fetches new tweets from a set of monitored accounts, cleans and dedupes them, scores each one for relevance with Claude, and posts a formatted message into the social Slack (branded as Atriumbot) with action buttons on every tweet that clears the bar. Someone clicks Retweet, Like, or Quote Tweet without leaving Slack, and the message updates in place to show who took the action so the same tweet doesn't get worked twice.

Atriumbot showing some tweets that have exceeded its internal score threshold.

The monitoring pipeline

The daily run is a chain of n8n nodes, each doing one job:

Only fetch new tweets. A node pulls lastRunTime from the workflow's static data (with a hardcoded fallback on the first run) and feeds it into the start_time parameter on the X call, so every run only pulls tweets since the last one. Keeps the API bill down and the noise low.

Search on X. An HTTP Request node hits the recent-search endpoint on OAuth2. This was one of the trickier parts to get right. The native X node's After field won't accept expressions, so I couldn't drive it off the last run time, and bearer-token auth kept getting Cloudflare-blocked on n8n Cloud. OAuth2 through a plain HTTP Request node cleared both problems at once.

Process tweets. A bit of housekeeping before the expensive step. It flattens the API response, saves the current timestamp for the next run, dedupes identical tweets (the same RT can surface from several monitored accounts at once), and filters out plain retweets of Atrium's own posts.

Score with Claude. A Claude Haiku node scores each tweet 1 to 10 on relevance to UHI, hooks, and Uniswap v4, suggests an action (retweet, quote, comment, like), and drafts quote copy in our voice when a quote makes sense. I used Claude Haiku since this runs daily at volume and the task doesn't need a bigger model.

Build the message. The AI node overwrites its input, so the next node adds the original tweet text and ID back in, then assembles the full Slack message. The opener is tiered by the highest score in the batch and randomized for variety, so a high-signal post gets an opener that matches while a routine one gets a flatter line. Small thing, but it keeps the messaging in proportion to what's actually in the batch.

Post to Slack. After everything is filtered and scored, a typical day surfaces one to four tweets worth acting on.

The tweet monitoring half of the workflow in n8n. It uses a time based trigger for tweet fetching, with a lastRunTime log saved to prevent fetching already processed tweets.


The interaction layer

The buttons run through a second workflow triggered by Slack's interactivity webhook.

When someone clicks a button, the handler parses the payload to work out which button was clicked, on which tweet, by whom. It ignores View Tweet clicks (those just open a link) and rebuilds the message blocks with that tweet's button row swapped out for a confirmation line, something like 🐦 Retweeted by @Taylor. Only that tweet's row changes, the rest of the message keeps its live buttons. That in-place swap is how the coordination works: once a tweet is claimed, nobody else can act on it by accident.

The Quote Tweet path goes further. An IF node checks whether the click was a quote, and if it was, the workflow first posts to the Typefully API to create a draft loaded with Claude's suggested copy plus the tweet link, then updates the Slack message to confirm. So the marketer clicks once and a ready-to-review draft appears in Typefully with zero typing, and they can tweak it or publish as-is. Everything else just updates Slack directly.

The slackbot logic half, that edits the original Atriumbot post when buttons in the bot were clicked, and handles the RT and like via Twitter/X and QTs via Typefully


A deliberate call on the action buttons

Right now Retweet and Like open the pre-filled action on X so a person confirms every one, rather than firing it straight through the API. That's intentional. The plan was always to have the API perform the action outright once the scoring had earned enough trust to act unattended, and until then a human stays in the loop on anything that posts publicly. The Quote Tweet path already runs the full distance into Typefully, since a draft isn't a public action and doesn't need the same check.

When the retweet or like button is pressed, a URL is opened with the Twitter intent showing a final confirmation. This acts as a human-in-the-loop step, but can easily be fully automated via Twitter/X's API


Where it's headed

It's been running daily since the day I built it. The accounts it watches started with Uniswap and the Foundation plus a handful of partner protocols and hook builders, and the intent is to keep adding accounts as they become worth monitoring. The next steps are widening the net to catch any @mention of Atrium's own handle (so anything aimed directly at us gets surfaced too), and flipping the retweet and like buttons over to direct API execution now that the scoring has proven itself.

Create a free website with Framer, the website builder loved by startups, designers and agencies.