64 days
of daily tracking, start to finish
6
kinds of public information on one screen
Every Monday
a digest emailed to the team

The situation

A campaign needs to know what is being said, by whom, and where the money is going. Checking social feeds, news, ad libraries, and finance filings by hand every day eats the hours a small team does not have.

What I built

  • A scheduled job collected both campaigns' public social posts, news coverage, and ad library entries every day, plus quick refreshes through the day, and flagged posts that looked like new endorsements.
  • AI tagged each post by topic (community, policy, endorsement, event, and so on), and ads were matched to posts to compare paid and unpaid reach, so trends showed up as charts instead of a feed to scroll.
  • Campaign finance reports were typed in from the filed paperwork, each number read several times and compared. Anything the readings disagreed on got a question mark so a person could check the original.
  • Results landed on a dashboard behind a password page and in a short email digest.

What I would do differently: the dashboard stored downloaded media alongside its code, and after the election that folder outgrew the hosting plan's size limit and quietly stopped updating the site. Media now belongs in separate storage from day one.

For your business

Point it at your own market instead: competitor pricing, online reviews, or new listings in your market, collected and summarized every morning.

Why custom

No dashboard product watches the exact sources a local race needs. This one pulled the specific social accounts, news, ad library entries, and campaign finance reports for this race, filtered out news about other districts, and emailed the team a digest every Monday morning. It answered their questions instead of a generic set of metrics.

Built with

Python · GitHub Actions · Claude (tagging) · Chart.js · GitHub Pages

Have a workflow like this?

Most projects scope in a 30-minute call. Tell me where the time goes.