diff --git a/ChangeLog.md b/ChangeLog.md
index ece5535..0a3d0a4 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,25 @@
# Changelog
+## 1.7.4 — 2026-10-19
+
+### AVIF-Bilder werden beim Hochladen umgewandelt
+„Es gibt immer mehr Bilder im Netz, die AVIF verwenden" (Eddy, 19.10.2026). Die Upload-Wege nahmen
+nur JPG/PNG (Editor zusätzlich PDF) und lehnten `.avif` ab. Ein AVIF, das ein Bild-CDN unter „.jpg"
+ausliefert, kam dagegen durch (geprüft wird nur die Endung) und lag roh als „.jpg" am Beleg — das
+Bericht-PDF (TCPDF) kann es nicht setzen. Jetzt erkennt `lib/bericht_avif.lib.php` ein AVIF am
+Inhalt und wandelt es vor der Endungsprüfung um: deckend → JPG, mit Transparenz → PNG (Muster aus
+KundenKarte, KB #1698).
+
+- Transparente AVIF wandelt auf Prod GD zu PNG (Prod-Image mit GD-AVIF seit 19.10.2026,
+ dolibarr-image Commit 0cd9d18). ImageMagick 6 nimmt dafür nicht, es verliert den Alphakanal.
+ Die Meldung „Bitte vorerst als PNG speichern" greift nur noch, wo GD kein AVIF kann.
+- Abgedeckt: Datei-Upload im Editor (`ajax/upload_extra.php`, Dateidialog und Ablegen nehmen
+ jetzt `.avif` an), Foto-Upload der PWA (`api/orders.php?action=upload_photo`), Handy-Upload
+ per QR (`mobile_upload.php`). Dort bekam ein verkleinertes Bild bisher die alte Endung —
+ ein großes AVIF kam als JPEG mit „.avif" an und wurde abgelehnt; jetzt heißt es „.jpg".
+- Nicht nötig: Scan-Seiten, Unterschriften und Editor-Composites entstehen im Browser als
+ JPEG/PNG, die ODT-Vorlagen im Setup sind keine Bilder.
+
## 1.7.3 — 2026-10-14
### Neuer Auftrag aus der App: kein zufälliger Kundenkontakt mehr
diff --git a/README.md b/README.md
index d9ca48f..6ae9c32 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ Bilder und PDFs lassen sich im Browser annotieren (Pfeile, Kreise, Rechtecke, Te
- **Bild einer Seite austauschen** ohne sie zu löschen — Reihenfolge, Notiz und Anmerkungen bleiben erhalten. Bei Raster-Layouts lässt sich jeder Platz einzeln tauschen, direkt auf der Seite anklickbar.
- **Ziehen und Ablegen**: Kachel auf die Seitenliste legt neue Seiten an, Kachel auf die Arbeitsfläche ersetzt das Bild der offenen Seite, Kachel auf einen Raster-Platz setzt genau diesen. Dateien vom Rechner auf die Anhänge-Spalte werden hochgeladen.
- **Mobiler Upload per QR-Code** — Handy scannt, lädt Fotos direkt in den offenen Bericht (zeitlich begrenzte Token)
+- **AVIF-Bilder (1.7.4)** — beim Hochladen (Editor, PWA, Handy-Upload) am Inhalt erkannt und in JPG bzw. PNG (mit Transparenz) umgewandelt (`lib/bericht_avif.lib.php`, KB #1698)
- **Ablage am Beleg als Beilage (1.7.2)** — Fotos, Notizen, Sprachnotizen, Scans und Bericht-PDFs, die im Belegordner landen, stehen im ECM-Index als `uploaded` (`lib/bericht_index.lib.php`): nur im Reiter „Verknüpfte Dokumente", nie vorne im Kasten der Belegkarte (KB #1641)
- **Notizen pro Seite** — werden im finalen PDF unten auf der Seite gedruckt
- **Deckblatt aus ODT-Vorlage** mit Platzhaltern (`{auftragsnummer}`, `{kunde_name}`, `{datum}`, …)
diff --git a/ajax/upload_extra.php b/ajax/upload_extra.php
index d5609ed..7ad73ee 100644
--- a/ajax/upload_extra.php
+++ b/ajax/upload_extra.php
@@ -15,6 +15,11 @@ if ($bericht->fetch($berichtid) <= 0) bericht_ajax_fail('Bericht nicht gefunden'
if (empty($_FILES['file']['tmp_name'])) bericht_ajax_fail('Keine Datei hochgeladen');
+// AVIF (aus dem Netz, auch unter „.jpg") vor Endungsprüfung und Namensbildung in JPG/PNG umwandeln
+require_once __DIR__.'/../lib/bericht_avif.lib.php';
+$avif_fehler = bericht_upload_avif_umwandeln($_FILES['file']);
+if ($avif_fehler !== '') bericht_ajax_fail($avif_fehler);
+
$origname = dol_sanitizeFileName($_FILES['file']['name']);
$ext = strtolower(pathinfo($origname, PATHINFO_EXTENSION));
$allowed = array('pdf', 'png', 'jpg', 'jpeg');
diff --git a/api/orders.php b/api/orders.php
index e3fa02c..4c52a83 100644
--- a/api/orders.php
+++ b/api/orders.php
@@ -227,6 +227,11 @@ if ($action === 'upload_photo' && $_SERVER['REQUEST_METHOD'] === 'POST') {
if (!$user->hasRight('bericht', 'write')) api_fail('Schreibrechte fehlen', 403);
if (empty($_FILES['file']['tmp_name'])) api_fail('file fehlt');
+ // AVIF (Galerie/Teilen aus dem Netz, auch unter „.jpg") vor der Prüfung in JPG/PNG umwandeln
+ require_once __DIR__.'/../lib/bericht_avif.lib.php';
+ $avif_fehler = bericht_upload_avif_umwandeln($_FILES['file']);
+ if ($avif_fehler !== '') api_fail($avif_fehler);
+
// Datei validieren
$orig = dol_sanitizeFileName($_FILES['file']['name']);
$ext = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
diff --git a/bericht_card.php b/bericht_card.php
index d994a2c..e3d4623 100644
--- a/bericht_card.php
+++ b/bericht_card.php
@@ -525,7 +525,7 @@ document.addEventListener("click", function(e) {
print '