{% extends "base.html" %} {% block title %}{{ seo.title if seo is defined and seo else 'Pipeline Monitor — Live Dashboard | news48' }}{% endblock %} {% block body_class %}page-monitor{% endblock %} {% block content %} ← back to live feed {% set articles = stats.articles %} {% set sentiment = stats.sentiment %} {% set feeds = stats.feeds %} {% set fetches = stats.fetches %} {% set retention = stats.retention %} {% set health = stats.health %} {% set plans = stats.plans %} {% set failures_total = articles.download_failures + articles.parse_failures %} {% set sentiment_total = sentiment.positive + sentiment.neutral + sentiment.negative %} {% set parsed_rate = ((articles.parsed / articles.total * 100) if articles.total else 0) %} {% set unparsed_rate = ((articles.unparsed / articles.total * 100) if articles.total else 0) %} {% set no_content_rate = ((articles.no_content / articles.total * 100) if articles.total else 0) %} {% set positive_width = ((sentiment.positive / sentiment_total * 100) if sentiment_total else 0) %} {% set neutral_width = ((sentiment.neutral / sentiment_total * 100) if sentiment_total else 0) %} {% set negative_width = ((sentiment.negative / sentiment_total * 100) if sentiment_total else 0) %} {% set top_feed_max = feeds.top_feeds[0].article_count if feeds.top_feeds else 1 %}
Real-time numbers from every feed crawl, parse run, and retention sweep — no caching, no staging.
pipeline quality
How many articles made it through the pipeline.
system health
Connection status and database size.
plan activity
What the agent layer is working on — pending, running, done, or broken.
sentiment pulse
Positive, neutral, and negative breakdown across parsed articles.
fetch activity
The last few crawl runs and how much each one picked up.
No recent fetch runs available.
{% endfor %}feed breadth
Which feeds are pulling their weight and which have gone stale.
No feed stats available.
{% endfor %}