{% extends "base.html" %} {% block title %}Dashboard · LibreSignage{% endblock %} {% block head %} {% endblock %} {% block content %} {% if unpublished_count %}
{{ unpublished_count }} {{ "screen has" if unpublished_count == 1 else "screens have" }} staged changes that players are not showing yet.
{% for screen in screens if screen.id in unpublished_ids %} {{ screen.name }}{% if not loop.last %},{% endif %} {% endfor %}
{% endif %} {% if emergency_overrides %}

Active emergency overrides

{% for emergency in emergency_overrides %} {% endfor %}
{% endif %} {% if alerts %} {% set offline_alerts = alerts|selectattr("kind", "equalto", "offline")|list %} {% set degraded_alerts = alerts|rejectattr("kind", "equalto", "offline")|list %}
{% if offline_alerts %} {{ offline_alerts|length }} {{ "screen is" if offline_alerts|length == 1 else "screens are" }} offline {% endif %} {%- if offline_alerts and degraded_alerts %} ·{% endif %} {% if degraded_alerts %} {{ degraded_alerts|length }} {{ "screen is" if degraded_alerts|length == 1 else "screens are" }} degraded {% endif %}
{% endif %}
{% for tile in status_tiles %}
{{ tile.value }} {{ tile.label }}
{% endfor %}

Managed screens

Add or edit screens

This is a live view. Register screens, stage assignments, and edit details in the screen inventory. Open each player once while it is online and wait for “Offline playlist ready” before deploying or rebooting that screen.

{% if screens %}
{% for screen in screens %} {% set state = health_states[screen.id] %} {% set report = health.get(screen.id) %} {% set layout_assignment = layout_assignments[screen.id] %}

{{ screen.name }}

{%- if screen.id in unpublished_ids -%} Draft changes {%- elif screen.published_revision -%} Published r{{ screen.published_revision }} {%- endif -%} {{ state|title }}
{%- if screen.last_seen_at -%} Last contact {%- else -%} Player has not connected {%- endif -%} {% if commands[screen.id] %} · Latest command {{ commands[screen.id][0].action|replace("_", " ") }} ({{ commands[screen.id][0].status }}) {% endif %} {% if report %} {% if report.last_error %} {{ report.last_error }} {% endif %}
Player diagnostics Cache: {{ "ready" if report.cache_ready else "not ready" }} {% if report.cache_revision %} for r{{ report.cache_revision }} {% endif %} · Service worker: {{ "active" if report.service_worker_active else "inactive" }} {% if report.storage_usage is not none %} · Storage {{ (report.storage_usage / 1048576)|round(1) }} MiB {% if report.storage_quota %} / {{ (report.storage_quota / 1048576)|round(1) }} MiB {% endif %} {% endif %} {% if report.last_content_title %} Last played: {{ report.last_content_title }} {% if report.last_content_started_at %} · {% endif %} {% endif %}
{% if report.cache_failure_reason == "insufficient_storage" %} {% elif report.cache_required_bytes and report.cache_available_bytes and report.cache_required_bytes >= report.cache_available_bytes * 0.8 %}
This revision is close to the browser's available storage limit.
{% endif %} {% endif %}
Preview draft Open player

Playing: {% if not screen.published_revision %} Nothing published yet {% elif layout_assignment.published_layout_id %} Multi-zone layout · {{ layout_assignment.published_layout_name or "unknown layout" }} {% elif screen.published_use_schedules %} Scheduled channel {% elif screen.published_playlist_id %} Direct playlist · {{ screen.published_playlist_name or "unknown playlist" }} {% else %} Nothing assigned {% endif %} Change

{% endfor %}
{% else %}

No screens registered

Add a screen to create its permanent player URL.

{% endif %}
{% endblock %} {% block scripts %} {% endblock %}