Intel Systems × Opera

Building an AI-Powered
Brand Intelligence System

How we built a fully autonomous monitoring pipeline
that scrapes 18 sources, analyzes sentiment, and delivers
daily briefings — in 5 weeks.

Sources
18
Daily Mentions
800+
Build Time
5 wks

The Problem

❌ Before
  • Manual Google Alerts — noisy, delayed, no sentiment
  • Social monitoring tools miss niche sources (forums, GitHub, Mastodon)
  • No editorial judgment — raw firehose of data
  • Competitor activity tracked in separate tools
  • No unified view for VP Brand
✅ After
  • One morning email with everything that matters
  • 18 sources scraped automatically at 07:50 CET
  • AI editor writes like a colleague, not a robot
  • Live dashboard with real-time data
  • Response suggestions for community engagement

The Pipeline

Five stages, fully autonomous. Runs every weekday at 07:50 CET.

📡
Scrape
18 sources
~800 mentions
🧠
Analyze
Sentiment
Categorization
✍️
Editor
AI editorial
judgment
📧
Email
HTML briefing
via Brevo
📊
Dashboard
Cloudflare
Pages + KV
bash python Gemini 2.5 Flash Cloudflare Workers Brevo API OpenClaw

Scraping 18 Sources

🌐 Social & Forums
X/Twitter (bird CLI)
Reddit (r/operabrowser, r/OperaGX, r/browsers)
Mastodon (fediverse search)
Lemmy (fediverse)
Hacker News (API)
Stack Overflow
📱 App Stores & Video
Apple App Store
Microsoft Store
YouTube (title search)
YouTube (transcript analysis) 🆕
TikTok
Medium
📰 News & Opera
Google News
Tech Press (Verge, Ars, etc.)
Opera Forums
Opera Press Room
Opera Blog
GitHub Issues
🎯 YouTube Transcript Analysis — Hidden Mentions
Many videos discuss Opera without mentioning it in the title. We download auto-generated transcripts and search for Opera mentions with false-positive filtering (excludes "operating system", "opera house", etc.). Result: 13 hidden mentions across 3.3M views — videos Jan would never find manually.

Scraping — How It Works

⚡ Parallelization
All 18 scrapers run in parallel via bash background jobs. Total scrape time: ~3 minutes. Each scraper outputs JSONL to a shared temp directory. A final merge step deduplicates by URL.
scrape_reddit &
scrape_youtube &
scrape_hn &
scrape_appstore &
wait  # All parallel
🛡️ Resilience
  • Rate limit handling — exponential backoff, per-source delays
  • Graceful failures — one source down doesn't kill the pipeline
  • Deduplication — URL-based merge prevents double-counting
  • Freshness filter — strict 48h window, checks actual date fields

The AI Layer

Where data becomes intelligence

When to Use AI vs. Code

The most expensive lesson: not everything needs an AI agent.

Task Approach Why
Scraping Bash scripts Deterministic. APIs don't need interpretation.
Sentiment analysis Keyword + heuristic Fast, free, 85% accurate. AI adds cost, not quality.
Executive Summary Gemini 2.5 Flash Requires editorial judgment, tone, narrative arc.
Detailed Analysis Gemini 2.5 Flash Structured analysis with thread tracking.
Response Drafts GPT-4o-mini Tone-matched replies. Cheaper model, good enough.
Email generation Python template HTML layout is deterministic. Only content is AI.
Dashboard React + static data Pure frontend. Data via Cloudflare KV.

The AI Editor

The most critical component. Reads all data, picks an angle, writes like a colleague.

🧠 What It Does
  • Reads 800+ mentions, all sources
  • Checks editorial memory — what did we cover yesterday?
  • Tracks active threads — ongoing issues that evolve day-to-day
  • Picks ONE editorial angle — no information overload
  • Writes Executive Summary in first-person conversational tone
  • Generates separate General + GX detailed analysis
🚫 Banned Patterns
  • "urgent" / "critical" / "crisis" / "alarming"
  • "escalating" / "erodes" / "undermines"
  • "really good" / "lots of love" / "genuinely"
  • Dense AI prose that covers everything
  • Mentioning data without linking to source
Every reference MUST be a clickable link. No exceptions.

Prompt Engineering

The tone instruction that changed everything

"Think of it as morning coffee with your best friend who also happens to be your boss. You're telling him what's up today — casually, honestly, and with good energy."

Key techniques
  • Explicit banned words — AI defaults to corporate tone. You must actively ban it.
  • Few-shot examples — Show 3 examples of good summaries. One positive day, one mixed, one with competitors.
  • Anti-examples — Show what NOT to write. "NEVER DO THIS: 'Opera faces a full-blown brand integrity crisis...'"
  • Editorial memory — Pass last 14 days of angles to prevent repetition.
  • Thread tracking — "This issue was first reported 3 days ago and is now affecting X users."
  • Link enforcement — Every claim must be a clickable HTML link. Post-process to force styling.

Preventing Quality Decay

The hardest problem in AI systems: how to keep output good on day 30, not just day 1.

📝 Editorial Memory
A JSON file that persists across runs:
  • recent_angles — last 14 angles (prevents "same story every day")
  • covered_topics — what we've already discussed
  • recurring_issues — issues that keep showing up
  • positive_stories — good stories we've highlighted
The editor reads this BEFORE writing. If yesterday was about logout bugs, today it picks a different angle.
🧵 Thread Tracking
Active issues are tracked as "threads" with:
  • First seen date
  • Mention count trend
  • Status (emerging → active → resolved)
  • Key developments per day
This lets the editor say: "The logout issue we first spotted on Monday now has 47 reports" — instead of treating each day as isolated.
✅ Lesson: State > Stateless
Without editorial memory, the AI will write the same summary every day. Persistent state across runs is what makes the system feel like a real editor, not a summarization API.

Why OpenClaw?

OpenClaw is the orchestration layer that ties everything together.

Feature OpenClaw Claude Code / Cursor
Persistent context Memory files, workspace Per-session only
Scheduled tasks Built-in cron External (crontab/CI)
Multi-channel output Telegram, WhatsApp, email Terminal only
Tool ecosystem 41 skills + MCP + custom File/shell access
Browser automation Built-in Playwright Manual setup
Heartbeats Proactive checks Reactive only
Sub-agents Spawn isolated sessions Single context
Claude Code excels at writing code. OpenClaw excels at running systems. We use both — OpenClaw as the orchestrator, Claude Code (via ACP) for complex coding tasks.

Lessons Learned

Dead ends, wasted credits, and hard-won wisdom

Dead Ends

🪦 Gmail Dark Mode
Gmail inverts dark-themed emails, making them unreadable. We spent 3 days trying every CSS hack. Nothing works reliably. Solution: Design for light mode.
~3 days wasted
🪦 Sub-agent Orchestration
Considered spawning separate AI agents for each analysis step. Would triple API costs, and 80% of work is sequential anyway. Solution: Linear pipeline with one LLM call.
1 day planning, rejected
🪦 Hallucinated Briefings
Early version let the AI "fill in gaps" when data was sparse. It invented competitor data and fake quotes. Solution: AI can only cite what the scraper found. Strict grounding.
1 briefing sent with fake data
🪦 Covert Community Responses
Considered having AI post responses anonymously. Ethical dead end — astroturfing undermines trust. Solution: Transparent profiles (Alex, Maya, Sam) with human approval.
Rejected on principle
🪦 OpenRouter Credit Depletion
API credits ran out mid-production with a 402 error. No fallback. Solution: Switched to direct Gemini API with own key. Always have a fallback provider.
~2 hours debugging
🪦 X/Twitter Posting
Bird CLI can read tweets but posting returns error 226 ("automated behavior"). Reading works, posting blocked. Status: Unresolved. Reading-only for now.
Ongoing limitation

Best Practices

1. AI for judgment, code for plumbing
Use AI where you need editorial judgment, tone, and nuance. Use deterministic code for scraping, templating, and data transformation.
2. Ban words, not behaviors
Telling AI "don't be dramatic" doesn't work. Banning specific words ("urgent", "critical", "alarming") works immediately.
3. Few-shot > instruction
Showing 3 examples of ideal output is 10x more effective than 3 paragraphs of rules.
4. Post-process everything
AI will forget link styles, use banned words occasionally, truncate output. Always run a deterministic cleanup pass after AI generation.
5. Test visually, not just logically
A function that "works" can still look broken in email, dark mode, or mobile. Screenshot verification after every deploy.
6. State prevents repetition
Without persistent memory, AI writes the same summary every day. Editorial memory, thread tracking, and angle history are essential for daily use.

The Full Stack

🔧 Infrastructure
Orchestrator: OpenClaw
Hosting: Cloudflare Pages
Data store: Cloudflare KV
API layer: Cloudflare Workers
Email: Brevo (Sendinblue)
Cron: OpenClaw built-in
🤖 AI Models
Editor: Gemini 2.5 Flash
Summaries: Gemini 2.5 Flash
Responses: GPT-4o-mini
Orchestrator: Claude Opus
Coding: Claude Sonnet 4
Cost/day: ~$2-5
📦 Frontend
Framework: React + Vite
Styling: Tailwind CSS
Charts: Recharts
Animations: Framer Motion
Icons: Lucide
Theme: Orion Dark
💰 Monthly Cost Breakdown
$0
Cloudflare (free tier)
$0
Brevo (free tier)
~$60
AI API costs
~$25
OpenClaw + Claude

Live Dashboard

Real-time brand intelligence at opera-dash-v6.pages.dev

Executive Summary Sentiment Trends Source Breakdown Response Queue Market Share

What's Next — SOW 2

🤝 Community Response System
  • AI drafts responses to user complaints
  • Three transparent "Opera Community Team" profiles
  • Human approves before posting — never covert
  • Tone-matched to Opera's voice guidelines
📈 Advanced Analytics
  • Presence Score — daily brand health metric
  • Hot Hours — when conversations peak
  • Influencer Tracking — who moves the needle
  • Weekly Report — PDF executive summary
🎯 The Goal
Move from passive monitoring to active brand management. The system doesn't just tell you what people are saying — it helps you respond, with the right tone, on the right platform, at the right time.

Built by humans.
Powered by AI.

Intel Systems × Opera
Christopher Svendsen — hello@intelsystems.ai

opera-dash-v6.pages.dev intelsystems.ai