{% extends "base.html" %} {% block title %}Dashboard — CalibreSync{% endblock %} {% block content %} {% if batch_size > 0 %}

Batch size: {{ batch_size }} zips per chunk — full sync processes all unprocessed files.

{% endif %} {% if request.query_params.get("started") %}
Sync started — processing all unprocessed archives{% if batch_size > 0 %} in batches of {{ batch_size }}{% endif %}.
{% endif %} {% if request.query_params.get("test_started") %}
Test sync started — processing 1 archive.
{% endif %} {% if request.query_params.get("already_running") %}
A sync is already running.
{% endif %}
{{ stats.total_zips }}
Zip archives processed
{{ stats.uploaded }}
Books uploaded
{{ stats.skipped }}
Duplicates skipped
{{ stats.total_books }}
Total book records

Recent sync runs

{% if runs %} {% for r in runs %} {% endfor %}
Started Finished Status New zips Uploaded Skipped Errors
{{ r.started_at[:19].replace("T"," ") }} {{ r.finished_at[:19].replace("T"," ") if r.finished_at else "—" }} {{ r.status }} {{ r.zips_new }} {{ r.books_uploaded }} {{ r.books_skipped }} {{ r.books_errored }}
{% else %}

No sync runs yet. Click "Run Sync" to start.

{% endif %}

Recent zip archives

{% if zips %} {% for z in zips %} {% endfor %}
Remote path Size Processed Status Error
{{ z.remote_path }} {{ (z.file_size / 1048576) | round(1) }} MB {{ z.processed_at[:19].replace("T"," ") if z.processed_at else "—" }} {{ z.status }} {{ z.error_msg or "" }}
{% else %}

No zip archives processed yet.

{% endif %} {% if sync_running %} {% endif %} {% endblock %}