{#- Degraded service: human-readable cause, raw exception behind a disclosure with any API key redacted. -#} {% macro service_error(name, raw) %} {% endmacro %} {#- Disk temperature / spin state, as one badge. A spun-down disk reports no usable temperature, so Standby replaces the reading rather than showing a stale or zero degree value. -#} {% macro disk_state(dk) %} {%- if dk.spinning == false -%} Standby {%- elif dk.temp is not none -%} {{ dk.temp }}°C {%- else -%} — {%- endif -%} {% endmacro %} {#- One service status pill in the Status strip. `short` is swapped in for `label` on phones, where six full names can't share one row without ellipsising down to two characters — see the .svc-name rules. The full name stays in the DOM for screen readers either way. -#} {% macro svc_pill(key, label, short, url, up, stat) %} {{ label }} {{ stat }} {% endmacro %}

Media Centre

—

Status

{# Every service stays visible at every width — these wrap onto more rows rather than scrolling or truncating. A hidden pill is a service whose status you can't see. #}

Right now

{# Two cards here, not three. Storage carries a per-disk table that no third-of-a-page column can hold without towering over these two and hollowing them out — it gets its own full-width row below. #}

Now playing

{%- if tautulli.status == 'ok' -%} {{ tautulli.active_streams }} active {%- endif -%}
{% if tautulli.status == 'ok' %}
{% if tautulli.sessions %} {% for s in tautulli.sessions %}
{{ s.title }} {{ s.user }}
{% endfor %} {% else %}

Nothing streaming right now.

{% endif %}
{% else %} {{ service_error("Tautulli", tautulli.error) }} {% endif %}

Downloads

{% if sabnzbd.status == 'ok' %} {% set st = sabnzbd.sab_status | lower %} {{ sabnzbd.sab_status }} {% endif %}
{% if sabnzbd.status == 'ok' %}
{{ sabnzbd.speed }}
{{ sabnzbd.queue_count }} queued · {{ sabnzbd.sizeleft }} left
Avg speed (7d)
{{ sabnzbd.avg_speed }}
Grabbed (7d)
{{ sabnzbd.completed_7d }}
Volume (7d)
{{ sabnzbd.week_size }}
{% else %} {{ service_error("SABnzbd", sabnzbd.error) }} {% endif %}
{# Storage spans the page so its per-disk table has room to be a table. Ten disks down a narrow column is a tower; across the full width it is ten short rows. #}

Storage

{% if unraid.status == 'ok' %} {{ unraid.array_used_pct }}% used · {{ unraid.array_free }} free of {{ unraid.array_total }} {%- if unraid.disk_count %} · {{ unraid.disk_count }} disk{{ 's' if unraid.disk_count != 1 }}{% endif %} {%- if unraid.array_state %} · {{ unraid.array_state | capitalize }}{% endif %} {% endif %}
{% if unraid.status == 'ok' %} {% if unraid.disks or unraid.caches or unraid.parities %} {# Array total leads, then the disks that make it up. #} {% set pct = unraid.array_used_pct %}
{% for dk in unraid.disks + unraid.caches %} {% set dpct = dk.used_pct %} {% endfor %} {% for dk in unraid.parities %} {# Parity mirrors the array rather than holding a filesystem, so it has no size or usage of its own to report. #} {% endfor %}
Disk Used Size Free Usage Temp
{{ dk.name }} {{ dk.used }} {{ dk.total }} {{ dk.free }}
{{ dpct }}%
{{ disk_state(dk) }}
{{ dk.name }} — — — Parity · no filesystem {{ disk_state(dk) }}
{% else %} {# Fallback: container-visible disk usage, no per-disk detail. #} {% set pct = unraid.array_used_pct %}
{{ pct }}%
{{ unraid.array_free }} free of {{ unraid.array_total }}
{{ unraid.array_used }} used
{% if unraid.source == "local" %}

Container disk usage ({{ unraid.mount }}). Set UNRAID_API_KEY for full array stats.

{% endif %} {% endif %} {% else %} {{ service_error("Unraid", unraid.error) }} {% endif %}

Library

{% if sonarr.status == 'ok' %}
Series
{{ sonarr.total_series }}
Missing episodes
{{ sonarr.missing_episodes }}
{% else %} {{ service_error("Sonarr", sonarr.error) }} {% endif %}
{% if radarr.status == 'ok' %}
Movies
{{ radarr.total_movies }}
Missing
{{ radarr.missing_movies }}
{% else %} {{ service_error("Radarr", radarr.error) }} {% endif %}

Discover — not in your library yet

Popular TV on Rotten Tomatoes

{% if rt_tv and rt_tv[0] is defined and rt_tv[0].error is defined %}

Couldn't load TV recommendations.

{% elif rt_tv %}
{% for show in rt_tv %}
{{ loop.index }} {% if show.poster %} {% else %}{% endif %}
{{ show.title }}{% if show.year %} ({{ show.year }}){% endif %}
{% if show.certified %}Certified Fresh {% elif show.critics_score %}{{ show.critics_score }}% critics{% endif %} {% if show.audience_score %}{{ show.audience_score }} audience{% endif %}

{{ show.description[:180] ~ '…' if show.description and show.description|length > 180 else (show.description or '') }}

{% endfor %}
{% if rt_tv | length > 5 %} {% endif %} {% else %}

No TV recommendations available.

{% endif %}

Top box office on Rotten Tomatoes

{% if rt_movies and rt_movies[0] is defined and rt_movies[0].error is defined %}

Couldn't load movie recommendations.

{% elif rt_movies %}
{% for movie in rt_movies %}
{{ loop.index }} {% if movie.poster %} {% else %}{% endif %}
{{ movie.title }}{% if movie.year %} ({{ movie.year }}){% endif %}
{% if movie.certified %}Certified Fresh {% elif movie.critics_score %}{{ movie.critics_score }}% critics{% endif %} {% if movie.audience_score %}{{ movie.audience_score }} audience{% endif %}

{{ movie.description[:180] ~ '…' if movie.description and movie.description|length > 180 else (movie.description or '') }}

{% endfor %}
{% if rt_movies | length > 5 %} {% endif %} {% else %}

No movie recommendations available.

{% endif %}

Requests & indexers

Requests — Ombi

{% if ombi.status == 'ok' %} {{ ombi.total_pending }} pending of {{ ombi.total_requests }} {% endif %}
{% if ombi.status == 'ok' %} {% if ombi.recent %}
{% for req in ombi.recent %} {# Same anatomy as an indexer row: status dot, name over a dimmed detail line, status badge on the right. #} {% set st = req.status | lower %}
{{ req.title }}
{{ req.type }} · {{ req.user }} · {{ req.date_display }}
{{ req.status }}
{% endfor %}
{% if ombi.recent | length > 5 %} {% endif %} {% else %}

No recent requests.

{% endif %} {% else %} {{ service_error("Ombi", ombi.error) }} {% endif %}

Indexers — Prowlarr

{% if prowlarr.status == 'ok' %} {{ prowlarr.up_count }}/{{ prowlarr.total }} online {%- if prowlarr.has_stats %} · share of {{ prowlarr.share_metric }}, {{ prowlarr.stats_days }}d{% endif %} {% endif %}
{% if prowlarr.status == 'ok' %} {# Bars are scaled against the busiest indexer, not against 100%, so a spread of single-digit shares is still readable. The label beside each bar stays the true percentage. #} {% set top_share = prowlarr.indexers[0].share if prowlarr.indexers else 0 %}
{% for idx in prowlarr.indexers %} {% set share = idx.share %}
{{ idx.name }}
{{ idx.protocol }}{% if prowlarr.has_stats %} · {{ '{:,}'.format(idx.grabs) }} grabs · {{ '{:,}'.format(idx.queries) }} queries{% endif %}
{% if prowlarr.has_stats %} {% endif %}
{% if prowlarr.has_stats %} {% endif %} {{ 'Online' if idx.up else 'Offline' }}
{% endfor %}
{% else %} {{ service_error("Prowlarr", prowlarr.error) }} {% endif %}
{% if tautulli.status == 'ok' %}

Watch insights — last 30 days

Most played

{% if tautulli.top_played %}
{% for item in tautulli.top_played %}
{{ loop.index }}
{{ item.title }}
{{ item.user }}
{% set mt = item.media_type | lower %} {{ 'TV' if mt == 'episode' else ('Movie' if mt == 'movie' else mt or '?') }} {{ item.plays }}×
{% endfor %}
{% else %}

No play history yet.

{% endif %}

Top viewers

{% if tautulli.top_users %}
{% for u in tautulli.top_users %}
{{ loop.index }}
{{ u.username }}
{{ u.plays }} plays
{% endfor %}
{% else %}

No viewer data yet.

{% endif %}
{% if tautulli.top_tv_list or tautulli.top_movie_list %}

Top TV

{% if tautulli.top_tv_list %}
{% for item in tautulli.top_tv_list %}
{{ loop.index }}
{{ item.title }}
{{ item.plays }} plays
{% endfor %}
{% else %}

No data yet.

{% endif %}

Top movies

{% if tautulli.top_movie_list %}
{% for item in tautulli.top_movie_list %}
{{ loop.index }}
{{ item.title }}
{{ item.plays }} plays
{% endfor %}
{% else %}

No data yet.

{% endif %}
{% endif %}
{% endif %}