{# Settings → Feeds → Fetch Tiers. Served by /settings/feeds/panel/fetch-tiers and injected on first open of that view. Shows which feeds are routing through each outbound-fetch escalation tier (paid VPN proxy, home-IP Tailscale, FlareSolverr) right now, so it's visible how much each is actually being exposed rather than only discoverable one feed's Properties at a time. Reuses the .problem-feed-* classes the Stale/Failing lists already use. #} {% macro tier_section(title, hint, rows) %}

{{ title }} {{ rows | length }}

{{ hint }}

{% if rows %} {% else %}

None right now.

{% endif %}
{% endmacro %} {{ tier_section("Paid VPN proxy", "Feeds escalated to the gluetun proxy after a plain fetch was refused.", proxy_rows) }} {{ tier_section("Home IP (Tailscale)", "Feeds escalated further, past the proxy, to your home network's exit IP.", tailscale_rows) }} {{ tier_section("FlareSolverr", "Feeds needing a real headless-Chrome challenge solve (Cloudflare/DDoS-Guard) — routed through whichever of the above is also active for the feed.", flaresolverr_rows) }} {# Page fetches: tag/lead-image scraping and the saved-article re-fetch path share one ladder (services/page_fetch.py) with the three feed tables above, but its memory is per-HOST and in-memory (not persisted feed rows) — a demand-driven single-URL fetch, not an hourly cron, so it's shown as its own list rather than folded into the sections above. #}

Page fetches (this session) {{ page_fetch_rows | length }}

Hosts the tag/lead-image scraper and saved-article re-fetch have escalated for, since the last restart — separate from the feed tables above.

{% if page_fetch_rows %} {% else %}

None right now.

{% endif %}