EagleEye is an automated outreach pipeline: it finds articles relevant to a client, identifies the author, locates a contact, drafts a personalized pitch, and — if the journalist replies — drafts the follow-up. A human approves every send.
A portfolio rebuild of a real client engagement, rewritten around a fictional outdoor-gear brand, Timberline Outdoor Co. The application runs locally only. This page is the only public-facing artifact.
Queries news and blog indexes for articles matching a topic brief.
RULESFetches each result under robots.txt rules and a per-domain rate limit.
RULESReads JSON-LD, meta tags and byline patterns — structural parsing, no model.
RULESMatches the extracted name against public staff pages and contact records.
RULESWrites a personalized email that cites the specific article and angle.
AIEvery draft waits in a queue for an explicit approve, edit or discard.
MANUALDelivery is hard-locked to a whitelist of test addresses at the code level.
RULESIf the journalist responds, drafts a contextual follow-up — also reviewed.
AI2 / 8
Steps that call a model
0
Emails sent without review
~72%
Author extraction hit rate
Local
Only place it runs
Most of the work was deciding where automation should stop.
The model drafts the outreach email and drafts replies. It never finds authors, never guesses contact details, and never decides who gets contacted — those are deterministic steps you can audit line by line.
Authors come from JSON-LD, meta tags and byline patterns. It misses, and the misses are visible: one run returned the outlet Ridgeline Review as the journalist's name, lifted from a byline that read “By Ridgeline Review Staff.” A model would have papered over that with a plausible guess.
Nothing runs on a schedule. Every run starts from a deliberate manual trigger and stops at hard caps on articles crawled, drafts generated and emails sent.
Real delivery is locked to a whitelist of test addresses in the send path itself, not behind a UI toggle. A demo cannot accidentally reach a real inbox, however the interface is driven.
Recorded locally · fictionalized data throughout
The app runs locally only and has never been publicly deployed — this page is the single public artifact. Source is on GitHub.
Built as hard controls
Documented as production gaps, not built
Twenty minutes, screen-shared, running locally — including the parts that fail.