Every morning at eight, an agent walks your competitors' pricing pages, changelogs, blogs, and job boards, compares them to yesterday, and posts what actually changed to Slack. When nothing moved, it stays quiet.
Five steps and a fork. Everything runs unattended, and the only thing that ever reaches a person is a digest worth reading.
A scheduled job fires every morning before anyone opens Slack. The time is configurable, and so is the competitor list — add or drop a name and the next run picks it up. That list is the entire human involvement in the system.
cron · configurable competitor listEach competitor's pricing page, blog, changelog, and careers page gets visited. Playwright handles sites that only render through JavaScript; static pages take a lighter path; and where an RSS or Atom feed exists it's parsed directly, which produces far cleaner diffs than HTML ever will. Hiring signals come from the company's own careers page — no LinkedIn dependency, nothing in grey territory.
Playwright · requests + BeautifulSoup · feedparserFresh content is compared against yesterday's stored snapshot. Most of what changes on a marketing page overnight is noise — rotated testimonials, timestamps, reshuffled boilerplate — and that gets filtered out before anything moves forward. Every snapshot is kept, so the archive doubles as a trend record.
PostgreSQL snapshots · noise filterEach surviving change gets a type: a price or packaging change, a feature launch, a shift in positioning, a hiring surge in one department. The type is what makes a digest scannable in fifteen seconds, and what makes patterns visible when you look back across weeks.
Claude API · change classificationThe classified changes are synthesised into one short brief. Every item says what changed, why it might matter, and links straight to the source, so anyone reading can verify a claim in a single click rather than taking the summary on faith.
Claude API · what changed / why it matters / sourceIf nothing notable happened, the run is logged and no message is sent. That restraint is the feature. A digest that arrives every single day gets muted inside a week; one that only arrives when something actually moved gets read every time.
Slack webhook · silent logEvery filtering choice in the pipeline — the noise gate on the diff, the classification step, the send-or-skip fork — exists to protect the same thing: the team's willingness to read the message when it does arrive.
Five signal types. Each one is a leading indicator of something a competitor hasn't announced yet.
Tier changes, listed prices, usage limits, what moved behind an enterprise call. You know the same day it happens rather than the week a prospect mentions it on a call.
Release notes, new feature pages, changelog entries. What shipped tells you what they prioritised, and how often it ships tells you how fast they can.
A rewritten headline is rarely cosmetic. It usually means a new target segment, a new category claim, or a story that stopped working.
Six engineers on a team that didn't exist last quarter is a roadmap. Hiring surfaces direction three to six months before anything is announced publicly.
A dip in review sentiment usually means a product problem in progress — which is a problem your sales team can speak to while it's still live.
One scheduled job, three ways of fetching a page, and a filter that decides whether a human hears about it.
One job, one time of day, no manual action. The only surface anyone touches after setup.
For pricing pages and apps that only assemble themselves once JavaScript has run.
Lighter and faster for pages that ship their content in the HTML. Used wherever a browser isn't needed.
Where a feed exists it's read directly. Structured entries diff far more cleanly than rendered markup.
Reads yesterday's snapshot, writes today's, and decides what counts as a change. Everything that survives the noise filter gets a type before it moves on. The snapshot history stays for trend analysis.
Synthesises the day's changes into a brief and posts it to the designated channel — or, on a quiet day, records the run and sends nothing at all.
Six modular blocks. Competitors, page types, and delivery channel swap per client; the shape of the run doesn't.
Starts the run once a day, unattended.
Three fetch strategies, chosen per page type.
Yesterday's copy of every page, kept for trends.
Separates real movement from page churn.
Sorts each change into a signal type.
Writes the brief, or decides not to send one.