feat: organizer Android app and token-gated upload API
CI / lint-and-test (push) Failing after 1m18s

Replace Syncthing as the product upload path with a share-target app
and POST /api/jobs. Web UI live-polls job progress.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-08-27 21:38:50 +02:00
parent 5dcc3717c7
commit c03f17488c
58 changed files with 3134 additions and 186 deletions
+16 -2
View File
@@ -3,8 +3,20 @@
{% block content %}
<p class="back-link"><a href="/">&larr; Alle Jobs</a></p>
<h1>Job {{ job_id }}</h1>
<p class="job-status status-{{ status.status }}">Status: {{ status.status or "unbekannt" }}</p>
<div class="job-heading">
<h1>Job {{ job_id }}</h1>
<p class="job-status status-{{ status.status }}">
{{ status_label(status.status) }}
{% if status.status in ACTIVE_STATUSES %}
&middot; {{ stage_label(status.status, status.stage, status.progress) }}
{% endif %}
</p>
</div>
{% if status.status in ACTIVE_STATUSES and status.progress and status.progress.total %}
<div class="progress" aria-hidden="true">
<span style="width: {{ (status.progress.current / status.progress.total * 100) | int }}%"></span>
</div>
{% endif %}
{% if status.error %}
<p class="error-box">Fehler: {{ status.error }}</p>
{% endif %}
@@ -28,6 +40,8 @@
<a href="/jobs/{{ job_id }}/files/{{ original_name }}" download>Download</a>
</figcaption>
</figure>
{% else %}
<p class="empty-state">Original kommt, sobald der Worker greift.</p>
{% endif %}
{% if has_rembg and rembg_name %}
{% set img = img_attrs(job_id, rembg_name, sizes=PAIR_SIZES) %}