OpenPAWS Internship Work Test  ·  March 2026

News Opportunism
Engine

Monitors live news for animal agriculture stories, classifies each by advocacy angle, scores urgency, and generates publication-ready content — all in under 2 minutes.

5
News APIs connected
13
RSS feeds monitored
30+
Keywords tracked
<2 min
Story to content

The problem this solves

Most animal advocacy organizations run lean — a comms team of one or two people. When a major story breaks, like a bird flu outbreak or an undercover investigation dropping, the window to respond is 24 to 48 hours. After that, the news cycle moves on.

Most organizations miss it. Not because they don't care, but because drafting a tweet thread, press statement, and op-ed pitch from scratch takes hours they don't have. This tool is built for that exact problem.

OpenPAWS News Engine
Dashboard Screenshot

Main dashboard — story feed on left, content panel on right with angle and urgency badges. Real-time news aggregation from 4 APIs and 13 RSS feeds with AI-powered classification.

Three stages, one pipeline

Every story passes through the same pipeline — fetch, classify, generate. Each stage is a separate service so any part can be upgraded independently.

1

Fetch — multi-source news aggregation

Pulls from 4 free APIs (GNews, Currents, NewsData, NewsAPI) and 13 curated RSS feeds simultaneously. Every article is filtered through a 30+ keyword list before classification so the AI is not wasting calls on irrelevant content. Results are deduplicated by title similarity and sorted newest-first. A 15-minute in-memory cache prevents burning through free API quotas.

2

Classify — Gemini assigns angle and urgency

Each story is sent to Gemini with a structured prompt defining all 5 advocacy angles and a concrete urgency rubric. Gemini returns a JSON object containing the angle, a 1–10 urgency score with reasoning, 3 key facts, and the single strongest advocacy hook sentence. Up to 20 stories are classified per fetch with a 350ms delay between calls to avoid rate limits.

3

Generate — one click to publication-ready content

On demand, Gemini generates three pieces of content: a 5-tweet thread written as a connected narrative, a press statement with headline, lead, body, quote placeholder, and boilerplate, and an op-ed outline with 5 standalone talking points, a suggested opening line, and outlet recommendations. All content targets under 30% editing before it is publishable.

Content Panel
Content Panel Screenshot

Generated content panel — tweet thread, press statement, and op-ed tabs with one-click copy. AI-generated advocacy content ready for immediate publication with minimal editing required.

The five advocacy angles

Gemini picks the angle with the highest advocacy potential for each specific story. The same story can often be framed multiple ways — the angle determines how the content is written.

Public health
Disease outbreaks, food safety crises, antibiotic resistance, H5N1, zoonotic threats
Economic
Industry losses, subsidies, company earnings, market shifts, trade
Environmental
Methane emissions, deforestation, CAFO runoff, water pollution, land use
Welfare
Animal cruelty, investigations, confinement conditions, slaughter practices
Policy
Legislation, EPA regulations, court cases, farm bill, government action

7 days of real news

Ran the engine against live feeds for 7 days. 28 relevant stories fetched, 20 classified, 20 pieces of content generated.

Story Angle Urgency
Global livestock methane emissions reach new high Environmental 6/10
Tyson Foods posts quarterly losses tied to avian flu Economic 7/10
Antibiotic-resistant bacteria found in supermarket chicken Public health 8/10
UK government rejects proposed cage-free egg legislation Policy 7/10
Amazon deforestation reaches 15-year high driven by cattle ranching Environmental 6/10
Smithfield Foods recalls 200,000 pounds of pork due to contamination Public health 8/10
Press Statement · H5N1 Story
Generated Content Screenshot

Generated press statement for H5N1 dairy cattle story — ready to send with only spokesperson name to fill in. Professional advocacy content formatted for immediate media release.

Where the news comes from

Four free APIs combined with 13 curated RSS feeds. Even with no API keys at all, the RSS feeds alone pull real, relevant stories with no rate limits and no cost.

Source Free limit Best for Where to sign up
GNews API 100 req/day Breaking news, outbreaks, H5N1 gnews.io
Currents API 600 req/day Environment, climate, policy stories currentsapi.services
NewsData.io 200 req/day Welfare, investigations, cruelty newsdata.io
NewsAPI 100 req/day Economic, company stories (Tyson, JBS) newsapi.org
RSS Feeds Unlimited CDC, Guardian, Civil Eats, Reuters, PETA, Humane Society and more No key needed

Currents API has the best free tier by far — 600 requests per day covers continuous monitoring without ever hitting limits. Signing up takes about 2 minutes.

What it is built with

Backend
Node.js 18+
Express.js
rss-parser
axios
Frontend
React 18
Tailwind CSS
Vite
Custom hooks
AI
Google Gemini
gemini-1.5-flash
Structured JSON prompts
News sources
4 free APIs
13 RSS feeds

Problems and how I solved them

Real issues that came up during development — not a polished summary. Each one required iteration to get right.

Problem

Gemini classifying unrelated stories

Without keyword filtering, Gemini would classify anything from the RSS feeds — sports news, tech stories, politics — and waste API calls on completely irrelevant content.

Solution

Pre-filter before classification

Added a 30+ keyword list in fetcher.js that runs on every article before it reaches Gemini. Only animal agriculture stories get classified. Reduced wasted API calls by around 80%.

Problem

Urgency scores were all 7 to 9, nothing low

The first version of the classifier prompt was too vague about urgency. Gemini defaulted to "high" for everything because the definition was not concrete enough.

Solution

Time-based scoring criteria

Rewrote the urgency rubric to tie each score to a specific time window — 10 means breaking today, 8–9 means past 48h, 6–7 means past week. Scores now spread across the full 1–10 range.

Problem

Same story appearing 3 to 4 times

The same story would appear multiple times when pulled from different sources — for example a Reuters article republished by RSS feeds and also returned by NewsAPI.

Solution

Title-based deduplication

Added deduplication by normalizing the first 55 characters of each title — lowercase, non-alphanumeric characters removed. Handles around 95% of duplicates without needing a database.

Problem

Gemini returning invalid JSON

Occasionally Gemini would wrap responses in markdown code blocks or add an explanation sentence before the JSON, causing JSON.parse() to throw an error.

Solution

Explicit instructions and try/catch fallback

Added "Return ONLY valid JSON. No markdown. No explanation." to every prompt. Wrapped all parse calls in try/catch with a sensible default object so one bad response does not break the whole batch.

Problem

Free API limits hit during development

Burned through the GNews 100 req/day limit within an hour during testing by refreshing the frontend repeatedly while building the UI.

Solution

15-minute server-side cache

Added in-memory caching in server.js that stores classified stories for 15 minutes. The frontend can refresh freely without touching the APIs. Force-refresh available via ?refresh=true.

What is built

01

Urgency Alert System

Persistent dashboard banners with 24-hour response timers for breaking news stories scoring 8+ urgency.

02

Content History & Export

Auto-saves every generated tweet, press release, and op-ed for 1-click export to CSV or JSON.

03

Multi-Channel Push Alerts

Instant Slack, Discord, Email, and webhook drops to auto-notify your team of high-urgency stories.

04

Configurable Keywords

Quickly define, search, and toggle feed filters by category directly from the UI.

05

AI classification

Gemini assigns angle, urgency 1–10, key facts, and the best advocacy hook for every story.

06

3 content types

Tweet thread, press statement, and op-ed angles generated in one click per story.

Push Notifications
Push Notifications Integration

Push notifications integration with Slack, Discord, and custom webhooks for high urgency signals. Automated alerts ensure rapid response to breaking news stories with 8+ urgency scores.

Twitter/X Post Dashboard
Twitter/X Post Dashboard

Twitter/X integration for one-click publishing of generated tweet threads directly to social media. Seamless connection to social platforms enables immediate advocacy campaign deployment.

News Sources
News Sources Dashboard

News sources configuration showing API keys, RSS feeds, and real-time fetching status. Centralized management of 4 free APIs and 13 curated RSS feeds with customizable keyword filtering.

What to build next

Features that would make this genuinely useful beyond a demo — prioritized by real-world advocacy impact.

01

Browser Extension

A native extension that lets advocates instantly generate campaigns from any news article they are actively reading on the web.

02

Organization-Specific AI Personas

Upload past press releases so the AI natively learns and mimics your exact brand voice, cutting down manual edits to zero.

03

Vision AI Integration

Auto-extract images & undercover video frames from news sources to generate highly specific visual descriptions in press statements.

04

1-Click Publishing

Authenticate with Twitter/X and Mailchimp to push generated campaigns live directly from the dashboard.

05

Impact Tracking & Feedback Loop

Pull social engagement metrics (views/retweets) on generated content to create a self-improving AI generation cycle.

06

Global Multi-language Pipeline

Automatically ingest breaking non-English news (e.g. from Brazil/Asia) and localize campaigns for US advocates.