diff --git a/AGENTS.md b/AGENTS.md
index 2f6d893..00187df 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -6188,3 +6188,38 @@ Fahrzeugfoto von 42 %/78 % auf 26 %/96 %; FIN statt „Fahrgestellnummer"; Solld
`watchPosition` statt `getCurrentPosition` für die Live-Ortung, mit Abmeldung beim Verlassen der
Seite; `NSLocationWhenInUseUsageDescription` in `ios-signieren.sh` (in der ausgelieferten `.ipa`
fehlte jeder Location-Schlüssel — deshalb fragte iOS nie).
+
+### App-Symbol (2026-08-31)
+
+Gewaehlt: Entwurf 3 bei 54 % Fahrzeuggroesse — **DataMetric** oben, das CI-Fahrzeug in der Mitte,
+**360** in Audi-Rot unten, auf Nacht-Grund. Zwoelf Varianten wurden dafuer nebeneinander gezeigt,
+jede zweimal: gross und bei 60 pt, der Groesse auf dem Homescreen. Genau daran entschied es sich —
+gestapelte Elemente teilen sich dort 60 Punkte, und was gross elegant wirkt, ist klein oft ein Fleck.
+
+- Vektorquelle: `companion-app/native/logo/AppIcon-{hell,dunkel,getoent}.svg`, erzeugt von
+ `scripts/logo-bauen.cjs`. Das Fahrzeug liest das Skript aus `ICONS.audi` im Panel — eine zweite
+ Kopie des Pfades waere eine zweite Quelle fuer dieselbe Form. Die Schriften stecken als
+ data:-URI in der SVG: ohne das haengt das Ergebnis davon ab, welche Fonts auf dem
+ rasternden Rechner installiert sind, und das faellt erst am fertigen Symbol auf.
+- Fertige Vorlage: `companion-app/native/AppIcon.appiconset/` (drei 1024er-PNG plus
+ `Contents.json`). `ios-signieren.sh` legt sie ueber die von Capacitor erzeugte — `ios/` ist
+ gitignored, ein in Xcode eingesetztes Symbol waere beim naechsten `cap add ios` wieder weg.
+- Drei Ausfuehrungen, wie iOS 18 sie erwartet: **hell** mit eigenem Grund, **dunkel** und
+ **getoent** ohne. Bei den letzten beiden legt das System seinen eigenen Grund darunter; ein
+ mitgeliefertes Schwarz bliebe darauf als Kasten sichtbar. Getoent wertet iOS die Helligkeit aus,
+ deshalb wird die 360 dort ein helleres Grau statt Rot — abgesetzt, ohne eine Farbe zu behaupten,
+ die es getoent nicht gibt.
+- Die PNG sind in Chromium aus den SVG gerastert (die eingebettete Schrift steht nur dort
+ zuverlaessig zur Verfuegung). Bei einer Aenderung: `node scripts/logo-bauen.cjs`, dann neu
+ rastern — die SVG sind die Quelle, die PNG das Ergebnis.
+
+### Der Xcode-Lauf braucht jetzt keine Handgriffe mehr
+
+`ios-signieren.sh` erledigt der Reihe nach: Git-Stand pruefen, Webbuendel bauen, `cap sync`,
+Standort-Berechtigung, Share-Erweiterung, App-Symbol, Versionsnummer aus der `manifest.json`,
+alte Bereitstellungsprofile dieser App wegraeumen, archivieren, exportieren, Luftweg vorbereiten.
+
+Was zwangslaeufig manuell bleibt: die App-Gruppe und die App-ID `app.datametric360.teilen` im
+Apple-Portal (einmalig), das Keychain-„Immer erlauben" beim ersten Signieren (einmalig pro
+Schluesselbund; der nicht-interaktive Weg verlangt das Anmeldepasswort auf der Kommandozeile und
+scheidet damit aus), und `git push` der fertigen `.ipa`, weil das Telefon sie aus dem Repo laedt.
diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png b/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png
new file mode 100644
index 0000000..18f82ae
Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png differ
diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png b/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png
new file mode 100644
index 0000000..9a1f7eb
Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png differ
diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-hell.png b/companion-app/native/AppIcon.appiconset/AppIcon-hell.png
new file mode 100644
index 0000000..72504eb
Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-hell.png differ
diff --git a/companion-app/native/AppIcon.appiconset/Contents.json b/companion-app/native/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..6221212
--- /dev/null
+++ b/companion-app/native/AppIcon.appiconset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "images" : [
+ {
+ "filename" : "AppIcon-hell.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "AppIcon-dunkel.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "tinted"
+ }
+ ],
+ "filename" : "AppIcon-getoent.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/companion-app/native/logo/AppIcon-dunkel.svg b/companion-app/native/logo/AppIcon-dunkel.svg
new file mode 100644
index 0000000..b0ad1cb
--- /dev/null
+++ b/companion-app/native/logo/AppIcon-dunkel.svg
@@ -0,0 +1,11 @@
+
diff --git a/companion-app/native/logo/AppIcon-getoent.svg b/companion-app/native/logo/AppIcon-getoent.svg
new file mode 100644
index 0000000..4e85222
--- /dev/null
+++ b/companion-app/native/logo/AppIcon-getoent.svg
@@ -0,0 +1,11 @@
+
diff --git a/companion-app/native/logo/AppIcon-hell.svg b/companion-app/native/logo/AppIcon-hell.svg
new file mode 100644
index 0000000..96150f3
--- /dev/null
+++ b/companion-app/native/logo/AppIcon-hell.svg
@@ -0,0 +1,12 @@
+
diff --git a/companion-app/scripts/ios-signieren.sh b/companion-app/scripts/ios-signieren.sh
index e48c253..dbff0d6 100755
--- a/companion-app/scripts/ios-signieren.sh
+++ b/companion-app/scripts/ios-signieren.sh
@@ -119,6 +119,25 @@ fi
echo "==> Share-Erweiterung einrichten"
node scripts/ios-teilen-einrichten.mjs
+# App-Symbol einspielen.
+#
+# Capacitors Vorlage bringt ein eigenes Platzhalter-Symbol mit, und ios/ ist
+# gitignored - ein in Xcode eingesetztes Symbol waere beim naechsten
+# `npx cap add ios` wieder weg. Die Vorlage liegt deshalb versioniert unter
+# native/AppIcon.appiconset und wird hier ueber die von Capacitor erzeugte
+# gelegt.
+#
+# Drei Ausfuehrungen, wie iOS 18 sie erwartet: hell mit eigenem Grund, dunkel
+# und getoent ohne - dort legt das System seinen eigenen Grund darunter, und
+# ein mitgeliefertes Schwarz bliebe darauf als Kasten sichtbar.
+echo "==> App-Symbol einspielen"
+SYMBOLZIEL="ios/App/App/Assets.xcassets/AppIcon.appiconset"
+rm -rf "$SYMBOLZIEL"
+mkdir -p "$SYMBOLZIEL"
+cp -R native/AppIcon.appiconset/. "$SYMBOLZIEL"/
+[ -f "$SYMBOLZIEL/Contents.json" ] || { echo "FEHLER: App-Symbol nicht eingespielt." >&2; exit 1; }
+echo " hell, dunkel, getoent"
+
# Versionsnummer aus der manifest.json in die App schreiben.
#
# Capacitors Vorlage setzt 1.0/1 und laesst es dabei - zwei nacheinander
diff --git a/companion-app/scripts/logo-bauen.cjs b/companion-app/scripts/logo-bauen.cjs
new file mode 100644
index 0000000..12a4de3
--- /dev/null
+++ b/companion-app/scripts/logo-bauen.cjs
@@ -0,0 +1,135 @@
+/**
+ * Baut die drei App-Symbol-Vorlagen als SVG.
+ *
+ * Gewaehlt wurde Entwurf 3 bei 54 % Fahrzeuggroesse: DataMetric oben, das
+ * CI-Fahrzeug in der Mitte, 360 in Audi-Rot unten, auf Nacht-Grund.
+ *
+ * WARUM DIE SCHRIFTEN EINGEBETTET WERDEN
+ * --------------------------------------
+ * Eine SVG-Datei, die nur `font-family: "Audi Type"` nennt, sieht nur dort
+ * richtig aus, wo die Schrift installiert ist. Auf einem anderen Rechner - und
+ * in jedem Rasterisierer - faellt sie auf eine Ersatzschrift zurueck, und das
+ * faellt erst am fertigen Symbol auf. Die woff2-Dateien stecken deshalb als
+ * data:-URI in der Datei; sie ist damit fuer sich allein vollstaendig.
+ *
+ * DIE DREI AUSFUEHRUNGEN VON iOS 18
+ * ---------------------------------
+ * hell - die Kachel wie entworfen, mit eigenem Grund.
+ * dunkel - ohne Grund. iOS legt seinen eigenen dunklen Verlauf darunter; ein
+ * mitgeliefertes Schwarz wuerde darauf als Kasten sichtbar bleiben.
+ * getoent - ohne Grund und ohne Farbe. iOS faerbt das Bild selbst nach der
+ * Wahl des Nutzers ein und wertet dafuer die Helligkeit aus - das
+ * Rot der 360 wird deshalb zu einem helleren Grau als der Rest,
+ * damit die Zahl auch getoent noch abgesetzt bleibt.
+ *
+ * MASSE
+ * -----
+ * Alles als Anteil der Kantenlaenge, hergeleitet aus dem freigegebenen
+ * Entwurf (Flex-Spalte, Abstand 0,02 - siehe index.html):
+ *
+ * Wort 0,095 | Abstand 0,02 | Fahrzeug 0,54 | Abstand 0,02 | Zahl 0,17
+ * zusammen 0,845, der Rest verteilt sich gleichmaessig oben und unten.
+ */
+
+const fs = require("fs")
+const path = require("path")
+
+const SCHRIFTEN = path.join(__dirname, "..", "src", "assets", "audi", "schriften")
+
+/* Das CI-Fahrzeug kommt aus dem Panel selbst - eine zweite Kopie des Pfades
+ waere eine zweite Quelle fuer dieselbe Form. */
+const PANEL = path.join(
+ __dirname,
+ "..",
+ "..",
+ "custom_components",
+ "audi_dashboard",
+ "frontend",
+ "audi-dashboard-app.js",
+)
+const MARKE = "audi: '`
+}
+
+/**
+ * @param {object} o
+ * @param {string|null} o.grund Hintergrund, oder null fuer keinen
+ * @param {string} o.vorn Wort und Fahrzeug
+ * @param {string} o.akzent die 360
+ */
+function symbol({ grund, vorn, akzent }) {
+ return `
+`
+}
+
+const AUSFUEHRUNGEN = {
+ /* Nacht-Canvas und Audi-Rot aus den Tokens des Projekts. */
+ hell: { grund: "#0C1014", vorn: "#FFFFFF", akzent: "#F50537" },
+ dunkel: { grund: null, vorn: "#FFFFFF", akzent: "#F50537" },
+ /* Getoent wertet iOS die Helligkeit aus: Weiss fuer Wort und Fahrzeug, ein
+ helles Grau fuer die Zahl - so bleibt sie abgesetzt, ohne eine Farbe zu
+ behaupten, die es getoent nicht gibt. */
+ getoent: { grund: null, vorn: "#FFFFFF", akzent: "#B4B4B8" },
+}
+
+const ZIEL = path.join(__dirname, "..", "native", "logo")
+fs.mkdirSync(ZIEL, { recursive: true })
+
+for (const [name, o] of Object.entries(AUSFUEHRUNGEN)) {
+ const datei = path.join(ZIEL, `AppIcon-${name}.svg`)
+ fs.writeFileSync(datei, symbol(o), "utf8")
+ console.log(`${path.basename(datei)} ${(fs.statSync(datei).size / 1024).toFixed(0)} KB`)
+}
+
+console.log("")
+console.log("Masse bei 1024:")
+console.log(` Wort Mitte y=${wortMitte.toFixed(1)} Groesse ${(A.wort * S).toFixed(1)}`)
+console.log(` Fahrzeug oben y=${autoOben.toFixed(1)} Kante ${autoKante.toFixed(1)}`)
+console.log(` Zahl Mitte y=${zahlMitte.toFixed(1)} Groesse ${(A.zahl * S).toFixed(1)}`)