Skip to content

Änderungsprotokoll

Das Änderungsprotokoll wird nicht mehr in der Web-App gepflegt. Release-Notizen und größere Produktänderungen werden ab jetzt hier auf docs.targetshot.app gesammelt.

Noch nicht veröffentlicht

Kommt mit dem nächsten App-Build. Server und Web-App ändern sich dafür nicht.

  • Der Rangrahmen zeigt jetzt den Rang der laufenden Saison. Der Rahmen um das Profilbild steht für den Rang, den man in dieser Saison geschossen hat, nicht mehr für den höchsten je erreichten Rang. Das löst die Zusage aus v0.13.0 ab, der Rahmen zeige den höchsten je erreichten Rang und verschwinde nicht mit einer neuen Saison.
  • Einen Rahmen gibt es, sobald man in der laufenden Saison Saisonpunkte hat. Ohne Saisonpunkte in der laufenden Saison und in der Sommerpause bleibt das Bild ohne Rahmen.
  • Die Namensfarbe in der Saison-Rangliste folgt demselben Rang wie der Rahmen.
  • Das gilt im eigenen Profil, auf der Saison-Startseite, in der Saison-Rangliste, im Profil eines Mitglieds und auf der Ehrentafel.
  • Rahmen gibt es weiter nur mit aktivem Pro.
  • Der höchste je erreichte Rang bleibt sichtbar. Im eigenen Profil steht er als kleines Abzeichen mit der Beschriftung „Bestrang“ neben Tarif, E-Mail und Rolle. Die Ehrentafel führt ihn wie bisher: Abzeichen und Gruppen zeigen den höchsten Rang, nur der Rahmen am Bild zeigt die laufende Saison.
  • Texte im TargetPass. Der Abschnitt mit den Rangabzeichen heißt jetzt „Diese Saison freigeschaltet“ statt „Was du behältst“. Die Rangleiter nennt „einen Profilrahmen für die laufende Saison“.
  • Ältere App-Fassungen zeigen bis zum Update weiter den höchsten je erreichten Rang als Rahmen.

Aktueller Release

v0.33.0 · 2026-11-01

Duelle

  • Duelle lassen sich ohne Wertung beenden: zurückziehen, ablehnen, abbrechen; offene Einladungen verfallen. Beendete Duelle ohne Wertung werden nach 90 Tagen endgültig gelöscht, nach einer Blockierung nach 6 Monaten, und nie, solange eine Meldung offen ist. Der Löschlauf hat einen eigenen Schalter und bleibt vorerst aus.
  • Duell- und Saisonfenster richten sich jetzt nach der Berliner Uhrzeit, mit 15 Minuten Nachlauf.

Vereine

  • Vereine können über targetshot.app/vereine einen Zugang anfragen. Es entsteht kein Konto: Die Anfrage geht an uns, die anfragende Person bekommt eine Eingangsbestätigung. Mit Bot-Schutz wie beim Widerruf und einem Löschlauf samt Alarm.
  • Datenschutzerklärung (Stand 1. November 2026): Vereinsanfragen über das neue Formular; Turnstile und das alte Kontaktformular entfallen.
  • Wer aus einem Verein ausgetragen ist, sieht dessen Rundenwettkämpfe nicht mehr und wird dort anderen nicht mehr gezeigt. Die alte Wettkampfansicht rät keine Mannschaftssumme mehr.

Einwilligung und Sportpass-Nummer

  • Eine Sportpass-Nummer, die zwei Konten führen, wird nirgends mehr freigegeben: nicht beim Abgleich, nicht bei der Eltern-Bestätigung und nicht beim Papier-Widerruf. Der Widerrufs-Löschlauf überspringt solche Nummern und meldet sie der Betreiberin („Nummer in Klärung“).

Benachrichtigungen

  • Kein Push und keine freiwillige E-Mail mehr an inaktive Konten. Geräte-Push-Token werden nach spätestens 30 Tagen gelöscht, mit Alarm für den Löschlauf.
  • Web-Push: Das Browser-Abo wird beim Abmelden gelöscht und nach der Anmeldung automatisch erneuert. In den Einstellungen zeigt die Web-App, ob Push in diesem Browser aktiv ist.

Kaufriegel

  • Der Kaufriegel greift auch, wenn eine Kündigung zurückgenommen wird. Vermerkte Apple-Käufe kann ein Plattform-Admin ansehen und quittieren; die öffentliche Statusseite zeigt nur noch Ja/Nein.

  • Intern:

  • 5 Datenbank-Migrationen, alle additiv: Duell-Ende (2), Advent-Schema mit leeren Tabellen und noch unbenutzten SP-Gründen (2), Vereinsanfrage (1).
  • TargetPass-Grundlagen für den Advent (Trainingstag-Schlüssel, Niveau je Gruppe, Zugangs-Schalter): dunkel, alle Schalter aus.
  • Laufzeit Node 22.23.4 statt Node 20 (Sicherheitsrelease; Node 20 ist ohne Unterstützung). Die Ingest-Function läuft seit 30.10. auf Node 22.
  • Neue Health-Routen für den Duell-Löschlauf, den Löschlauf der Push-Token und die Vereinsanfrage; Tests und Staging-Wächter nachgeschärft.

v0.32.0 · 2026-10-25

Rundenwettkampf (RWK)

  • TargetShot liest jetzt zu jeder Wettkampfscheibe die Angaben der Anlage zum Rundenwettkampf ein: Mannschaft, Wertung (gewertet, Ersatz, außer Konkurrenz) und Heim- oder Auswärtskampf. Fehlerhafte Angaben verhindern nie, dass die Scheibe selbst gespeichert wird.
  • Neue Ansicht unter „Wettkämpfe“: die eigenen Mannschaften der laufenden RWK-Saison, die Begegnungen mit „Summe zuerst“ und die Saisonübersicht einer Mannschaft. Von der gegnerischen Mannschaft erscheint nur ihr Name. Trainerinnen, Trainer und die Vereinsleitung sehen zusätzlich die Mannschaften ihres Vereins.
  • Die Ansicht ist noch nicht freigeschaltet. Sie kommt zuerst für einen kleinen Kreis von Testerinnen und Testern und zeigt dann Wettkämpfe ab Beginn des Einlesens; ältere Wettkämpfe kommen später dazu.

Konto und Anmeldung

  • Werden zwei Mitglieder gleichzeitig mit derselben Sportpass-Nummer eingeladen oder abgeglichen, bekommt nur eines die Nummer. Der zweite Vorgang bricht mit einer Fehlermeldung an die einladende Vereinsleitung ab.
  • Die Web-App meldet sich zuverlässiger ab, wenn die Anmeldung in einem anderen Tab endet, und lässt nach dem Verlassen einer Seite keine alten Anmelde-Rückrufe mehr laufen.

Einstellungen

  • Im Bereich E-Mail der Einstellungen steht jetzt „Kalender-Termine“ und ein Verweis, wo man die Berichte per E-Mail einstellt. In der App kommt das mit dem nächsten App-Build.

  • Intern:

  • Keine Datenbank-Migration (die RWK-Spalten kamen mit v0.31.0).
  • Die Ingest-Function auf Prod wird mit diesem Release neu ausgerollt.
  • Neu hochgeladene Profilbilder werden im Browser nur noch 24 Stunden zwischengespeichert, damit ein entferntes Bild nicht lange sichtbar bleibt. Bestehende Bilder behalten ihre bisherige Zwischenspeicherung.

v0.31.1 · 2026-10-23 (Hotfix)

Kauf

  • Kann der Server gerade nicht prüfen, ob jemand kaufen darf, zeigen die Apps keine Kaufmöglichkeit mehr. Android zeigt dann „Ein Kauf in der App ist gerade nicht möglich“, bei iOS ist der Kaufknopf aus. Einen Hinweis auf das Alter gibt es dabei nicht.
  • Google-Play-Käufe bestätigt der Server nur noch, wenn der Kauf erlaubt ist. Kann er das gerade nicht prüfen, bestätigt er später. Bei bekannt Minderjährigen bestätigt er nicht, und Google erstattet den Kauf von selbst.
  • Apple-Käufe in diesen Fällen nimmt der Server an und vermerkt sie zur Klärung von Hand. Der Wächter meldet neue Fälle, ohne Alter und ohne Konto zu nennen.
  • Wird ein Konto gelöscht, werden diese Vermerke ganz gelöscht.

  • Intern:

  • Keine Datenbank-Migration, keine Änderung an den Rechtstexten.
  • Neues Statusfeld kaufflaeche (offen bzw. voruebergehend_aus) für die App ab 1.0.8; /healthz/kaufriegel meldet zusätzlich appleKaeufe.
  • Die Log-Zeilen der Kaufsperre heißen jetzt pro_kauf_riegel_abgelehnt (Kanal web/ios).

v0.31.0 · 2026-10-23

Rundenwettkampf (RWK), Vorbereitung

  • Zu jeder Wettkampfscheibe kann TargetShot jetzt auch die Angaben der Anlage zum Rundenwettkampf speichern: Mannschaft, Wertung (für die Mannschaft gewertet, Ersatz, außer Konkurrenz) und Heim- oder Auswärtskampf. Mit diesem Release kommt nur die Ablage; eingelesen und angezeigt wird noch nichts. Die RWK-Ansicht folgt in einem späteren Release, zuerst für einen kleinen Kreis von Testerinnen und Testern.
  • Datenschutzerklärung (Stand 23. Oktober 2026):
  • Abschnitt 5 beschreibt, wer die Begegnungen und die Saisonübersicht einer Mannschaft sieht und dass von der gegnerischen Mannschaft nur ihr Name erscheint.
  • Abschnitt 6: Die RWK-Angaben werden mit dem Ergebnis gelöscht, zu dem sie gehören, genauso wie die übrigen Schießdaten.
  • Gleicher Text in der Web-App und am selben Tag auf targetshot.app.
  • Die Datenauskunft nennt die neuen RWK-Angaben zu jeder Scheibe mit; bis zum Einlesen sind sie leer.

Bestenliste (Pro)

  • Deaktivierte, gelöschte oder zur Löschung angemeldete Konten erscheinen nicht mehr in den Vereins-Bestenlisten anderer.
  • Wer in TargetShot von einem Verein ausgetragen wurde, steht sofort nicht mehr in dessen Bestenliste, auch wenn die Anlage ihn noch führt.
  • Der Schützenbestand der Anlage zählt nur noch für die Liste genau des Vereins, dem er gehört.
  • Wer in TargetShot von einem Verein ausgetragen wurde, kann dessen Bestenliste auch selbst nicht mehr abrufen.

Kauf

  • Kann TargetShot beim Web-Kauf von Pro das Alter oder die Elternfreigabe gerade nicht lesen, etwa bei einem kurzen Datenbankfehler, wird der Kauf jetzt vorsichtshalber angehalten. Du siehst dann „Gerade nicht möglich, bitte später erneut versuchen.“ Vorher konnte ein solcher Fehler den Kauf durchlassen.

Widerruf

  • Gehört nur die Bestätigungsadresse eines Widerrufs zu einem Konto, nicht aber das Kontofeld, bekommt das TargetShot-Team jetzt die normale Aufgabe zur Prüfung, mit dem Hinweis, den Vertrag dieses Kontos zu prüfen.
  • In der internen täglichen Übersicht verdächtiger Eingänge werden Namen mit Komma („Nachname, Vorname“) jetzt richtig gekürzt; unklare Namen erscheinen nur noch als Initialen.

  • Intern:

  • Eine Datenbank-Migration, nur zusätzliche Spalten und ein Index (20261019120000_scoresheet_rwk_felder), mit 5 Sekunden Sperr-Zeitgrenze.
  • Neuer Endpunkt /healthz/kaufriegel mit Wächter kaufriegel-health.yml; er meldet gehäufte Lesefehler des Kaufriegels. Bis der Endpunkt auf Prod steht, duldet der Wächter ein 404; die Duldung fällt nach diesem Release weg.
  • Korrektur eines unzuverlässigen Tests (Warteschleife im Botschutz).

v0.30.0 · 2026-10-20

Widerruf

  • Eingangsbestätigung bei Verdacht auf automatisierte Eingänge (Regel K). Die automatische Eingangsbestätigung eines Widerrufs entfällt nur noch, wenn zwei Dinge zusammenkommen. Erstens: Der Eingang zeigt ein Bot-Signal, also ein ausgefülltes unsichtbares Feld, ein zu schnell oder mit ungültigem Formular-Token abgeschicktes Formular oder einen zufällig wirkenden Namen. Zweitens: Die angegebene Bestätigungsadresse gehört zu keinem TargetShot-Konto.
  • Gehört die Adresse zu einem Konto, geht die Bestätigung trotz Bot-Signal automatisch raus.
  • Passt nur das Kontofeld des Formulars zu einem Konto, holt das TargetShot-Team die Bestätigung von Hand nach.
  • Das Formular antwortet in allen Verdachtsfällen gleich: Der Widerruf ist eingegangen und gespeichert, die Bestätigung ist möglicherweise noch nicht verschickt. Aus der Antwort lässt sich deshalb nicht ablesen, ob zu einer Adresse ein Konto besteht.
  • Bleibt ein Eingang länger als 30 Minuten unentschieden, etwa nach einem Lesefehler, geht er zur Bestätigung von Hand an das TargetShot-Team.
  • Die Einleitung des Widerrufsformulars sagt jetzt, dass du deine Erklärung nach dem Absenden mit der Eingangszeit speichern kannst.
  • Datenschutzerklärung (Stand 20. Oktober 2026):
  • Abschnitt 9 beschreibt die neue Regel.
  • Abschnitt 6: Ein Widerruf ohne Konto- und Vertragstreffer wird nur noch dann schon nach 90 Tagen gelöscht, wenn beim Eingang ein Verdacht bestand, keine automatische Bestätigung ging und der Name wie eine zufällige Zeichenfolge aussieht. Sonst gilt die normale Aufbewahrung.
  • Gleicher Text in der Web-App und am selben Tag auf targetshot.app.

  • Die Support-Seite auf targetshot.app sagt jetzt passend dazu, dass die Bestätigung von Kündigung und Widerruf „in der Regel sofort“ per E-Mail kommt.

  • Intern:

  • Keine Datenbank-Migration.
  • Neuer Zustand bot_pruefung für Widerrufe mit Bot-Signal. Die Entscheidung fällt direkt nach der Antwort; bleibt sie aus, holt der Nachlauf sie ab 2 Minuten nach.
  • Die sechs Wächter (consent-deliverability, data-freshness, lexware-rechnung-health, postmark-health, revocation-purge-health, store-reporting-register) melden einen fehlenden Endpunkt (HTTP 404) jetzt als Fehler. Die Übergangs-Duldung nach dem Release ist entfernt.
  • TS_CANCELLATION_UNDO_SECRET nicht wechseln: Ein neues Secret würde offene Formulare als Zeitfalle werten und die automatische Bestätigung unterdrücken.

v0.29.0 · 2026-10-19

Einwilligung und Vereinsboxen

  • Kontolöschung und Wechsel der Sportpass-Nummer erreichen jetzt die Vereinsboxen. Bisher blieb die alte Nummer auf der Box freigegeben, und die Anlage schickte unter ihr weiter Schießdaten. Jetzt bekommt die Box einen Vermerk „nicht freigegeben“ zu dieser Nummer, ohne Bezug zu einem Konto. Die Cloud bewahrt den Vermerk auf, bis alle angeschlossenen Boxen ihn übernommen haben, mindestens 3 und höchstens 90 Tage.
  • Wechselt die Sportpass-Nummer eines Kontos, ziehen dessen Einwilligungen auf die neue Nummer um, wenn sie eindeutig ist.
  • Datenschutzerklärung (Stand 19. Oktober 2026):
  • Abschnitt 6 beschreibt den Vermerk und die neuen Löschfristen.
  • Abschnitt 5 beschreibt die neuen Jugend-Ansichten „Trainingswochen“ und „Gruppen-Trend“.
  • Abschnitt 9 beschreibt die erweiterte interne Übersicht.
  • Die Seite zur Kontolöschung nennt den Vermerk ebenfalls.
  • Gleicher Text in der Web-App und am selben Tag auf targetshot.app.

Kündigung und Widerruf

  • Eingänge im Widerrufs- und im Kündigungsformular, bei denen das für Menschen unsichtbare Feld ausgefüllt war und zu denen weder ein Konto noch ein Vertrag gefunden wurde, werden früher gelöscht: Widerruf nach 90 Tagen, Kündigung nach 13 Monaten.
  • Alle Eingänge mit ausgefülltem unsichtbarem Feld stehen täglich in einer internen Übersicht für das TargetShot-Team, jeweils mit der Angabe, ob ein Konto oder Vertrag gefunden wurde. Die Übersicht enthält keine E-Mail-Adressen und keine vollen Namen.

Jugend (mit Vereinslizenz)

  • Verlauf „Ø je Schuss“ im Jugend-Steckbrief. Gilt für alle Programmlängen und vergleicht die letzten 4 Wochen mit den 4 Wochen davor oder das laufende Sportjahr mit dem vorigen. Es zählen nur Trainings.
  • Neue Ansicht „Trainingswochen“ in der Jugendübersicht. Sie zeigt für die letzten 12 Wochen, in welchen Wochen ein Kind an der Anlage des Vereins trainiert hat, ohne Tag und Uhrzeit, alphabetisch und ohne Quote.
  • Neue Ansicht „Gruppen-Trend“. Ein Pfeil je Kind (besser, gleich, schlechter) vergleicht die letzten 4 Wochen mit den eigenen Ergebnissen davor. Grundlage dafür ist der Median der letzten bis zu 8 Blätter vor diesem Zeitraum, aus der Disziplingruppe, in der das Kind zuletzt am meisten geschossen hat (z. B. Luftgewehr). Es gibt keine Rangfolge und keine Zahlen.
  • Die Tabelle der Jugendübersicht bleibt nach Ø Ring sortiert.
  • Kinder mit gesperrtem, gelöschtem oder sich löschendem Konto erscheinen nicht mehr in der Jugendübersicht.
  • Im Vereinsprofil fehlen in der Mannschaftsaufstellung jetzt geschützte Kinder ohne Elternfreigabe für den Verein. Trainer und Vereinsleitung sehen sie weiter wie in der Jugendsicht.

„Bestes 40er“

  • Urkunde, Rekordbuch und Rekord-Benachrichtigung rechnen jetzt mit 40 Schuss. Bisher konnte ein 60er-Ergebnis als „bester 40er“ zählen.
  • Die Bestschütze-Karte rechnet ab dem Zeitraum November/Dezember 2026 ebenso mit höchstens 40 Schuss, und das persönliche Bestschütze-Ziel nimmt dann das beste statt das letzte Training. Der laufende Zeitraum September/Oktober wird zu Ende gerechnet wie bisher.
  • Duelle „bestes Ergebnis“ (direkt und gegen den Geist) und alle Best-of-3-Duelle werten jede Scheibe mit höchstens den ersten 40 Schuss. Bereits laufende Duelle bleiben bei ihrer alten Regel. Offene Einladungen bekommen die neue Regel, wenn sie angenommen werden.

Behebungen

  • Die Wettkampf-Ansicht zeigt Scheiben ab 22 Uhr (im Winter ab 23 Uhr) nicht mehr am Folgetag.
  • Die Datenauskunft gibt die Zeiten von Scheiben, Treffern und Vereinsterminen jetzt als echte Zeitpunkte aus. Bisher lagen sie 1 bis 2 Stunden daneben.
  • Saisonpunkte, Saison-Serie, Trainingsanzahl und Abzeichen übersehen keine Trainings mehr, bei denen Starterliste oder Disziplin fehlen, etwa das freie Training. Kann der Server die Trainingskategorien nicht lesen, rechnet er nicht mehr mit Ersatzzahlen: Duelle, Beitritt und das Anlegen eines Geisterduells melden dann einen Fehler, Buchungen setzen aus, Listen zeigen den gespeicherten Stand.
  • Zu- und Absagen zu Terminen gehen nur noch für Termine des eigenen Vereins und nur, wenn der Termin diese Antwort zulässt.
  • Ausblendungen in den Vereinsübersichten und Mannschaftszuordnungen gehen bei gleichzeitigem Speichern nicht mehr verloren. Ein Lesefehler blendet keine ausgeblendeten Personen mehr ein, stattdessen kommt eine Fehlermeldung.
  • Abo-Rechnungen: Scheitert das Anlegen in Lexware, geht die Rechnung nicht mehr still verloren. Sicher nicht angelegte Rechnungen werden automatisch nachgeholt. Unklare Fälle werden zur Klärung von Hand markiert und nicht doppelt angelegt.

  • Intern:

  • Zwei Datenbank-Migrationen, beide nur ergänzend: Tabellen für den Vermerk und die Quittung je Box sowie zwei Spalten für Kündigungseingänge.
  • Neuer Wächter lexware-rechnung-health (/healthz/lexware). Geändert: consent-deliverability und revocation-purge-health.
  • Neue optionale Einstellung CONSENT_NUMBER_RECONCILE: Vorgabe aus, wird nach dem Ausrollen eingeschaltet. Erst damit erreicht ein Wechsel der Sportpass-Nummer die Boxen. Frühere Wechsel holt der Abgleich bei der nächsten Anmeldung oder Pflege nach, solange die Einwilligung nicht inzwischen neu geschrieben wurde.
  • HONEYPOT_AUFBEWAHRUNG_WIDERRUF_TAGE und HONEYPOT_AUFBEWAHRUNG_KUENDIGUNG_MONATE werden nicht gesetzt (Vorgabe 90 Tage bzw. 13 Monate). Jeder andere Wert weicht von der Datenschutzerklärung ab und braucht vorher eine neue Fassung.
  • Rückweg-Grenze: Sobald das erste Duell mit der neuen „bis 40“-Regel existiert, gibt es keinen Rückweg mehr hinter v0.29.0. Ab dem 01.11.2026 gilt das auch für die Bestschütze-Wertung.

v0.28.0 · 2026-10-18

Wer was sieht

  • Wettkampf-Aufstellungen in der eigenen Übersicht und in der Vereinssicht zeigen Name, Serien und Ergebnis nur noch für die eigenen Einträge und für Mitglieder des eigenen Vereins, die der Sichtbarkeit ihrer Schießdaten zugestimmt haben (bei Kindern zusätzlich mit Elternfreigabe für den Verein). Alle anderen, auch Teilnehmer anderer Vereine, erscheinen als „Schütze ohne Freigabe“ ohne Name und Ergebnis.
  • Preisschießen-Ergebnisse zeigen die eigene Zeile und Mitglieder des eigenen Vereins mit dieser Zustimmung. Andere fehlen in der Liste, die Plätze werden unter den Sichtbaren vergeben.
  • Herausforderungen und Saison (Teilnehmerlisten, Saison-Rangliste, Ehrentafel, Mitgliedsprofil, Duelle mit Gegnerauswahl, Ansicht und Wertung) prüfen jetzt auch die Zustimmung des jeweiligen Kontos selbst, nicht nur die der Sportpass-Nummer.
  • In Wettkampf-Aufstellungen mit Schützen ohne Freigabe können Mannschaftssummen und Ausgang als „Ergebnis nicht angezeigt“ entfallen.
  • Vereinsübergreifende Bestenlisten von Herausforderungen sind geschlossen. Die Ranglisten von Herausforderungen sind auf den eigenen Verein beschränkt, Teilnehmer anderer Vereine erscheinen dort nicht mehr. Die Einstellung „global teilen“ wird nicht mehr gespeichert. Web und App zeigen solche Listen schon bisher nicht an.
  • Kontonamen, die eine E-Mail-Adresse sind, blendet jetzt auch der Standaufsicht-Plan aus (Trainer, Vereinsleitung und die Person selbst sehen sie weiter). Als Adresse gilt nur noch ein Name mit Zeichen vor und nach dem „@“.
  • Wer „Punkte in Bestenliste teilen“ ausgeschaltet hat, sieht sich selbst in der Bestenliste weiterhin.

Rollen und Einladungen

  • Vereinsrollen lassen sich nur noch nach Rang vergeben, entziehen und löschen. Die Vereinsleitung vergibt höchstens den eigenen Rang, ein Trainer nur „Mitglied“ und „Jugendtrainer“. Ein Trainer kann zum Beispiel keine Vereinsleitung mehr herabstufen.
  • Eine Einladung kann keine fremde Sportpass-Nummer und kein höherrangiges Konto mehr übernehmen.
  • Kann der Server die Belegung der Rollenplätze nicht lesen, lehnt er die Vergabe ab, statt sie durchzulassen.

Kündigung und Widerruf

  • Kündigungsformular: Schutz gegen automatisierte Eingänge, wie beim Widerruf in v0.27.1. Ist das für Menschen unsichtbare Feld ausgefüllt, geht eine automatische Bestätigung nur noch, wenn die Kündigung einen Vertrag beendet oder von Hand umgesetzt werden muss. Andere solche Eingänge werden gespeichert, aber nicht automatisch bestätigt.
  • Der Fehlertext auf der Kündigungsseite nennt jetzt den Weg per E-Mail an [email protected]. Auf der Widerrufsseite steht zusätzlich, dass für die Frist das rechtzeitige Absenden der E-Mail genügt.
  • Datenschutzerklärung (Stand 18. Oktober 2026): Abschnitt 9 beschreibt den Schutz des Kündigungsformulars. Gleicher Text in der Web-App und, direkt nach dem Ausrollen, auf targetshot.app.
  • Zur Bestätigungsgrenze aus v0.27.1: Die Zusammenfassung von Punkten (nur bei Gmail) gilt auch für die Bestätigungsgrenze des Kündigungsformulars, die dort bei drei Eingängen bleibt.

Behebungen

  • Web: Die Seitenleiste zeigt nach einer erneuten Anmeldung nicht mehr kurz „Free“ und Schlösser, obwohl Pro aktiv ist. Solange der Tarif noch nicht abgeglichen ist, bleiben Tarif-Zeichen und Schlösser weg; Pro-Inhalte bleiben dabei weiter gesperrt, bis der Tarif bekannt ist.
  • Web: Fehlt beim Pro-Kauf die Verbindung, zeigt die Seite einen Fehler statt stumm zu bleiben. Scheitert nach einer Zahlung der Abgleich, erscheint eine Meldung statt eines hängenden Fensters.
  • Lesefehler der Datenbank öffnen und überschreiben nichts mehr. Das gilt für Box-Lizenz, Lizenz- und Abo-Zeilen im Kaufweg, die Sichtbarkeits-Einstellung der Übersicht sowie Rollen und Einladungen. Stattdessen gibt es eine Fehlermeldung oder eine leere Antwort. Eine Box bekommt deshalb bei einem Lesefehler nie mehr „ohne Lizenz“ gemeldet.
  • Box: Ein Widerruf, der während einer laufenden Abfrage geschrieben wurde, konnte der Box dauerhaft fehlen. Der Abgleich überlappt jetzt um zwei Minuten. Eine zweite, seltenere Lücke bei sehr vielen Änderungen auf einmal ist bekannt und wird gesondert behoben.

App (mit dem nächsten App-Build)

  • iOS führt Deutsch und Englisch als Sprachen der App; der App Store zeigte bisher nur Englisch. App-Version 1.0.8.

  • Intern: keine Datenbank-Migration.

  • Neue Wächter für den Widerrufs-Purge (/healthz/revocation-purge) und den Mailversand (/healthz/postmark), jeweils mit GitHub-Workflow.
  • Neue optionale Einstellungen: POSTMARK_MONTHLY_LIMIT, POSTMARK_PERIOD_START_DAY, POSTMARK_OWN_DOMAINS sowie die Rückfallschalter COMPETITION_LINEUP_VISIBILITY und PRIZE_RESULTS_VISIBILITY (Vorgabe club).

v0.27.1 · 2026-10-17 (Hotfix)

  • Widerrufsformular: Schutz gegen automatisierte Eingänge verschärft. Automatisierte Eingänge hatten Eingangsbestätigungen an fremde Adressen ausgelöst.
  • Ist das für Menschen unsichtbare Feld ausgefüllt, geht keine Eingangsbestätigung mehr raus. Die Erklärung wird weiter gespeichert. Die Seite meldet dann, dass die Bestätigung möglicherweise noch nicht verschickt ist, und bittet darum, die Widerrufserklärung als Nachweis zu speichern.
  • Passt die angegebene Konto-Adresse zu einem Konto, holen wir die Bestätigung von Hand nach. Die interne Aufgabe weist ausdrücklich darauf hin.
  • Automatische Eingangsbestätigungen an dasselbe Postfach gibt es höchstens für einen Eingang innerhalb von 24 Stunden, bisher drei. Punkte in der Adresse werden dabei nur bei Gmail zusammengefasst; das gilt auch für die Bestätigungsgrenze des Kündigungsformulars.
  • Datenschutzerklärung (Stand 18. Oktober 2026): Abschnitt 9, „Widerruf über die Online-Funktion“, beschreibt die neue Regel. Gleicher Text in der Web-App und, direkt nach dem Ausrollen, auf targetshot.app.
  • Intern: keine Datenbank-Migration, keine neue Konfiguration.

v0.27.0 · 2026-10-16

  • Teiler-Duelle werden genau gewertet. Bisher wurde der Teiler gerundet, deshalb endeten knappe Duelle (etwa 23,4 gegen 23,1) als Remis. Neue Teiler-Duelle werten jetzt in ganzen Zehnteln, und die Ergebnis-Mail zeigt den Teiler („Teiler 23,1“). Laufende ältere Duelle werten nach der bisherigen Regel zu Ende, gewertete Duelle und gebuchte Saisonpunkte bleiben unverändert.
  • Saisonziele ab Nov/Dez 2026 aus allen Vereinstrainings. Das Ziel der Karte „Ringsammler“ wird ab dem Zeitraum Nov/Dez 2026 aus allen Vereinstrainings im gleichen Zeitraum des Vorjahres berechnet, auch aus Trainings, die ein Verein unter einer Liste wie „Jahresmeisterschaft“ führt. Bisher fehlten diese Trainings, deshalb kann das Ziel jetzt deutlich höher ausfallen. Auch der Bestschütze nutzt diese Vereinstrainings, dort aus dem ganzen Vorjahr, solange du noch keinen eigenen Vorwert hast. Ziele laufender und abgelaufener Zeiträume ändern sich nicht.
  • Saison-Serie zählt Trainingswochen ab dem Zeitraum Nov/Dez 2026: Gezählt werden Wochen mit mindestens einem Training, nicht mehr einzelne Trainings.
  • Zwei-Monats-Herausforderungen heißen nach ihrem Zeitraum, zum Beispiel „Sep/Okt 2026: Ringsammler“ statt „Season 4/2026: Ringsammler“.
  • Schussverteilung je Training (Pro): In der Detailansicht einer Trainingseinheit zeigt die Web-App Trefferlage und Streuung im Trefferbild sowie den Schussverlauf. Auch die Ringverteilung in dieser Ansicht gehört jetzt zu Pro.
  • Jugendtrainer: Ein Verein kann jetzt bis zu drei Jugendtrainer benennen (bisher zwei).
  • Standaufsicht: Wer auf der Standaufsicht-Liste steht, kann Tauschanfragen stellen und beantworten, auch ohne eigenes Amt. Ein Kontoname, der nur aus der Sportpass-Nummer besteht, erscheint im Plan und in Tausch-Nachrichten als „Unbekannt“.
  • Mehr Schutz für Kennungen: Kontonamen, die eine Sportpass-Nummer oder E-Mail-Adresse sind, zeigen Ranglisten, Duelle, Profile und die Mitgliederliste anderen Mitgliedern nicht mehr (Trainer und Vereinsleitung sehen sie weiter); Bildadressen enthalten keine Sportpass-Nummer mehr. Im Standaufsicht-Plan wird bisher nur ein Nummern-Kontoname ausgeblendet.
  • Ranglisten: Der Schalter „Punkte in Bestenliste teilen“ wirkt jetzt in allen Vereins-Ranglisten, nicht nur in der Bestenliste.
  • Duelle: Ein Duell lässt sich nur noch gegen Mitglieder mit Pro anlegen; die Antwort verrät nicht, ob jemand Pro hat.
  • ts-connect: Die Anmeldung an einer Vereinsbox gibt das Zugangsticket nur noch an Adressen im TargetShot-Netz heraus und fragt vorher nach.
  • Box-Lizenz: Bei einem laufenden Monatsabo zeigt die Box keine Ablaufwarnung mehr (sobald connector v0.6.35 auf der Box läuft; diese Box-Fassung folgt).
  • App (kommt mit dem ersten App-Update nach dem Store-Start): Schussverteilung im Training und in der Trainer-Ansicht, Ziehen zum Aktualisieren und Serien-Reiter in der Trainer-Ansicht, große Schrift und Fehlertext dort, Profilbild in der Duell-Gegnerliste, Hinweis bei einer Kaufsperre aus der Elternfreigabe, auf iOS der AGB-Hinweis vor dem Kaufknopf.
  • Intern: keine Datenbank-Migration, keine neuen Pflicht-Einstellungen. Neu und optional ist TS_CONNECT_HOST_ORIGIN_SUFFIXES (Standard .tail343b10.ts.net).

v0.26.0 · 2026-10-16

  • Rechtstexte Fassung 4. Nutzungsbedingungen (Stand 16. Oktober 2026, Fassung 4), Datenschutzerklärung und die Seite zur Kontolöschung sind neu gefasst, jeweils deutsch und englisch:
  • Melden und Blockieren sind beschrieben (Abschnitt 4 der Nutzungsbedingungen, Datenschutz und Löschfristen).
  • Abos, die in der Android-App über Google Play abgeschlossen werden, sind beschrieben, auch Kündigung und Widerruf über unsere Formulare.
  • Wer TargetShot schon vor dem 16. Oktober 2026 genutzt hat, für den gilt die neue Fassung erst, wenn er ihr zustimmt; bis dahin gilt die bisherige.
  • Kauf erst ab 18, genauer erkannt. Ein Konto mit einer Elternfreigabe gilt beim Kauf als minderjährig, auch wenn der Verein kein Geburtsdatum hinterlegt hat. Ein im Verein hinterlegtes volljähriges Geburtsdatum hat Vorrang. Die Web-App nennt in diesem Fall den richtigen Grund und wie sich eine falsche Einstufung korrigieren lässt.
  • Weniger Kennungen bei Apple und Google. Neue Kennungen, mit denen ein Kauf bei Apple oder Google einem Konto zugeordnet wird, entstehen nur noch für Konten, die selbst kaufen können, und nur für die Plattform der App (iOS: Apple, Android: Google; ältere App-Fassungen ohne Plattformangabe bekommen weiter beide). Für Minderjährige, Pro über die Vereinslizenz und die Web-App entsteht keine neue Kennung mehr. Bereits vorhandene, nicht mehr benötigte Kennungen entfernen wir in einem eigenen Schritt.
  • Passwort zurücksetzen: Der Link in der Mail führt nur noch auf unsere eigene Web-App, wie bei der Einladung.
  • Widerruf und Kündigung nennen den Weg für Google-Play-Abos, sobald Google Play eingerichtet ist, auch wenn neue Käufe gerade gesperrt sind: das Widerrufsformular und die Eingangsbestätigungen von Widerruf und Kündigung.
  • Android-App (kommt mit dem Start im Play Store): Pro lässt sich in der Android-App über Google Play kaufen; Minderjährige und Konten mit Pro über den Verein sehen kein Kaufangebot. Ab Android 10 fragt die App keine Speicherrechte mehr an; bis Android 9 fragt sie das Schreibrecht nur zusammen mit der Kamera.
  • Intern:
  • keine Datenbank-Migration, keine neuen Pflicht-Einstellungen;
  • Not-Aus TS_GOOGLE_PLAY_ANGEBOT=aus: Dann nimmt der Server keinen neuen Google-Kauf an, auf keinem Weg;
  • die Prod-Konfiguration für Google Play folgt getrennt;
  • neues Skript npm run kontokennungen:aufraeumen für nicht mehr benötigte Kennungen (läuft nicht automatisch);
  • das Android-Release-Skript räumt den Signierschlüssel bei Abbruch durch Signal oder Fehler weg.

v0.25.0 · 2026-10-14

  • Saisonkarten mit persönlichem Ziel. Vier Saisonkarten (Solider Schnitt, Bestwert-Jäger, Comeback-Schütze, Präzisionsserie) rechnen jetzt in Ringen pro Schuss. Dein Ziel ist dein eigener Schnitt, damit sind die Karten für jede Programmlänge fair.
  • Laufende Karten werden dabei sofort umgestellt. Dein Fortschrittsbalken kann deshalb einmalig sinken; bereits abgeschlossene Karten und gebuchte Saisonpunkte bleiben erhalten.
  • Karten aus abgelaufenen Zeiträumen, die noch offen waren, werden beim nächsten Öffnen ohne Saisonpunkte als „abgelaufen“ geschlossen.
  • „Beste Serie“ ist die beste 10er-Serie. Jede gewertete Serie wird in aufeinanderfolgende 10-Schuss-Blöcke zerlegt, ohne Probeschüsse. Reste unter 10 Schuss zählen nicht. Das gilt im Server, in der Web-App und im PDF-Bericht, so wie es die App schon rechnet.
  • Vereinsübersicht und Trainer-Paket liefern für eine Trainingseinheit dieselben Serien und dieselbe Trefferzahl wie die Mitgliedsansicht und behandeln gelöschte Treffer wie dort. Die Vereinsübersicht in der Web-App zeigt Ganzringe.
  • Kleinere Korrekturen:
  • Die Schusszahl der Dashboard-Übersicht und die Trefferzahl im Trainer-Paket zählen keine Probeschüsse mehr mit. Fehlt die Trefferzahl der Anlage, zeigt das Trainer-Paket keine Zahl statt einer geschätzten.
  • Auf der Saisonseite zeigen Pass, Sammlung und Rangliste je einen eigenen Fehlerzustand; fällt ein Teil aus, bleiben die anderen sichtbar.
  • Im Impressum steht der Adressblock wieder zeilenweise.
  • Das Trefferbild beschriftet den Tooltip auf Deutsch mit „Schuss“.
  • Der Hinweis an gesperrten Funktionen richtet sich nach dem Alter: Erwachsene sehen TargetShot Pro, Minderjährige den Weg über die Vereinslizenz.
  • Die Bestenliste wählt den Zeitraum über ein Aufklapp-Menü.
  • Intern: keine Datenbank-Migration, keine neuen Einstellungen oder Schlüssel auf Prod. Staging setzt DEBEZIUM_PING_HOST/-PORT nicht mehr.

v0.24.0 · 2026-10-13

  • Melden und Blockieren.
  • In Web und App lassen sich Mitglieder und Profilbilder melden. Gemeldete Profilbilder kommen bis zur Entscheidung in eine private Quarantäne.
  • Die Vereins- und Plattformverwaltung bearbeitet Meldungen in einer eigenen Moderation.
  • Wer jemanden blockiert, bekommt von dieser Person keine Duelle und keine Tauschanfragen mehr. Ein Profilbild lässt sich auch nur für sich selbst ausblenden.
  • Gemeldet und blockiert wird über kurzlebige Kennungen statt über Sportpass-Nummern.
  • Die App-Seite kommt mit dem nächsten App-Build.
  • Elternfreigabe: Teil 2 und 3 per E-Mail. Eltern können die Freigabe für Verein und Duelle (Teil 2 und 3) jetzt per E-Mail erteilen oder ablehnen, zusätzlich zur Papier-Erfassung. Eine Ablehnung der Eltern bindet; der Verein kann sie nicht überstimmen.
  • Widerruf der Schießdaten-Freigabe.
  • Die Frist für die Folgedaten gilt jetzt je Widerruf und endet um Mitternacht des letzten Tages.
  • Ob ein Widerruf sofort oder mit Frist wirkt, entscheidet die App-Fassung, mit der er erklärt wurde. Ältere App-Fassungen, die den neuen Dialog noch nicht kennen, behalten die Frist.
  • Im Konto steht ein Hinweis, bis wann gesperrte Daten gelöscht werden.
  • Die Bestätigung eines Widerrufs ist für Unbeteiligte neutral formuliert.
  • Bestenlisten: Leere Scheiben aus der Anlage (Platzhalter-Teiler) erscheinen nicht mehr in den Score-Bestenlisten.
  • Duelle: Die Detailansicht einer Herausforderung erkennt die Duellant-Karte zuverlässig.
  • Rechtstexte: Die Datenschutzerklärung hat Stand 13. Oktober 2026 (Elternfreigabe per E-Mail). Die Nutzungsbedingungen sind unverändert (Fassung 3).
  • App (kommt mit dem nächsten App-Build): Fehlertexte für gesperrte Duelle, Trefferbild mit Maßstab und Pinch-Zoom, Rangrahmen der laufenden Saison (siehe „Noch nicht veröffentlicht“) und weitere Verbesserungen.
  • Intern:
  • eine Datenbank-Migration, additiv: Moderation, Blockierungen, Profilbild-Ausblendungen und drei optionale Spalten am Konto;
  • neuer Schlüssel TS_REPORTREF_HMAC_KEY auf Prod, aus dem Key Vault.

v0.23.1 · 2026-10-11

  • Saisonkarte „Duellant“ lässt sich wieder annehmen. In v0.23.0 lehnte der Server die Teilnahme an der freiwilligen Saisonkarte „Duellant“ ab, weil er sie wie ein echtes Duell behandelte. Die Sperre gilt jetzt nur noch für echte Duelle.
  • Die Duellant-Karte ist kein Duell.
  • Eine Kontolöschung räumt nur noch echte Duelle ab. Die gemeinsame Duellant-Vorlage und die Teilnahmen anderer bleiben erhalten.
  • Sie gilt bei offenen Duellen, beim Limit von drei Duellen und beim automatischen Abschluss nicht mehr als Duell. Im Sichtschutz und im Datenexport wird sie wie jede andere Karte behandelt; Fortschritt und Ergebnis stehen jetzt im Export.
  • Wer die Karte bis einschließlich 18.10.2026 annimmt, erhält ihre Saisonpunkte auch dann, wenn die zwei Siege schon vorher feststanden. Danach gilt wieder: Eine bei der Annahme schon erfüllte Karte bringt keine Saisonpunkte.
  • Intern: keine Datenbank-Migration, keine neue Konfiguration.

v0.23.0 · 2026-10-10

  • Saisonpunkte: ein Konto für alle Vereine.
  • Saisonpunkte (SP) sammelt man jetzt in einem gemeinsamen Konto je Saison, über alle Vereine hinweg. Gebucht wird beim Training.
  • Die Rangliste je Verein ist ein Filter auf die Mitglieder dieses Vereins.
  • Bisherige Saisonzeilen je Verein werden zusammengelegt. Punkte bleiben erhalten.
  • Elternfreigabe, zweite Fassung.
  • Die Freigabe für Kinder hat drei getrennte Teile. Kinder erscheinen in Mitgliederlisten und Gegnerlisten nur, wenn die passende Freigabe vorliegt.
  • Vereine können eine Freigabe auf Papier erfassen und je Teil widerrufen.
  • Widerruf der Freigabe für Schießdaten.
  • Wer Teil 1 widerruft, verliert auch die Folgedaten: Saisonpunkte, Stufen, Auszeichnungen, Urkunden, Rekorde, Momente sowie Duell- und Herausforderungsergebnisse.
  • Für Widerrufe, die vor dem neuen Dialogtext erklärt wurden, bleiben diese Folgedaten 30 Tage gesperrt, bevor sie gelöscht werden. Wer die Freigabe in dieser Zeit erneut erteilt, behält sie.
  • Der Widerrufsdialog in Web und App nennt jetzt alle betroffenen Daten.
  • Konto löschen.
  • Selbstlöschung und Entfernung durch den Verein nutzen denselben Löschweg.
  • Die teilweise Rücknahme einer Selbstlöschung nennt alle gekündigten Abos und, bei einem verlängernden Apple-Abo, den Hinweis zur Kündigung bei Apple.
  • Randfälle beim Wiederherstellen aus dem Papierkorb sind abgesichert.
  • Datenschutz: In Mitgliederliste und Standaufsicht-Liste erscheinen keine fremden Sportpass-Nummern mehr.
  • Rechtstexte: Die Datenschutzerklärung hat Stand 10. Oktober 2026 (Saisonpunkte vereinsübergreifend, Löschung von Duell- und Herausforderungsergebnissen beim Widerruf). Die Löschseite ist ergänzt. Die Nutzungsbedingungen sind unverändert (Fassung 3).
  • Android (vorbereitet, inaktiv):
  • Der Kaufweg über Google Play und die Widerrufsstrecke nach § 356a BGB für Google-Abos sind enthalten.
  • Das Stripe-SDK ist nicht mehr im Android-Paket.
  • Ohne die Play-Einstellungen bleibt das Google-Abo auf Prod inaktiv.
  • App: Bewegungen, Haptik und Konfetti, Kennung der App-Fassung an jeder Anfrage. Kommt mit dem nächsten App-Build.
  • Betrieb:
  • Die ICS-Ampel in /healthz misst je Verein.
  • Staging-Deploys laufen nacheinander.
  • Die Google-Erstattungsliste reicht höchstens 29 Tage zurück.
  • Intern: sechs Datenbank-Migrationen.
  • Zwei davon schreiben Daten um, um die Saisons und Momente auf das gemeinsame Konto zusammenzulegen.
  • Vier sind additiv: ein Index, zwei Einwilligungszwecke und zwei Spalten für die Selbstlöschung.
  • Neue Konfiguration auf Prod: keine. Die Frist für Widerrufe steht in der Tabelle Setting.

v0.22.0 · 2026-10-07

  • Push-Mitteilungen lassen sich je Kategorie schalten.
  • In App und Web gibt es unter dem Push-Hauptschalter sechs Schalter: Trainings-Auswertung, Wettkämpfe & Termine, Duelle, Saisonfortschritt, Aus dem Verein, Konto & Abo.
  • Der Ton-Schalter wirkt jetzt wirklich (stumme Mitteilungen).
  • Neu in der App: Beim Kontowechsel wird das Gerät dem neuen Konto zugeordnet, beim Abmelden zuerst abgemeldet. So landen auf geteilten Geräten keine Mitteilungen beim vorherigen Konto. Kommt mit dem nächsten App-Build.
  • Moment-Feed (Server). Grundlage für die Momente in der App: Urkunden und Ereignisse als Feed mit Lesestand. Einträge werden mit dem Konto gelöscht und sind Teil der Datenauskunft. Der Feed beginnt mit diesem Release; frühere Ereignisse erscheinen nicht nachträglich.
  • Einstellungen speichern nur, was man geändert hat.
  • Web: Ein Speichern setzt Änderungen aus einem anderen Gerät nicht mehr zurück. Beim ersten Laden zeigt die Seite die Vorgaben des Servers, eine dort getroffene Wahl geht nicht verloren.
  • Server: Das Erscheinungsbild wird nur für mitgeschickte Felder vereinheitlicht; es wird keine Sprache mehr erfunden. Konten, bei denen ein früherer Wechsel des Erscheinungsbilds die Sprache ‚de‘ gespeichert hat, werden nicht nachträglich korrigiert.
  • App: Verspätete Antworten überschreiben keine neuere Auswahl mehr (Einwilligungen, Anmeldung, Erscheinungsbild).
  • Entfernen durch den Verein und laufende Abos.
  • Vor dem Entfernen eines Mitglieds mit persönlichem Pro-Abo warnt der Löschdialog, dass das Abo weiterläuft.
  • Die betroffene Person bekommt eine Mail: Ein Web-Abo kündigen wir beim endgültigen Löschen, mit Datum und dem Weg zur anteiligen Erstattung. Ein Apple-Abo kann nur sie selbst kündigen; die Mail sagt, wo.
  • Der Kündigungsbutton („Verträge hier kündigen“) findet auch Konten, die ein Verein bereits entfernt hat und die noch im Papierkorb liegen.
  • Die Betreiber-Aufgabe „trotz offener Abo-Kündigung gelöscht“ entsteht erst unmittelbar vor der endgültigen Löschung.
  • Duelle: Die automatische Wertung erreicht jedes fällige Duell, auch wenn viele ältere Duelle anstehen.
  • Rechtstexte (Stand 7. Oktober 2026):
  • Datenschutzerklärung: Moment-Feed; Entfernung durch den Verein (§5).
  • Nutzungsbedingungen, Fassung 3: Entfernung durch den Verein und ausdrückliches Fristende (§8).
  • Android-Abo über Google Play (vorbereitet, inaktiv). Das Android-Abo über Google Play ist auf Prod enthalten, aber inaktiv. Ohne die Play-Einstellungen antwortet der Kauf-Endpunkt mit 503 google_nicht_konfiguriert, der RTDN-Endpunkt mit 503 google_rtdn_nicht_konfiguriert. Es geht kein Aufruf an Google. Die Kündigungsstrecke (§ 312k BGB) und die Kontolöschung sind für Google-Abos vorbereitet.
  • Betrieb und Datenschutz in Fehlermeldungen.
  • Serverfehler antworten mit festem Code und Fehlerkennung statt mit internem Fehlertext; Logzeilen enthalten keine Fehlertexte und Fehlerobjekte mehr.
  • Die öffentlichen Health-Endpunkte geben keine Datenbank- oder Netzfehlertexte mehr aus.
  • Die Apple-Benachrichtigungsroute ist gehärtet.
  • Intern: sieben Datenbank-Migrationen, alle additiv (Moment-Feed, Google Play, Kündigung Google). Für bestehende Konten setzt die Moment-Feed-Migration einmalig den Feed-Beginn. Neue Konfiguration auf Prod: keine.

v0.21.5 · 2026-10-04

  • iPhone-App: Abo-Angebote laden zuverlässiger.
  • Antwortet der App Store beim Laden der Abos nicht, bricht die App nach 15 Sekunden ab und bietet „Erneut laden“ an, statt zu warten.
  • Ein Ladefehler kommt als Diagnose bei uns an, auch wenn man die Seite vorher verlässt (nur Grund, Code, Versuch und Schritt, keine persönlichen Daten). So sehen wir Störungen.
  • Kommt mit dem nächsten App-Build.
  • Server und Web-App sind unverändert.

v0.21.4 · 2026-10-04

  • iPhone-App: TargetShot Pro ist leichter zu finden.
  • Im Profil führt ein Eintrag „TargetShot Pro ansehen“ zur Bezahlseite in der App.
  • Kann die App die Abo-Angebote nicht laden, sagt sie das klar und bietet „Erneut laden“ an, statt nur einen ausgegrauten Knopf zu zeigen.
  • Kommt mit dem nächsten App-Build.
  • Server und Web-App sind unverändert.

v0.21.3 · 2026-10-04

  • Widerrufsformular: Schutz gegen automatisierte Eingaben.
  • Ein unsichtbares Kontrollfeld und eine Mindest-Ausfüllzeit, die der Server signiert, erkennen Bots. Dazu kommt eine Prüfung typischer Merkmale.
  • Jeder Eingang wird weiter gespeichert und bekommt dieselbe Antwort und dieselbe Eingangsbestätigung wie bisher.
  • Ein Verdachtsfall löst aber keine Einzelmeldung an den Betrieb mehr aus. Er erscheint einmal täglich in einer Sammelübersicht, ohne Namen und Adressen.
  • Ein Konto- oder Vertragstreffer hebt jeden Verdacht auf, der Widerruf wird dann normal bearbeitet.
  • Datenschutzerklärung (Stand 4. Oktober 2026): Abschnitt 9 beschreibt die Missbrauchsabwehr der Widerrufsfunktion.
  • Intern: eine Datenbank-Migration, rein additiv (vier Spalten an den Widerrufserklärungen). Der Zeitstempel des Formulars ist aus einem vorhandenen Geheimnis abgeleitet, eine neue Konfiguration gibt es nicht.

v0.21.2 · 2026-10-02

  • App: neuer Anmeldebildschirm. Er weist auf TargetShot Connect hin und folgt dem hellen oder dunklen Erscheinungsbild des Systems. Kommt mit dem nächsten App-Build.
  • Rechtstexte: Das Stand-Datum lautet jetzt „2. Oktober 2026“. Der Inhalt ist unverändert.
  • Server unverändert.

v0.21.1 · 2026-10-02

  • App: Der Freigabestatus wird beim ersten Laden bis zu zweimal wiederholt. Scheitert der erste Abruf, etwa bei schwachem Netz, zeigt die App nicht gleich einen Fehler. Ein verbleibender Fehlerbericht nennt den Statuscode. Kommt mit dem nächsten App-Build; Server und Web-App sind unverändert.

v0.21.0 · 2026-10-02

  • Pro in der iPhone-App kauft man jetzt über Apples In-App-Kauf. Das Abo läuft über die Apple-ID: bezahlen, verlängern, kündigen und erstatten geht in den Abo-Einstellungen von Apple. In der Web-App kauft man weiter wie bisher. Wer über Apple abonniert hat, kann in der Web-App kein zweites Abo abschließen. Pro gilt, solange eines der beiden Abos läuft; endet das Web-Abo, bleibt ein laufendes Apple-Abo davon unberührt.
  • Die iPhone-App läuft wieder ab iOS 18.0. Seit v0.16.0 brauchte sie iOS 26.2. Das war nur für die EU-Alternativzahlung nötig, die mit dem In-App-Kauf entfällt.
  • Kündigungs- und Widerrufsseite sowie die Mails weisen Apple-Abonnenten auf Apple hin.
  • Neue Fassung der Rechtstexte. Die Datenschutzerklärung beschreibt jetzt die Zahlung über Stripe, den Kauf über Apple und die Website. Die Nutzungsbedingungen haben einen eigenen Abo-Teil mit Widerrufsbelehrung. Impressum und Belehrung nennen eine Telefonnummer.
  • Intern: Der Server prüft Apples signierte Kaufbelege und Apples Server-Benachrichtigungen (App Store Server Notifications V2): Verlängerung, Ablauf, Erstattung, Widerruf. Er übernimmt nur Stände, die neuer sind als der gespeicherte. Ein Abgleich beendet abgelaufene Apple-Abos auch ohne Benachrichtigung.
  • Intern: Der Ablauf-Abgleich der Apple-Abos liest den Plan genauso wie die Pro-Prüfungen. So endet ein abgelaufenes Apple-Abo auch bei unsauber gespeicherten Planwerten zuverlässig.
  • Intern: Der Meldeweg für Käufe außerhalb von Apple (EU-Alternativzahlung) ist abgeschaltet, nicht gelöscht. Der Server nimmt keine Melde-Tokens mehr an. /healthz/apple-iap zeigt ohne Anmeldung, ob der Apple-Kauf konfiguriert und der Meldeweg aus ist.
  • Intern: eine Datenbank-Migration, rein additiv (eine Spalte am Konto, zwei neue Tabellen).

v0.20.0 · 2026-10-02

  • Verträge lassen sich jetzt per Klick widerrufen, ohne Anmeldung. Unter „Vertrag widerrufen“ in der Web-App gibt man Name, die E-Mail-Adresse des Kontos und eine Adresse für die Eingangsbestätigung an. Die Bestätigung kommt sofort per E-Mail. So verlangt es die elektronische Widerrufsfunktion nach § 356a BGB, die seit dem 19.06.2026 gilt. Ob der Widerruf wirksam ist, prüfen wir danach von Hand. In der App kommt derselbe Weg mit dem nächsten App-Build, vor der Anmeldung und im Profil, zusammen mit „Hilfe und Kontakt“.
  • Eigene Scheiben aus allen Vereinen. Wer auch an den Ständen anderer Vereine schießt, sieht im Dashboard und in der Statistik jetzt alle eigenen Scheiben, jede mit dem Namen des Standes. In die Bestenliste und den TargetPass zählen Scheiben von fremden Ständen ab heute mit, nicht rückwirkend. Die Bestenliste zeigt weiterhin nur die eigenen Vereine.
  • Die Pro-Bestellbestätigung kommt genau einmal. Bisher konnte sie doppelt ankommen. Kommt sie gar nicht an, holt der Server sie nach. Er fragt dafür zuerst beim Mailversand nach und sendet nur, wenn die Mail dort unbekannt ist. Bestellübersicht und Bestätigung folgen jetzt § 16 der Nutzungsbedingungen, und die Widerrufsbelehrung nennt die Telefonnummer.
  • Wettkampfhistorie ohne Dubletten. Derselbe Wettkampf erscheint nur noch einmal je Anlage, auch wenn die Anlage ihn mehrfach meldet.
  • Mitgliederverwaltung: gleiche Rechte überall. Der Server wendet beim Einstieg in die Mitgliederverwaltung dieselbe Regel an wie bei der Mitgliederliste.
  • Mit dem nächsten App-Build:
  • Wer die Mitgliederverwaltung nicht nutzen darf, sieht „Kein Zugriff“ statt eines allgemeinen Fehlers.
  • Lange Wettkampf- und Vereinsnamen laufen nicht mehr über den Rand.
  • Bei großer Systemschrift brechen Kennzahl-Beschriftungen, PRO-Kennzeichen und Auswahlkapseln sauber um.
  • Intern: Löschwege für Mitglieder und Konten löschen nur noch über eine eindeutige Sportpass-Nummer. Bei einer Mehrdeutigkeit bleibt eine dauerhafte, pseudonyme Spur für die Nacharbeit. Scheiben werden je Verein gelöscht, die Merkliste wird mitgelöscht.
  • Intern: Die Lexware-Rechnungen gehen an den neuen Host api.lexware.io. Die Schwärzung in Client-Logs greift auch in JSON- und key=value-Texten. Bei den Apple-Melde-Tokens gibt es jetzt Widerspruch, Frist und Auskunft; gesendet wird weiterhin nichts.
  • Intern: drei Datenbank-Migrationen, alle rein additiv (eine Einstellungszeile für den Stichtag und neue Spalten bzw. Tabellen, nichts wird geändert oder gelöscht).

v0.19.0 · 2026-09-29

  • Für Nutzerinnen und Nutzer ändert sich mit diesem Release nichts Sichtbares. Es bereitet den Pro-Kauf in der iPhone-App für Apples neue EU-Regeln vor, die ab dem 01.10.2026 gelten. Wer in der App über einen anderen Zahlungsdienst als Apple kauft, muss Apple diese Käufe monatlich melden. Der Server kann solche Meldungen jetzt vorbereiten. Gesendet wird noch nichts, und die App fragt noch nichts ab: Beides ist an Apples Freischaltung gebunden, die mit einem späteren App-Build eingeschaltet wird.
  • Intern: Käufe, Verlängerungen und Erstattungen aus der App werden so erfasst, wie Apple sie für die Meldung braucht (Abrechnungsgrund, Zeitraum, Produkt). Neu ist ein Register für Apples Melde-Kennungen, das die App später beim Start und vor dem Kauf füllt. Jeder Kauf bekommt daraus nachträglich die Kennung, die zu seinem Zeitpunkt gültig war. Die Kennungen sind pseudonym, die Verknüpfung zum Konto verschwindet mit dem Konto.
  • Intern: Der Gesundheitsendpunkt /healthz/store-reporting zählt zusätzlich App-Käufe ohne Melde-Kennung und Konten, bei denen Apple keine Kennung liefert.
  • Intern: Zwei Datenbank-Migrationen, beide rein additiv (neue Spalten und Tabellen, nichts wird geändert oder gelöscht).

v0.18.1 · 2026-09-29

  • Der Saisonwechsel in der Nacht zum 01.10. läuft ohne Fehlermeldung. Season 0 endet am 30.09. um 23:59 Uhr UTC (01.10., 01:59 Uhr deutscher Zeit), danach beginnt Season 1. Öffnete jemand aus einem Verein die Saison-Seite als Erste oder Erster in der neuen Saison, konnte sie mit „Konnte die Saison nicht laden“ ausfallen. Die Seite lädt Pass, Sammlung und Rangliste gleichzeitig, und alle drei Anfragen wollten die neue Saison zugleich anlegen. Das ist behoben: Eine Anfrage legt die Saison an, die anderen lesen sie.
  • Gefunden hat das die Generalprobe des Saisonwechsels mit vorgestellter Uhr. Der Wechsel selbst ist dabei in allen Teilen belegt: Level-Reset auf 1 (der Karriere-Stand bleibt), Rangliste und Pass zeigen ab 00:00 Uhr UTC Season 1, die Urkunden für Season 0 kommen mit dem Endstand, der September ist bis zum 10.10. nachbuchbar, Nahtwoche und Saisonabschluss bis zum 14.10.
  • Intern: Die Generalprobe bleibt als Test im Backend (saisonwechsel.db.test.ts) und in App und Web erhalten.

v0.18.0 · 2026-09-22

  • Die Bestenliste lässt sich jetzt nach Saison filtern. Im Zeitraum-Auswähler stehen unter den gewohnten Fenstern („letzte 7 Tage" und so weiter) auch die Saisons des Vereins — bei uns die Jahresmeisterschaften. Wer eine davon wählt, sieht genau die Ergebnisse dieser Saison: beste Ringzahl, bester Ringschnitt, bester Teiler und meiste Trainings. Eine Saison ist dabei keine Zeitspanne, sondern die Starterliste aus der Anlage. Das hat einen handfesten Vorteil: die Auswahl kennt genau die Namen, die auch am Stand stehen, und sie verschiebt sich nicht, wenn eine Saison länger dauert als geplant.
  • Welche Listen als Saison erscheinen, entscheidet der Verein. Angeboten werden die Starterlisten, die im Vereinsbereich als Training geführt sind. Wer dort etwas anders zuordnet, ändert damit auch den Saison-Auswähler — es gibt keine zweite Liste, die gepflegt werden müsste.
  • Ausgeblendete Starterlisten zählen in der Bestenliste nicht mehr mit. Blendet der Vorstand eine Liste aus, verschwand sie bisher überall — im Dashboard, in den Berichten, in der Wettkampfhistorie —, nur in der Rangliste nicht. Das ist behoben. Achtung: wo heute etwas ausgeblendet ist, können sich dadurch Plätze und Bestwerte verschieben. Das ist die beabsichtigte Wirkung des Ausblendens, fällt beim ersten Blick aber auf.
  • Intern: Der Saisonfilter und der Ausschluss ausgeblendeter Listen hängen an derselben Stelle wie der Kategorie-Filter und wirken damit in allen Wertungen gleichzeitig, auch in der eigenen, unten angehefteten Zeile. Eine Falle steckte im Ausschluss: Blätter ohne Listenzuordnung — bei uns rund acht Prozent, das freie Training — wären beinahe stillschweigend mit herausgefallen.
  • Noch nicht sichtbar: In der App ist der Saisonfilter gebaut und geprüft, braucht aber einen neuen Store-Build.

v0.17.1 · 2026-09-21

  • Korrektur an den neuen Profilbildern: In seltenen Fällen konnte das Bild einer anderen Person an einem Namen stehen. Betroffen war die Konstellation, in der zwei aktive Konten desselben Vereins auf dieselbe Sportpass-Nummer auflösen und das Konto, dem die Nummer wirklich gehört, kein Bild hinterlegt hat. Dann konnte das Bild des zweiten Kontos an dessen Zeile erscheinen — auch dann, wenn jemand sein eigenes Bild gerade gelöscht hatte. Richtig ist in diesem Fall das Monogramm. Gefunden in der Gegenprüfung durch das zweite Werkzeug, nicht im Betrieb; es gibt keinen Hinweis, dass jemand es gesehen hat.
  • Intern: Die Ursache war eine Sparmaßnahme. Die Abfrage lud nur Mitglieder mit Bild — und entschied damit unbeabsichtigt, wem eine Sportpass-Nummer gehört. Die Zuordnung wird jetzt vor der Bildauswahl entschieden; ein Konto ohne Bild belegt seinen Platz und hält den schwächeren Rückfall fern.
  • Intern: Die Mehrzahl-Schreibweise der Sportpass-Nummer wird auch bei der Mannschafts-Zuordnung nicht mehr gelesen. Der Schreibweg dorthin ist seit v0.17.0 zu; damit wirkt auch ein bereits gespeicherter Altbestand nicht mehr.

v0.17.0 · 2026-09-21

  • Die Bestenliste zeigt jetzt Gesichter. Neben jedem Namen steht das Profilbild des Kontos — und wer keines hinterlegt hat, bekommt sein Monogramm statt eines leeren Platzes. Auch die eigene, unten angeheftete Zeile trägt das eigene Bild, selbst wenn man gerade nicht unter den vorderen Plätzen steht. An den Regeln, wer überhaupt in der Liste erscheint, ändert das nichts: wer „Punkte in Bestenliste teilen" abgeschaltet hat oder keine Schießdaten-Freigabe erteilt hat, steht dort weiterhin nicht — und damit erscheint auch kein Bild.
  • Vereins- und Jugendübersicht bekommen die Bilder vom Server. Sie zeigten sie schon, mussten sie bisher aber über einen zweiten Abruf selbst zusammensuchen. Für Trainerinnen und Trainer ändert sich nichts Sichtbares; die Anzeige wird nur verlässlicher, und dieselbe Quelle trägt ab jetzt auch die App.
  • Intern, Sicherheit: Im Einstellungsdokument eines Kontos war die Mehrzahl-Schreibweise der Sportpass-Nummer (sportpassIds) als einziger Sportpass-Schlüssel nicht gesperrt — die Einzahl war es längst. Gelesen wurde sie an zwei Stellen als Rückfall. Über diesen Weg hätte ein Konto ohne eigene Nummer die Nummer einer anderen Person behaupten und sein Bild an deren Namen hängen können, auch ohne selbst in der Liste zu stehen. Der Schreibweg ist geschlossen, und die Bild-Zuordnung liest die Mehrzahl gar nicht mehr. Kein Hinweis darauf, dass das je genutzt wurde.
  • Intern: Stehen zwei Konten desselben Vereins auf derselben Sportpass-Nummer, entschied bisher die Reihenfolge der Datenbank, welches Bild an der Zeile steht — und die kann sich zwischen zwei Aufrufen ändern. Jetzt gewinnt die Nummer am Konto selbst, nicht die aus den Einstellungen.
  • Intern: Die Wettkampfhistorie des Vereins holte die Bilder mit, obwohl sie nur die Startnummern liest. Zwei Datenbankabfragen weniger je Aufruf.
  • Noch nicht sichtbar: Die Bilder in Bestenliste, Vereins- und Jugendübersicht der App sowie die Kündigungsstrecke nach § 312k in der App sind gebaut und geprüft, brauchen aber einen neuen Store-Build. Bis dahin liefert dieser Release nur die Daten dafür.

v0.16.0 · 2026-09-21

  • TargetShot Pro lässt sich jetzt in der iPhone-App selbst kaufen. Bisher führte der Weg über den Browser: App verlassen, im Web anmelden, dort bezahlen, zurückwechseln. Neu öffnet sich das Zahlungsblatt direkt in der App, mit Apple Pay oder Karte, und der Zugang steht sofort danach. Wird die Freischaltung durch eine langsame Antwort nicht gleich bestätigt, sagt die App das ausdrücklich und bietet „Freischaltung prüfen" an — statt wieder das Kaufangebot zu zeigen, obwohl schon bezahlt wurde. Ein zweiter Druck auf den Bestellknopf ist in diesem Moment gesperrt; er hätte ein zweites Abo angelegt.
  • Das Abo lässt sich in der App kündigen. Der Weg führt ins Stripe-Portal, wie im Web. Öffnet sich das Portal nicht — kein Netz, kein Browser —, sagt die App das jetzt, statt den Druck stillschweigend zu verschlucken.
  • Unter 18 gibt es in der App keine Kauffläche mehr. Dieselbe Regel wie im Web seit v0.15.0, jetzt auch auf dem Telefon: die Fläche erscheint gar nicht erst, statt erst beim Bestellen abzulehnen. Sie bleibt auch dann verborgen, wenn der Server den Berechtigungsstand nicht liefern konnte — im Zweifel geschlossen.
  • Eine Zustimmung ohne Anmeldung trägt jetzt die Sportpass-Nummer. Wer über den Link aus der E-Mail zustimmt, ohne sich anzumelden, hinterliess bisher eine Einwilligung, die auf der Anlage niemandem zugeordnet werden konnte. Sie kam damit nie an der Box an. Bestehende Fälle werden beim nächsten Lauf nachgetragen.
  • Das iPhone braucht jetzt mindestens iOS 26.2. Apples Alternativzahlung in der EU verlangt das; ohne diese Anhebung liesse sich der Kauf in der App nicht anbieten.
  • Intern: Ein Melderegister erfasst jede meldepflichtige Store-Transaktion samt Erstattungen und Rückbuchungen, mit einem eigenen Gesundheitsendpunkt für Widersprüche. Ein täglicher Wächter meldet nicht zustellbare Einwilligungen. Die Stripe-Anbindung liest die zum 2025-03 entfernten Felder (invoice.subscription und Nachbarn) über eine gemeinsame Stelle, mit einem Wächter gegen das versehentliche Wiederauftauchen.
  • Intern: Die Nachreichung von Apples Melde-Kennung ist gebaut, aber abgeschaltet — das Entitlement dafür erwartet Apple ab dem 01.10.2026. Drei bestätigte Befunde auf diesem Weg sind offen; ein Test in der App geht rot, sobald jemand das Entitlement einschaltet, ohne sie geschlossen zu haben.

v0.15.1 · 2026-09-20

  • Beim Kauf von Pro führen Nutzungsbedingungen und Datenschutzerklärung jetzt zu den Fassungen der App selbst. Bisher zeigten die beiden Links in der Bestellübersicht auf targetshot.app — dieselben Texte, aber eine zweite, getrennt ausgelieferte Veröffentlichung. Zugestimmt wurde damit an einer anderen Stelle, als das Dokument zu lesen war. Für englischsprachige Nutzerinnen und Nutzer war das mehr als eine Formsache: die Zustimmungszeile gibt es auf Englisch, die verlinkten Seiten dort nur auf Deutsch. Ab jetzt öffnen beide Links die Fassung der App, in der eingestellten Sprache, und weiterhin in einem neuen Tab — die begonnene Bestellung bleibt stehen.
  • Intern: Ein Test hält das künftig fest. Er prüft die Bestellübersicht so, wie sie im Browser erscheint, und nicht nur die hinterlegten Texte — ein Link, der ins Leere zeigt, fällt in der Anwendung sonst stillschweigend auf die angemeldete Ansicht zurück, ohne Fehlermeldung.

v0.15.0 · 2026-09-16

  • Minderjährige bekommen TargetShot Pro ab jetzt kostenlos über ihren Verein. Wer noch keine achtzehn ist, bekommt Pro über die Club-Plus-Lizenz seines Vereins gestellt — ohne Kauf, ohne Abonnement, ohne Vertrag. Damit entsteht für Minderjährige gar kein Vertragsverhältnis, das die Zustimmung der Eltern bräuchte; die Frage nach einer Eltern-Freigabe stellt sich nicht mehr. Mit dem achtzehnten Geburtstag endet der Anspruch von selbst, und ab dann entscheidet die Person selbst, ob sie Pro kaufen möchte. Für Vereine ist das zugleich ein Argument für Club Plus: die Jugend des Vereins bekommt den vollen Funktionsumfang, ohne dass jemand etwas bezahlt.
  • Der Anspruch endet von selbst — niemand muss ihn entziehen. Er wird bei jeder Anfrage neu ermittelt: aktive Vereinslizenz, bestehende Mitgliedschaft, Alter unter achtzehn. Fällt eines davon weg — der Geburtstag, ein Vereinswechsel, eine gekündigte Lizenz — endet der Zugang im selben Moment. Es gibt keinen Nachtlauf, der das erledigen müsste, und damit auch keinen, der ausfallen könnte.
  • Wer minderjährig ist, kann Pro nicht mehr kaufen. Bisher hätte ein Jugendlicher auf der Preisseite ein Abonnement abschließen können — ein Vertrag, den er ohne seine Eltern gar nicht wirksam schließen kann. Das ist jetzt gesperrt, und zwar auf dem Vertragsweg selbst, nicht nur durch ausgeblendete Schaltflächen. Gesperrt wird ausschließlich, wer nachweislich minderjährig ist: fehlt in den Vereinsdaten ein Geburtsdatum, bleibt der Kauf möglich — sonst träfe die Sperre Erwachsene, deren Verein das Datum nicht gepflegt hat.
  • Und wer doch einmal zu Unrecht gesperrt wird, erfährt den Grund. Steht in den Vereinsdaten ein falsches Geburtsdatum, sagt die Meldung das ausdrücklich und verweist an den Verein — dort lässt es sich korrigieren. Eine allgemeine Störungsmeldung wäre hier die falsche Auskunft: die Sperre geht nicht von selbst weg.
  • Das Profil bietet Minderjährigen kein Abonnement mehr an. Wer Pro über den Verein gestellt bekommt, sah dort bisher „Abo verwalten" und „Pro kündigen" — für ein Abonnement, das es gar nicht gibt. Stattdessen steht dort jetzt, woher der Zugang kommt und bis wann er gilt. Mit achtzehn erscheint das Kaufangebot von selbst wieder.
  • Intern: Ein Weg, über den ein angemeldeter Nutzer eigene Kennungen in seinem Einstellungsdokument überschreiben konnte, ist geschlossen. Der Testversand der Berichte war die einzige Stelle, die den Inhalt einer Anfrage nicht gefiltert hat — und sie speicherte, bevor sie die Berechtigung prüfte. Über diesen Weg ließ sich eine fremde Startnummer hinterlegen, an der anschließend Berichte und die Altersermittlung hängen.
  • Intern: Zwei ältere Fallen beseitigt, die bisher niemandem geschadet, aber auf den nächsten gewartet haben. Eine Funktion zur Bewertung von Vereinslizenzen hätte eine gekündigte Lizenz als gültig gemeldet, sobald man sie mit dem Wert aus der Datenbank statt mit dem aus der Oberfläche aufruft. Und der gespeicherte Tarif eines Nutzers wurde an zwei Stellen unterschiedlich gelesen — ein Altbestand hätte dadurch beim nächsten Speichern still seinen Zugang verloren. Eine lesende Messung auf der Produktivdatenbank hat bestätigt, dass kein einziges Konto davon betroffen war.

v0.14.1 · 2026-09-16

  • Niemand kann sich selbst befördern. Wer Mitglieder verwalten darf — also auch Trainerinnen und Trainer — konnte die eigene Rolle in einem Klick auf „Vereinsleitung" setzen. Daran hängt einiges: das Geburtsdatum der Mitglieder, das Abonnement des Vereins samt Kündigung, der Vereinskalender und die Verwaltung der Vereinsbox. Die Erhöhung wirkte sofort, ohne neue Anmeldung, und hinterließ keine Spur — für Rollenänderungen wird bis heute kein Protokolleintrag geschrieben. Künftig lehnt die Plattform das ab: eine höhere Rolle vergibt jemand anderes. Sich selbst herabzustufen bleibt möglich, und an fremden Rollen ändert sich nichts. Dieselbe Sperre greift an allen drei Stellen, an denen eine Vereinsrolle geschrieben wird — auch bei der Einladung auf die eigene Adresse und beim Mitglieder-Abgleich.
  • Intern: Die iOS-App startete auf iOS 27 überhaupt nicht mehr. Ursache war kein Fehler im App-Code, sondern eine Pflicht, die Apple mit dem neuen Entwicklungswerkzeug scharfgeschaltet hat: Apps müssen den sogenannten Szenen-Lebenszyklus übernehmen, sonst bricht das System den Start ab, bevor die erste Zeile der App läuft. Auf älteren iOS-Fassungen fällt das nicht auf — der Testbau lief, das Gerät stürzte ab. Behoben und nachweislich auf einem iOS-27-Gerät geprüft; der Testflug-Vorlauf prüft die Übernahme jetzt selbst, im Quellstand und im fertigen Paket.

v0.14.0 · 2026-09-15

  • Die Mitgliederliste sagt jetzt, wer minderjährig ist. Bisher stand das Alter nirgends: Vorstand und Administration mussten jede Zeile einzeln öffnen, dort ein Geburtsdatum lesen und im Kopf rechnen — und auf schmalen Bildschirmen war auch das nicht zu sehen. Künftig steht neben dem Namen ein Hinweis „Minderjährig", in der Liste, in der Kartenansicht und in der App. Bei Erwachsenen steht dort nichts; die Liste bleibt ruhig, damit der eine Fall hervortritt, um den es geht. Führt die Vereinssoftware kein verwertbares Geburtsdatum, steht „Alter unbekannt" — auch das ist wichtig zu wissen, denn dort greift die Eltern-Abfrage nicht.
  • Das Geburtsdatum selbst ist ebenfalls sichtbar — und wenn nicht, steht der Grund dabei. Eine leere Zelle hat mehrere Ursachen, und sie führen an verschiedene Orte: „Nicht hinterlegt" heißt, in der Vereinssoftware fehlt es; „Widersprüchlich" heißt, zwei Vereine melden verschiedene Daten für dieselbe Person; „Nicht geprüft" heißt, die Abfrage selbst ist gescheitert. Bisher stand dort nur ein Gedankenstrich. Sichtbar ist das Geburtsdatum ausschließlich für Vorstand und Administration des Vereins, dem die Person angehört — Trainerinnen und Trainer sehen es nicht.
  • Ein Widerruf der Schießdaten-Freigabe ist ab jetzt endgültig. Bisher ließ er sich ungewollt wieder aufheben: Eine widerrufene Freigabe blieb als „minderjährig" eingestuft, und über diese Einstufung stand der Weg über die erziehungsberechtigte Person weiter offen. Wurde er benutzt, galt die Freigabe wieder als erteilt und die Löschung der Schießdaten hörte auf — ohne dass jemand das beabsichtigt hätte. Das ist geschlossen. Wer nach einem Widerruf wieder sichtbar sein möchte, stimmt selbst erneut zu; Dritte können einen Widerruf nicht aufheben.
  • Und wer durch eine falsche Einstufung feststeckte, kommt wieder heraus. War jemand versehentlich als minderjährig eingestuft und hatte widerrufen, ging es weder vorwärts noch zurück. Der Verein kann diese Einstufung jetzt aufheben, ohne den Widerruf anzutasten: Die Löschung läuft weiter, und die betroffene Person kann anschließend selbst neu entscheiden. Aufheben lässt sich die Einstufung nur, wenn das Geburtsdatum aus der Vereinssoftware sie belegt.
  • Die Altersgrenze steht fest bei 16 Jahren und ist jetzt an allen Stellen dieselbe — auch in der Datenschutzerklärung, die den Umgang mit dem Geburtsdatum nun ausdrücklich beschreibt: woher es kommt, wozu es verwendet wird und wer es sehen kann. Ein vorbereitetes Anschreiben an Mitglieder nannte versehentlich 18 und ist berichtigt.
  • Intern: Die Kontaktadresse des Verantwortlichen war in Impressum und Datenschutzerklärung unterschiedlich. Vereinheitlicht auf die Adresse aus dem Impressum, und ein Wächter im Testlauf hält die beiden künftig zusammen.

v0.13.23 · 2026-09-15

  • Die Vereinseinstellungen zeigen jetzt, was der Kalender-Abgleich aufgeräumt hat. Der Abgleich hält seit v0.13.15 fest, wie viele Termine er entfernt hat — und warum er es gegebenenfalls nicht getan hat. Gelesen hat das bisher niemand: die Oberfläche nannte nur „zuletzt abgeglichen" und „übernommen". Nach einem automatischen Lauf — und der ist der Normalfall, alle 15 Minuten — sah ein Vorstand das Ergebnis also gar nicht; die Zahl stand nur in der Rückmeldung, wenn er selbst auf den Knopf drückte. Web und App zeigen jetzt beides: die entfernte Anzahl in der Statuszeile und, falls nicht aufgeräumt wurde, den Grund in einer eigenen Zeile.
  • Intern: Der Starterlisten-Kanal der Vereinsbox nimmt keine Schein-Angaben mehr an. Meldete die Anlage für eine Liste keine Kennung oder keinen Namen, machte die Plattform daraus bisher still eine echte Adresse — bei dieser Vereinssoftware sind 0 und 1 gültige Listenkennungen, und aus „nichts gemeldet" wurde so eine 0. Das war nicht folgenlos: die Meldung schreibt den Namen einer Liste auch dann, wenn es sie schon gibt, ein Schein-Name hätte also eine vorhandene, benannte Starterliste überschrieben — ohne eine Zeile Protokoll. Künftig fällt die einzelne unbrauchbare Zeile, die gesunden Zeilen derselben Meldung kommen an, und eine unbrauchbare Nebenangabe wird zu „nicht gemeldet" statt zu einer erfundenen Zahl. Echte Nullen bleiben echt — die erste angebundene Anlage meldet sie tatsächlich.
  • Intern: Eine einzelne unbrauchbare Zeile lässt nicht mehr die ganze Meldung scheitern. Bisher antwortete die Plattform in dem Fall mit einem Fehler für die komplette Lieferung, und ein unveränderter zweiter Versuch scheiterte genauso — die gesunden Listen kamen nie an. Gefunden in der Gegenprüfung.

v0.13.22 · 2026-09-14

  • Die dritte Stelle, an der jemandem sein Verein wegkam, ist zu. „Vereine bearbeiten" in der Mitgliederverwaltung schrieb die Vereinszugehörigkeit einer Person komplett neu — und hat damit still jeden Verein entfernt, der außerhalb des eigenen Bereichs lag. Kein Fehler, kein Hinweis, und die betroffene Person merkte es erst beim nächsten Anmelden. Damit machte diese eine Stelle die beiden Korrekturen aus v0.13.21 bei der nächsten Mitgliederpflege wieder rückgängig. Künftig gilt dieselbe Regel wie dort: Im eigenen Verein entscheidet der Vorstand, auch entfernend. Ein fremder Verein, in dem die Person noch Mitglied ist, wird durchgereicht statt überschrieben. Ein Rest ohne Mitgliedschaft wird weiterhin aufgeräumt.
  • Lässt sich das nicht sicher entscheiden, wird gar nichts geschrieben. Fehlt beim Speichern eine der beiden Auskünfte — der bisherige Stand oder die Mitgliedschaften —, kann niemand unterscheiden, was belegt ist und was ein Rest. Die Änderung wird dann abgelehnt statt geraten; der Vorstand bekommt eine Fehlermeldung und kann es erneut versuchen. Lieber ein sichtbarer Fehlschlag als eine stille Löschung.
  • Intern: Das Admin-Portal führt Vereine aus der Vereinssoftware jetzt mit ihrem Landesverband und erkennt Doppeleinträge. Hintergrund: Die Vereinssoftware eines Vereins führt denselben Nachbarverein oft mehrfach — einmal mit seiner echten Verbandsnummer und zusätzlich als Gasteintrag, den jemand für einen Wettkampf angelegt hat. Beim ersten angebundenen Verein sind das 106 Einträge für 64 tatsächliche Vereine. Der Katalog benennt diese Doppel jetzt, entscheidet aber nichts und löscht nichts. Eine fehlende Verbandsangabe heißt dort ausdrücklich „nicht gemeldet" und nicht „gehört keinem Verband an" — sie fehlt auch bei echten Vereinen.
  • Intern: Für diese Anzeige meldet die Vereinsbox zusätzlich die Verbandsnummer und deren Klartext. Weiterhin ohne Personenbezug: übertragen werden ausschließlich Nummer und Name des Vereins.

v0.13.21 · 2026-09-14

  • Eine Einladung nimmt niemandem mehr seinen Verein weg. Wer bereits in einem TargetShot-Verein war und anschließend woanders eingeladen wurde — etwa als erster Vorstand seines eigenen, neu dazukommenden Vereins —, verlor den bisherigen Verein: Die Mitgliedschaft stand zwar noch da, der Zugriff war trotzdem weg. Künftig kommt der neue Verein dazu, statt den alten zu ersetzen. Hinweis: Der bisherige Hauptverein bleibt dabei der Hauptverein; nach dem Anmelden landet man also weiterhin dort und wechselt bei Bedarf.
  • Auch „Mitglied abgleichen" nimmt keinen fremden Verein mehr weg. Das war die zweite Hälfte desselben Falls: Wer als Vorstand seines eigenen Vereins eingeladen wurde, verlor ihn beim nächsten Abgleich seines anderen Vereins wieder.
  • Die Handicap-Faktoren kommen jetzt von der Anlage. Auflage gegen Freihand, Luftpistole gegen Luftgewehr — diese Faktoren mussten bisher von Hand eingetragen werden, obwohl die Anlage sie kennt. Künftig übernimmt die Plattform sie, sichtbar im Feld und jederzeit überschreibbar. Übernommen wird nur, was eindeutig ist: Rechnet eine Veranstaltung nach einem anderen Schema als „Auflage mal, Luftpistole geteilt", bleibt die bisherige Einstellung stehen — beim ersten angebundenen Verein betrifft das den Ringkönig, der beide Seiten fein gegeneinander justiert statt auszugleichen.
  • Intern: Die Release-Wege für App Store und Play Store liegen jetzt als Skripte im Repository statt nur in Runbooks. Sie beantworten, wer einen Build tatsächlich bekommt — die Runbooks waren an dieser Stelle überholt.

v0.13.20 · 2026-09-14

  • Die Anlage sagt jetzt selbst, wie ein Preisschießen gewertet wird. Bisher musste der Vorstand für jede Veranstaltung von Hand einstellen, ob nach bestem Teiler oder nach Ringen rangiert wird — obwohl die Anlage es längst weiß. Künftig übernimmt die Plattform diese Angabe, sichtbar im Feld und jederzeit überschreibbar. Wer eine Veranstaltung selbst einstellt, behält seine Entscheidung.
  • Übernommen wird nur, was eindeutig ist. Eine Liste kann auf der Anlage mehrere Wertungen führen — etwa eine Einzel- und eine Mannschaftswertung, die verschieden rechnen. Die Mannschaftswertung bleibt außen vor, sie bestimmt keine Einzelrangliste. Sind sich die übrigen einig, gilt ihre Angabe. Widersprechen sie sich, wird nichts übernommen und die bisherige Einstellung bleibt stehen. Beim ersten angebundenen Verein betrifft das genau eine Veranstaltung: Beim Kirchweih- und Königsschießen laufen zwei verschiedene Preisschießen nebeneinander — „Blattl" nach Teiler, „Ring" nach Ringen. Da wäre jede automatische Antwort geraten.
  • Nicht übernommen wird, wie viele Schüsse zählen. Die Anlage sagt, was gemessen wird — Teiler, Ringe, Zehntelringe —, aber nicht, ob das beste Zehn-Schuss-Ergebnis oder die Gesamtsumme rangiert. Diese Angabe gibt es dort schlicht nicht. Sie bleibt deshalb eine Einstellung des Vereins.
  • Intern: Eine Veranstaltung, deren Einstellung nur angezeigt und unverändert zurückgespeichert wurde, galt danach als ausdrücklich entschieden. Bei Listen, die erst durch die Anlage zum Preisschießen wurden, hätte das ihre Ergebnisse sichtbar gemacht, ohne dass jemand sie freigegeben hat. Behoben.

v0.13.19 · 2026-09-14

  • Schießen ohne Startliste taucht endlich in den Vereinseinstellungen auf. Wer an der Anlage schießt, ohne dass eine Startliste läuft, erzeugt Ergebnisse, die die Anlage unter „keine Liste" führt. Diese Ergebnisse zählten in Übersicht, Bestenliste, Berichten und Herausforderungen schon immer mit — in den Einstellungen waren sie aber nicht zu sehen, und damit ließ sich auch nichts daran ändern. Beim ersten angebundenen Verein sind das rund 8 von 100 Scheiben, laufend. Künftig steht dafür eine eigene Zeile in der Starterlisten-Übersicht, ausdrücklich gekennzeichnet als kein Eintrag der Anlage. Sie lässt sich wie jede andere Liste zuordnen oder ausblenden.
  • Warum das wichtig ist: Ohne Namen kann die Plattform nicht erkennen, worum es sich handelt — sie nimmt Training an. Das ist in aller Regel richtig, war aber bisher eine stille Annahme, die niemand prüfen oder korrigieren konnte. Jetzt ist beides möglich.
  • Intern: Ein Verein, der eine Liste ausblendet, tat das bisher auf fünf von sechs Flächen wirksam — im Mitglieder-Dashboard wirkte es für Listen ohne Namen nicht. Behoben.

v0.13.18 · 2026-09-14

  • Die Anlage meldet jetzt auch, wie sie wertet. Bisher kannte die Plattform nur, dass eine Liste ein Preisschießen ist — nicht, ob die Anlage nach bestem Teiler, nach Ringen oder nach Zehntelringen rangiert, und mit welchem Faktor sie Auflage gegen Freihand und Luftpistole gegen Luftgewehr verrechnet. Genau diese Angaben werden jetzt übernommen und aufbewahrt, samt ihrer Bezeichnung auf der Anlage („Allgemein", „Auflage", „Mannschaft").
  • Ausgewertet wird davon weiterhin nichts, und das mit Absicht. Eine Liste führt auf der Anlage oft mehrere Wertungen nebeneinander — bei manchen widersprechen sie sich sogar in der Wertungsart. Welche davon eine Veranstaltung bestimmt, ist eine Entscheidung des Vereins und keine, die die Plattform hinter dem Rücken trifft. Erst wenn die Zahlen da sind, lässt sich darüber überhaupt sinnvoll entscheiden. Bis dahin ändert sich an Ranglisten und Ergebnissen nichts.
  • Intern: Beim Übernehmen von Anlagendaten konnte eine fehlende oder unbrauchbare Angabe stillschweigend zu einer echten Kennung werden und damit einen vorhandenen Datensatz überschreiben — bei den Starterlisten-Stammdaten hätte das den Listentyp und beide Datumsangaben überschrieben. Die Übernahme prüft jetzt durchgängig auf echte Zahlen; eine unbrauchbare Zeile fällt, eine unbrauchbare Einzelangabe bleibt leer, und der Rest einer Lieferung geht unverändert durch.
  • Intern: Auf den Anlagen ist der neue Teil des Kanals noch nicht freigeschaltet — er wird in einem eigenen Schritt ausgerollt. Bis dahin liefern die Boxen unverändert weiter.

v0.13.17 · 2026-09-13

  • Das Enddatum eines Preisschießens kommt jetzt von der Anlage. Wer den Freigabemodus „Nach Veranstaltungsende" nutzt, musste das Datum bisher für jede Veranstaltung von Hand eintragen — ohne Datum endete sie nie von selbst. Künftig füllt die Anlage das Feld, sobald sie den Termin kennt. Die eigene Eingabe bleibt die stärkere: Wer ein Datum selbst setzt oder bewusst herausnimmt, behält seine Entscheidung, und keine Auffrischung dreht sie zurück. Das übernommene Datum ist sichtbar im Feld — es wirkt nichts im Verborgenen. Hinweis für Vereine mit Freigabe „Nach Veranstaltungsende": Veranstaltungen, deren Termin noch in der Zukunft liegt, zeigen ihre Ergebnisse ab jetzt erst nach diesem Termin. Vorher waren sie ohne Datum durchgehend sichtbar.

v0.13.16 · 2026-09-13

  • Die Preisschieß-Einstellungen wirken wieder. Wer in den Vereins-Einstellungen für eine einzelne Veranstaltung etwas eingestellt hat — Wertung, Freigabe, Auflage-Faktor, Enddatum —, bekam „Gespeichert" zu sehen, und gespeichert wurde nichts. Jede Zeile zeigte dieselben Vorgaben, und der Vorstand hatte keine Möglichkeit, das zu bemerken. Das ist behoben: Die Einstellung einer Zeile kommt an, wird beim nächsten Öffnen wieder angezeigt, und lässt sich auch wieder zurücknehmen. Kann eine Einstellung ausnahmsweise nicht gespeichert werden, sagt die Oberfläche es jetzt, statt Erfolg zu melden. Während eines laufenden Speichervorgangs ist die Preistabelle gesperrt — was man nicht ändern kann, geht auch nicht verloren.
  • Die Plattform kann die Zuordnung von der Anlage übernehmen. Bisher wurde am Namen geraten, ob eine Liste Training, Wettkampf oder Preisschießen ist — ein „Blattlschießen" oder „Adventsschießen" galt damit als Training. Künftig zählt die Angabe der Anlage selbst. Die ausdrückliche Zuordnung des Vereins bleibt in jedem Fall die stärkere: Wer die Jahresmeisterschaft als normalen Trainingsabend führt, stellt sie um, und keine Auffrischung dreht das zurück. Wird eine Liste erst durch die Anlage zum Preisschießen, bleiben ihre Ergebnisse zurückgehalten, bis der Vorstand sie freigibt — es wird also nichts veröffentlicht, was vorher nie ein Preisschießen war. Wirksam wird das alles erst, wenn der Kanal auf der Anlage freigeschaltet ist; bis dahin ändert sich nichts.
  • Intern: Der Stammdatenkanal nimmt jetzt auch die Auswertungsvorschrift und die Handicap-Faktoren einer Anlage entgegen. Ausgewertet wird davon noch nichts.

v0.13.15 · 2026-09-13

  • Im Kalender gelöschte Termine verschwinden jetzt auch aus der App. Der Vereinskalender wurde bisher nur ergänzt, nie aufgeräumt: Wer einen Termin in seinem Kalender löschte, sah ihn in der App trotzdem weiter — dauerhaft. Der Abgleich entfernt solche Termine jetzt, und ebenso ausdrücklich abgesagte. Aufgeräumt wird aber nur, wenn der Abgleich sich seiner Sache sicher ist: War ein Kalender nicht erreichbar, unvollständig oder nicht auswertbar, ließen sich die Einstellungen nicht lesen, oder ist für den Verein gar kein eigener Kalender eingetragen, bleibt der Bestand unangetastet — und die Vereinseinstellungen sagen, warum. Von Hand angelegte Termine und alles Vergangene werden nie angefasst, Termine anderer Vereine ebenso wenig, und wenn auf einmal ungewöhnlich viele Termine wegfielen, verweigert der Abgleich lieber, statt einen Kalender leerzuräumen. Die entsprechende Meldung in der App kommt mit dem nächsten App-Update; im Web ist sie sofort da.
  • Der Meyton-Stammdatenkatalog kommt auf die Plattform. Erste Stufe: Die Plattform kann Disziplinen, Scheibenbilder und Preisscheiben einer Anlage entgegennehmen und aufbewahren. Ausgewertet wird davon noch nichts, und auf den Anlagen ist der Kanal weiterhin abgeschaltet — er wird in einem eigenen Schritt freigegeben.
  • Intern: Ein fehlgeschlagenes Speichern einer Kalender-Einstellung wird nicht mehr als Erfolg gemeldet. Bisher konnte eine Einstellung als „gespeichert" quittiert werden, obwohl sie nur flüchtig abgelegt war und beim nächsten Neustart verschwunden wäre.

v0.13.14 · 2026-09-10

  • Profilbild in der App: Auswählen, aufnehmen, zuschneiden und entfernen geht jetzt direkt in der App — bisher ging das nur im Web. Das Bild wird vor dem Hochladen auf ein vernünftiges Maß gebracht, damit es auch bei schwachem Empfang am Stand durchkommt. Die App-Fassung dafür liegt in der internen Testverteilung.
  • Der Bildwechsel verliert nichts mehr. Bisher wurde das bisherige Bild entfernt, bevor der neue Stand gespeichert war: ging beim Speichern etwas schief, zeigte das Profil auf ein Bild, das es nicht mehr gab. Jetzt wird erst der neue Stand festgeschrieben und das alte Bild danach entfernt. Und wer sein Bild auf zwei Geräten gleichzeitig ändert, verliert keines davon mehr — bisher konnte das zweite Bild hochgeladen werden und trotzdem unauffindbar bleiben.
  • Vereinsbezug in den Starterlisten: Ein abgelehnter Vereins-Zugriff wird nicht mehr stillschweigend überschrieben, Vereinseinstellungen werden nie mehr für „alle Vereine" gespeichert, ein fehlender Vereinsbezug wird verständlich gemeldet statt als roher Schlüssel, und Speicherfehler landen nicht mehr im Kanal für Ladefehler.

v0.13.13 · 2026-09-10

  • „Profilbild entfernen" sagt jetzt die Wahrheit. Der Weg meldete an mehreren Stellen Erfolg, obwohl das Bild liegen blieb. Lag kein lokales Bildverzeichnis vor — und das ist der Fall, sobald die Bilder im Cloud-Speicher liegen —, scheiterte der Löschversuch mit einem Serverfehler. Verweigerte der Bildspeicher die Löschung oder war er gerade nicht verbunden, verschwand das Bild trotzdem aus dem Profil und blieb unter seiner alten Adresse abrufbar, samt der einzigen Angabe, mit der man es je wieder hätte treffen können. Wer sein Bild löschte, während auf einem anderen Gerät gerade ein neues hochlud, verlor das neue still. Und wenn sich Anmeldename oder Sportpass-Nummer nach dem Hochladen geändert hatten, suchte der Weg eine Datei, die es nie gab. Jetzt wird nur geleert, was auch gelesen wurde; was nicht sicher gelöscht werden konnte, meldet einen ehrlichen Fehlschlag statt eines falschen Erfolgs — ein zweiter Versuch räumt dann auf. Die Bedienung dazu — Profilbild in der App auswählen, aufnehmen, entfernen — kommt mit dem nächsten App-Update.
  • Intern: Die Aufbewahrungsfrist der Client-Protokolle steht nur noch an einer Stelle. Standen dort zwei Zahlen, konnten die beiden Lesepfade auf dieselben Daten auseinanderlaufen, sobald jemand nur eine davon anfasst.

v0.13.12 · 2026-09-07

  • Intern: Die Log-Suche im Verwaltungsbereich findet eine Route jetzt unabhängig von der Schreibweise. Bisher verglichen Meldung und Absenderkennung ohne Rücksicht auf Groß- und Kleinschreibung, Route und Nutzerkennung daneben aber nicht — eine Suche nach „/training" ließ eine Zeile mit „/Training" einfach aus, ohne Fehler und ohne leeres Ergebnis. Derselbe Fehler stand im zweiten Lesepfad auf dieselben Daten und wurde mitgezogen; sonst hätte die eine Abfrage gefunden, was die andere übersieht. Keine Änderung an der Anwendung.

v0.13.11 · 2026-09-07

  • Intern: Die Abnahme des Prod-Ingest-Ausrollens prüft den Zeitgeber jetzt an der richtigen Stelle — die Azure-Verwaltungsschnittstelle listet Zeitgeber-Auslöser nicht, was am 06.09. einen fehlerfreien Ausrollvorgang rot gemeldet hat. Keine Änderung an der Anwendung.

v0.13.10 · 2026-09-06

  • Vereine, die eine Box kennt, werden im Verwaltungsbereich sichtbar: Bisher tauchte ein Verein dort erst auf, wenn jemand in ihm eingewilligt und geschossen hatte — eine frisch angeschlossene Anlage blieb unsichtbar, obwohl sie die Vereine ihres Kreises längst kennt. Ein eigener Kanal meldet jetzt Vereinsnummer und Vereinsname. Bewusst ohne Personenbezug: Wer dort schießt und wie, bleibt vollständig einwilligungspflichtig. Der Kanal ist auf den Anlagen per Vorgabe abgeschaltet und hat von Anfang an einen Löschweg — was eine Anlage nicht mehr meldet, gilt als entfallen.
  • Die Aufnahme auf Prod meldet ihren Zustand: Bis jetzt stand die Station „Plattform" der Vereinskarte ohne Anhaltspunkt da, weil nur die Staging-Aufnahme einen Zustand schrieb. Der neue Zettel unterscheidet die Betriebsart: Für eine ereignisgetriebene Aufnahme heißt „seit Stunden nichts verarbeitet" nicht „steht", sondern „gerade schießt niemand" — sonst stünde die Station an jedem schießfreien Abend auf Warnung. Ob Daten fehlen, obwohl welche kommen müssten, beantwortet weiterhin der Frische-Wächter. Wird nach diesem Release auf der Anlage freigeschaltet.

v0.13.9 · 2026-09-06

  • Die Aufnahme aus der Cloud verliert keine Nachricht mehr: Jede Nachricht einer Charge wird für sich verarbeitet; eine fehlerhafte reißt die übrigen nicht mehr mit. Fehler nennen Partition, Position und Fehlercode im Protokoll, und die Charge wird bis zu zehnmal über rund fünfundzwanzig Minuten wiederholt. Bisher verwarf eine einzige werfende Nachricht den Rest der Charge, während der Lesezeiger weiterrückte.
  • Eigener Ausrollweg für die Aufnahme-Funktion: Ein Arbeitsablauf baut, verteilt und prüft die vier Funktionen, mit einem Wächter, der nicht ausrollt, solange auf dem Treffer-Kanal Nachrichten ankommen. Bleibt die Messreihe leer, gilt das als „läuft" und der Lauf bricht ab.
  • Frische-Wächter nachgezogen: Der Zeitversatz wird vorzeichenbehaftet gerechnet, und die Datumsprüfung deutet keine Zeichenketten mehr um.
  • Offline heißt jetzt offline: Teilen-Knöpfe sagen bei fehlender Verbindung „keine Verbindung" statt „keine Freigabe".

v0.13.8 · 2026-09-03

  • Der Frische-Wächter ist scharf: GET /healthz/data-freshness meldet, ob nach dem letzten Trainingsabend Schießdaten in der Cloud angekommen sind; ein täglicher, von Box und Runner unabhängiger Lauf mailt bei Ausbleiben. Das Alter wird gegen die Server-Uhr gerechnet, nicht gegen die Sitzungszeitzone der Datenbank. Bekannter Blindfleck: An Abenden, an denen kein eingewilligter Schütze schießt, meldet er zu Recht „nichts angekommen" — bis die Box den Nenner liefert, ist ein roter Lauf ein Prüfauftrag, kein Alarm.
  • Zurück-Navigation in der App: Der System-Zurück auf Android und ein Kantenwisch am linken Rand auf iOS tun jetzt dasselbe wie der Zurück-Pfeil; die Android-Kopfzeile ist aufgeräumt (Pfeil nicht mehr in der Statusleiste, Titel zentriert). Wirksam mit dem nächsten App-Update.
  • Intern: Reste der Confluent-Zeit aus Backend und Doku entfernt; zwei stille Fehler behoben (doppelte Maskierung in der Dashboard-Antwort, Vereinsname im Web-Profil erst ab der zweiten Mannschaftszeile); die Prod-Ingest-Doku nennt jetzt die richtige Ressourcengruppe.

v0.13.7 · 2026-09-02

  • „Meine Daten anfordern": die Datenauskunft nach Art. 15 DSGVO ist da. Ein Knopf im Profil liefert eine JSON-Datei mit allen eigenen Daten — samt Pflichtangaben zu Zwecken, Empfängern und Speicherdauer. Streng auf die eigene Person begrenzt: Schießdaten kommen nur aus den eigenen Vereinen, fremde Kennungen sind maskiert. Im Web sofort, in der App mit dem nächsten Update.
  • Die Kontolöschung räumt jetzt auch die Standaufsicht: Listeneintrag, Schicht-Zuweisungen und Tauschanfragen einer gelöschten Person verschwinden vom Brett — vorher blieben Name und Sportpass-Nummer dort stehen.

v0.13.6 · 2026-09-01

  • Die ersten drei Saisons haben Namen: Season 1 „Precision" (ab 01.10.2026), Season 2 „The Duel", Season 3 „Champions" — die Vorsaison bleibt „First Shot".
  • Die App meldet Fehler künftig automatisch an denselben geschützten Kanal, den die Weboberfläche schon nutzt — sparsam gebündelt, ohne persönliche Daten, mit 30 Tagen Aufbewahrung. Wirksam mit dem nächsten App-Update; dieses Release bringt die Serverseite samt Unterscheidung von Web- und App-Meldungen in der Admin-Ansicht.
  • Intern: Aufräum-Werkzeug für verwaiste Fotos jetzt auch für die Produktivumgebung; reine Doku-Änderungen blockieren die Prüfkette nicht mehr.

v0.13.5 · 2026-09-01

  • Die Bestellbestätigung für TargetShot Pro trägt jetzt die vollständige Widerrufsbelehrung — samt Muster-Widerrufsformular und dem Kündigungslink, der ohne Anmeldung funktioniert. Bisher stand dort nur der Hinweis auf das Erlöschen des Widerrufsrechts.

v0.13.4 · 2026-09-01

  • Nach jedem Kauf kommt jetzt eine Vertragsbestätigung per E-Mail — mit Leistung, Preis, Zeitpunkt, Kündigungslink, Widerrufsbelehrung und Muster-Widerrufsformular (§ 312f BGB). Für Pro-Abos und Club Plus gleichermaßen.
  • Rechnungen kommen künftig aus Lexware Office. Jede bezahlte Abo-Abbuchung erzeugt automatisch eine ordentliche Rechnung mit fortlaufender Nummer und Kleinunternehmer-Hinweis; das PDF kommt per E-Mail. Die Stripe-Belegmails sind dafür abgeschaltet — es gibt nur noch eine Rechnung je Zahlung.

v0.13.3 · 2026-09-01

  • Das Personenprofil zeigt, woher die Punkte kommen. Neuer Abschnitt „Herausforderungen": jede SP-Buchung der laufenden Saison mit Grund, Datum und Punktzahl — Trainingsabende, Wochenziele, Duelle. Der bisherige Abschnitt „Abgeschlossen" heißt jetzt „Auszeichnungen", denn genau das zeigt er.

v0.13.2 · 2026-08-30

  • Profilbilder in der Saison-Rangliste. Wer ein Bild hinterlegt hat, wird jetzt auch mit Bild geführt — in der Rangliste, auf der Startseite der Saison und im Profil. Es gilt dieselbe Regel wie für den Namen: sichtbar ausschließlich bei Mitgliedern, die ihre Ergebnisse für den Verein freigegeben haben.
  • Das Profil einer Person zeigt jetzt die Duell-Bilanz. Gewonnen, verloren und — falls vorhanden — unentschieden, über alle Zeiten. Geisterduelle gegen die eigene Bestleistung zählen nicht mit.
  • Und welche Auszeichnungen jemand bereits erreicht hat. Aufgeführt sind die dauerhaft vergebenen Auszeichnungen mit Stufe und Datum — nicht die Wochen- und Monatsaufgaben, die sich ohnehin jede Periode zurücksetzen.

v0.13.1 · 2026-08-30

  • Die Saison-Rangliste erscheint jetzt schon, wenn sich zwei messen. Bisher blieb sie verborgen, bis mindestens drei weitere Vereinsmitglieder ihre Ergebnisse freigegeben hatten. Für kleine Vereine hieß das: kein Vergleich, obwohl beide Beteiligten längst freigegeben hatten. Es genügt jetzt ein weiteres freigebendes Mitglied. Am Schutz ändert sich nichts — es erscheint weiterhin ausschließlich, wer seine Ergebnisse für den Verein freigegeben hat, und nur innerhalb des eigenen Vereins. Dasselbe gilt für die Ehrentafel.

v0.13.0 · 2026-08-30

  • Der Rang wird sichtbar, wo man ihn sieht: am Profilbild. Wer im TargetPass Ränge sammelt, trägt sie jetzt als Rahmen um das eigene Bild — in der Rangliste, im Duell, im Profil. Ab Elite kommt ein Lorbeerkranz dazu. Entscheidend: der Rahmen zeigt den höchsten je erreichten Rang, nicht den der laufenden Saison. Er verschwindet also nicht, wenn am 1. Oktober eine neue Saison beginnt.
  • Abgelöst am 12.10.2026: Mit dem nächsten App-Build zeigt der Rahmen den Rang der laufenden Saison; der höchste je erreichte Rang steht als Abzeichen im Profil und auf der Ehrentafel. Siehe „Der Rangrahmen zeigt jetzt den Rang der laufenden Saison“.
  • Neu: die Ehrentafel des Vereins. Sie führt den höchsten Rang jedes Mitglieds — saisonübergreifend, nach Rang gruppiert und ohne Platzziffern. Sie erscheint, sobald mindestens drei weitere Mitglieder ihre Ergebnisse freigegeben haben; bis dahin sieht man die eigene Zeile.
  • Neu: eine Urkunde für jede abgeschlossene Saison. Sie hält fest, welchen Rang man erreicht hat, mit wie vielen Punkten und auf welchem Platz. Wer Legendary erreicht, bekommt die ausgezeichnete Fassung. Die erste Urkunde entsteht mit dem Ende der Vorsaison am 30. September.
  • Neu: Profile der Vereinsmitglieder. Aus Rangliste und Duellen führt jetzt ein Weg zu einer Person: Rang, Saisonpunkte, Platz, frühere Saisons und die gemeinsame Duell-Bilanz. Sichtbar ausschließlich für Mitglieder, die ihre Ergebnisse freigegeben haben — ohne Freigabe gibt es das Profil nicht.
  • Die Saison-Rangliste zeigte Mitglieder, die gar nicht mitspielen konnten. Saisonpunkte werden nur für Konten mit Pro gebucht; in der Liste standen trotzdem alle Vereinsmitglieder, die meisten mit null Punkten. Das ist behoben — die Rangliste führt jetzt nur, wer auch Punkte sammeln kann.

v0.12.0 · 2026-08-28

  • Der Saison-Pass geht bis Stufe 18 statt bis 15. Drei Stufen kommen oben dazu; die bisherigen fünfzehn bleiben punktgenau, wie sie waren — niemand springt dadurch auf eine andere Stufe, und bereits verdiente Auszeichnungen bleiben unberührt. Neu ist eine Diamant-Auszeichnung für den vollen Pass. Die Stufen tragen jetzt außerdem Ränge: von Rookie über Marksman, Sharpshooter, Expert und Elite bis Legendary, jeweils in drei Abstufungen.
  • Die Saison hat einen Namen. Die Vorsaison heißt First Shot. Der Name steht künftig über der Saison, die Nummer bleibt daneben stehen.
  • Für die TargetShot-App (geschlossene Testphase): Die Saison-Fläche heißt jetzt TargetPass und ist von Grund auf neu gestaltet — mit eigenem Zeichen, eigener Schrift und einem Rangabzeichen, das mit jeder Stufe wächst. Statt vier gleich aussehender Kacheln zeigt die Startseite jetzt, wo du stehst und was dir noch fehlt: die Wochenaufgaben mit ihrem Fortschritt, die laufenden Duelle mit Spielstand, deine Nachbarn in der Rangliste. Neu sind eine Rangleiter mit allen achtzehn Stufen auf einen Blick und ein Moment beim Stufenaufstieg. Die Fläche gibt es jetzt in hell und dunkel, passend zur eingestellten Darstellung. Erreicht die Testgeräte mit dem nächsten App-Build.

v0.11.5 · 2026-08-28

  • Der Vereinspreis auf der Preisseite war falsch — jetzt stimmt er. Dort standen 179 € im Monat und 1.890 € im Jahr. Tatsächlich abgerechnet werden 149 € im Monat oder 1.690 € im Jahr, dazu einmalig 349 € für die Einrichtung. Die Zahlen stammten aus einem alten, nie genutzten Preismodell und waren seit März nicht mehr an die Abrechnung angeglichen worden. Für bestehende Vereinslizenzen ändert sich dadurch nichts — abgerechnet wurde immer schon der richtige Betrag.
  • Zurückgezogene Ergebnisse zählen nicht mehr in Berichten mit. Wird ein Blatt an der Anlage annulliert, verschwindet es damit auch aus dem Vereinsbericht an Trainer und Vorstand sowie aus dem Bericht zu einer einzelnen Session. Bisher tauchte es dort weiterhin auf und verfälschte die Auswertung.
  • Für die TargetShot-App (geschlossene Testphase): Die Nachfrage, ob du Mitteilungen erlauben möchtest, blieb bisher nur einen Augenblick sichtbar und verschwand dann von selbst — man kam gar nicht dazu, sie zu beantworten. Sie bleibt jetzt stehen, bis du entscheidest. Erreicht die Testgeräte mit dem nächsten App-Build.

v0.11.4 · 2026-08-25

  • E-Mails über Tauschanfragen und Duelle kommen jetzt an. Bisher waren E-Mail-Benachrichtigungen standardmäßig abgeschaltet — wer seine Einstellungen nie geändert hatte, erfuhr von einer Standaufsicht-Tauschanfrage oder einer Duell-Einladung erst beim nächsten Öffnen der App. Genau diese vier Nachrichten (Tauschanfrage und Antwort darauf, Duell-Einladung und Antwort darauf) kommen jetzt von sich aus per E-Mail. Abbestellen lässt sich das weiterhin in den Einstellungen, und wer dort bereits abbestellt hatte, bleibt abbestellt. An allen übrigen Benachrichtigungen ändert sich nichts.
  • Die Preisseite sagt endlich, dass Pro die Saison enthält. Wer ohne Pro auf „Herausforderungen" klickte, landete auf der Preisseite — und las dort fünf Punkte über Statistiken, Export und Ziele, aber kein Wort über Saison, Duelle oder Rangliste. Genau das, wofür er gekommen war, stand nicht auf der Karte. Jetzt steht es dort, und zwar an erster Stelle.
  • Für die TargetShot-App (geschlossene Testphase): Die App fängt sich jetzt selbst, statt bei einem Fehler wegzureißen. Bisher führte eine Störung in einer Ansicht dazu, dass die App verschwand — ohne Hinweis, und ohne dass wir davon erfuhren. Jetzt erscheint eine Seite mit einer Erklärung, einem Knopf zum erneuten Versuchen und einem Bericht, den du uns direkt schicken kannst. Erreicht die Testgeräte mit dem nächsten App-Build.

v0.11.3 · 2026-08-24

  • Ein gelöschtes Konto kündigt jetzt auch sein Pro-Abo. Wurde ein Mitglied vom Verein entfernt und sein Konto nach der 30-Tage-Frist endgültig gelöscht, lief das persönliche Pro-Abo bei unserem Zahlungsdienstleister weiter — es wurde also weiter abgebucht, obwohl es das Konto nicht mehr gab. Das Abo wird jetzt gekündigt, bevor das Konto verschwindet. Wer nur den Verein wechselt, behält Konto und Abo unverändert: gekündigt wird ausschließlich, was mit dem Konto selbst untergeht.
  • Ein Verein kann seine letzte Vereinsleitung nicht mehr verlieren. Bisher ließ sich die letzte Person mit Verwaltungsrechten löschen oder auf ein einfaches Mitglied zurückstufen. Danach konnte niemand mehr die Mitglieder oder das Vereinsabo verwalten — auch nicht kündigen. Beide Wege sind jetzt gesperrt, mit einer Meldung, die sagt, was zu tun ist: erst jemand anderen zur Vereinsleitung machen.
  • Beim Löschen bleibt nichts Persönliches zurück. Namen aus Duell-Titeln, Duell-Ergebnissen und den Benachrichtigungen der Mitspieler werden jetzt mit entfernt oder neutralisiert; dasselbe gilt für Protokoll- und Versanddaten. Der Vereinspfad räumt damit genauso gründlich auf wie die Selbstlöschung.
  • Kein unerwartetes Abmelden mehr bei Serverproblemen. Konnte der Server kurzzeitig die Anmeldedaten nicht nachschlagen, wurde man behandelt, als sei die Anmeldung ungültig — die App warf einen hinaus. Jetzt wird sauber unterschieden: eine ungültige Anmeldung bleibt eine ungültige Anmeldung, eine Serverstörung meldet sich als Störung, und man bleibt angemeldet.

v0.11.2 · 2026-08-23

  • Saisonpunkte gibt es jetzt fürs Training — nicht fürs App-Öffnen. Bisher wurden Wochen- und Monatspunkte nur gutgeschrieben, wenn man die Saison-Fläche in genau dieser Woche öffnete; wer eine Woche nicht hineinsah, verlor die Punkte rückwirkend. Jetzt werden abgeschlossene Wochen und Monate automatisch nachgebucht — auch ganz ohne App-Öffnen, im Hintergrund alle paar Stunden. Auch die letzten Tage einer Saison gehen nicht mehr verloren, und an der Saisongrenze (30.09./01.10.) zählt jede Trainingseinheit genau einmal, in der Saison ihres Tages.
  • Saison-Meilenstein-Abzeichen bleiben je Saison eigenständig. Wer in der Vorsaison (Season 0) einen Meilenstein erreicht, bekommt denselben Meilenstein in Season 1 wieder — vorher hätten sich die Abzeichen der beiden Saisons gegenseitig blockiert.
  • Zugriffsschutz an mehreren Stellen nachgeschärft. Kalender-Feed, Einstellungen, Mitgliederverwaltung, Bestenliste und die öffentlichen Status-Endpunkte prüfen jetzt strenger, wer was sehen und ändern darf; Identität und Vereinszugehörigkeit bestimmt durchgehend der Server. Für per App eingeladene Mitglieder ohne besondere Konto-Attribute funktioniert die Web-Bestenliste dadurch erstmals zuverlässig.
  • Vereins-Löschungen räumen vollständig ab. Der Papierkorb-Ablauf des Vereins konnte an Saisonpass-Daten hängenbleiben — dann wurde still gar kein fälliges Konto gelöscht. Jetzt wird alles Zugehörige mit entfernt.
  • Benachrichtigungen: Aufgaben mit Antwort-Knöpfen und eine überarbeitete Fläche. Standaufsicht-Tauschanfragen lassen sich direkt aus der Benachrichtigung beantworten, die zugehörigen E-Mails gehen wieder zuverlässig raus, und eine offene Anfrage stellt ihren Posteingangs-Eintrag beim nächsten Planaufruf selbst wieder her.
  • Für die TargetShot-App (geschlossene Testphase): die Berichte kommen als letztes Pro-Feature in die App, und eine freundliche Push-Nachfrage hilft, abgeschaltete Mitteilungen wieder zu aktivieren — inklusive Reparatur-Fall. Erreicht die Testgeräte mit dem nächsten App-Build.

v0.11.1 · 2026-08-20

  • Duelle lassen sich nur noch an Gegner richten, die auch mitspielen können. Die Gegner-Auswahl (Web und App) zeigt jetzt nur Vereinsmitglieder mit TargetShot-Konto und Pro-Zugang. Bisher konnte man jedes Mitglied herausfordern — wer kein Pro hatte, konnte die Einladung aber nie annehmen oder ablehnen, und die Herausforderung hing für immer. Wer nicht in der Liste steht, kann derzeit schlicht nicht antreten; der Plan-Status anderer Mitglieder wird dabei nicht angezeigt.
  • Für die TargetShot-App (geschlossene Testphase): die erweiterten Statistiken kommen in die App — Entwicklung, freier Vergleich (Gruppen wie „Alle Trainings" oder einzelne Sessions, auch Training gegen Training) und Trefferbild-Diagnose, samt Bereichs- und Disziplin-Filtern. Die Vereinsübersicht wird zur Trainer-Fläche: Kennzahlen, Klartext-Auffälligkeiten („Serie 4 fällt ab — Fokus am Ende beobachten"), Serien-Profil, wählbares Trefferbild und eine nach Training/Wettkampf/Preisschießen getrennte Historie mit Starterlisten-Namen — je Schütze filterbar nach Disziplin, auch für die Jugend. Dazu: fortlaufende Schuss-Nummern in der Gesamt-Ansicht, die Bestenlisten-Kachel mit klarer Überschrift und Pro-Kennzeichnung, die Session-Suche direkt unter der Kopfzeile und eine flüchtige Disziplin-Sicht auf dem Dashboard. Alles erreicht die Testgeräte mit dem nächsten App-Build.

v0.11.0 · 2026-08-19

  • Neue Namen für die Herausforderungen. Die freiwilligen Karten heißen jetzt durchgehend deutsch: aus „Trainingsstreak" wird die Wochenkette, aus „Highscore Hunter" der Bestwert-Jäger, aus „Duelist" der Duellant und aus „Konstanz Light" der Solide Schnitt. An Aufgaben, Punkten und Fortschritt ändert sich nichts — nur die Sprache stimmt jetzt.
  • Vorbereitung für Apple Pay und Google Pay. Die Web-App liefert die nötige Verifikationsdatei für Apple aus. Sobald die Freischaltung beim Zahlungsdienst abgeschlossen ist, erscheinen die Wallet-Knöpfe im Pro-Checkout von selbst — auf passenden Geräten (Safari mit Karte im Wallet bzw. Chrome mit hinterlegter Karte).
  • Der Kauf-Einstieg merkt sich deine Wahl. Wer von außen mit einer vorgewählten Zahlweise auf die Preisseite kommt (etwa aus der App), sieht Monatlich oder Jährlich direkt richtig eingestellt.
  • Genauere Auskünfte bei fehlendem Zugriff. Die Schnittstelle unterscheidet jetzt sauber, WARUM etwas nicht erlaubt ist (fehlende Rolle, fremder Verein, kein Vereinszugang …) — die Apps können damit hilfreiche Sätze zeigen statt eines pauschalen „kein Zugriff".
  • Das Profil kennt jetzt die Vereinslogos. Grundlage dafür, dass die App das eigene Vereinswappen im Kopf der Flächen zeigt.
  • Für die TargetShot-App (geschlossene Testphase): die Saison-Fläche ist komplett neu aufgebaut — eigene Unterseiten für Herausforderungen, Arena, Rangliste und Auszeichnungen in einem goldenen Bühnen-Look mit Lade-Choreografie und VS-Momenten; freie Konten sehen dort jetzt das Pro-Angebot (jährlich als Empfehlung); der Sprachumschalter wirkt (Deutsch/Englisch); die Standaufsicht lässt sich in der App pflegen. All das erreicht die Testgeräte mit dem nächsten App-Build.

v0.10.5 · 2026-08-15

  • Neu: freiwillige Herausforderungen — annehmen, wenn du willst, und dafür Saisonpunkte bekommen. Neben den Pflicht- und Wochenaufgaben gibt es je Zweimonats-Zeitraum fünf Karten, die niemand automatisch bekommt: Präzisionsserie, Comeback, Highscore Hunter, Duelist und Konstanz Light. Du nimmst an, was dich reizt, und lässt liegen, was nicht passt.
  • Was sie bringen: 100 Saisonpunkte für die silbernen, 150 für die goldenen, 200 für den Highscore Hunter. Alle fünf eines Zeitraums zusammen sind 700 Punkte — zum Vergleich: eine komplett gespielte Woche bringt 120 bis 150. Die bisherigen XP bleiben unverändert erhalten, die Saisonpunkte kommen dazu.
  • Fair bleibt fair: Wer eine Karte annimmt, die durch vergangene Trainings bereits erfüllt wäre, bekommt dafür keine Saisonpunkte — die gibt es für die Aufgabe, nicht für die Vergangenheit. Die XP-Gutschrift ist davon nicht berührt.
  • In den Sommermonaten läuft keine Saison. Karten, deren Zeitraum ganz in die Sommerpause fällt, weisen deshalb keine Saisonpunkte aus, sondern wie bisher nur XP. Was dort steht, stimmt also in jedem Fall.
  • Bereits abgeschlossene Karten werden nachträglich gutgeschrieben — einmalig, beim ersten Aufruf nach diesem Update.
  • In der Web-App ist der Bereich noch nicht zu sehen. Er erscheint zuerst in der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar) und erreicht die Testgeräte mit dem nächsten App-Build.

v0.10.4 · 2026-08-15

  • Behoben: beendete Duelle wurden bei jedem Aufruf neu in die Datenbank geschrieben. Sichtbar war das nie — das Ergebnis blieb ja dasselbe. Ein Schutz dagegen war eingebaut, verglich aber zwei Texte, deren Reihenfolge die Datenbank selbst verändert, und griff deshalb nie. Am Ergebnis, an den Saisonpunkten und an den Benachrichtigungen ändert sich dadurch nichts.
  • Neu: Es läuft nur noch ein Geisterduell gleichzeitig. Bisher galt allein die allgemeine Grenze von drei aktiven Duellen, sodass man drei Geisterduelle nebeneinander starten konnte. Ein beendetes oder abgebrochenes Geisterduell zählt ausdrücklich nicht mit — sobald das laufende endet, ist der Platz wieder frei.
  • Sonst ändert sich in der Web-App nichts Sichtbares.

v0.10.3 · 2026-08-14

  • Die Herausforderungen laden jetzt deutlich schneller. Der Bereich brauchte knapp drei Sekunden zum Öffnen — rund zehnmal so lang wie alle anderen Saison-Ansichten. Ursache war nicht eine langsame Abfrage, sondern hunderte kleine Nachfragen an die Datenbank, die nacheinander abgewartet wurden. Dreiviertel davon waren doppelte Arbeit: dieselbe Auskunft wurde bis zu 54-mal pro Aufruf geholt, und der Vorlagen-Katalog der Saison wurde bei jedem Seitenaufruf komplett neu geschrieben, obwohl er für alle Mitglieder gleich ist und sich höchstens einmal am Tag ändert.
  • Und ein stiller Schreib-Sturm ist beendet. Bei jedem Aufruf wurden 17 Fortschrittswerte in die Datenbank geschrieben, auch wenn sich kein einziger geändert hatte. Ein Schutz dagegen war eingebaut, hat aber nie gegriffen: er verglich zwei Texte, deren Reihenfolge die Datenbank selbst verändert. Fortschritt wird jetzt nur noch geschrieben, wenn er sich wirklich geändert hat.
  • Für dich ändert sich am Verhalten nichts — dieselben Herausforderungen, derselbe Fortschritt, taggenau wie bisher. Nur eben schneller.

v0.10.2 · 2026-08-14

  • Behoben: „Bestes 40er" stand im Rekordbuch mit dem Zehnfachen. Statt 351 Ringen zeigte die Zeile 3.510. Die Ringsumme wird intern in Zehnteln geführt; an dieser einen Stelle fehlte die Umrechnung, während Bestserie und Bester Teiler daneben richtig standen. Die zugrundeliegenden Werte waren nie falsch, nur ihre Darstellung.
  • Sonst ändert sich in der Web-App nichts Sichtbares.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): die Arena öffnet jetzt in Sekundenbruchteilen statt nach knapp drei Sekunden. Sie hatte auf vier Auskünfte gewartet, die sie gar nicht anzeigt — darunter die Liste aller Herausforderungen, mit Abstand die langsamste. Sie holt jetzt nur noch, was sie zeigt. Erreicht die Testgeräte erst mit dem nächsten App-Build.

v0.10.1 · 2026-08-14

  • Behoben: die Saison-Fläche hat für einen Teil der Mitglieder gar nichts gezählt. Wochen- und Saison-Herausforderungen blieben bei null, es entstanden keine Saisonpunkte, die Sammlung und das Rekordbuch blieben leer, und in Duellen stand bei beiden Seiten 0. Ursache war eine stille Verwechslung im Programm: die Sportpass-Nummer, über die deine Trainings dir zugeordnet werden, wurde an einer Stelle nicht gelesen — obwohl sie vorlag. Als Ersatz blieb nur ein Abgleich über die E-Mail-Adresse, die in den Vereinsdaten der Schießanlage hinterlegt ist. Wo sie dort fehlt, war die Zuordnung nicht herstellbar, und die Auswertung las schlicht nichts.
  • Warum das niemandem aufgefallen ist: der Ausfall sah aus wie ein Ergebnis. Statt einer Fehlermeldung stand überall eine Null — und eine Null ist von „noch nichts erreicht" nicht zu unterscheiden.
  • Was das für dich bedeutet: Die Auswertung greift ab sofort wieder auf deine Trainingshistorie zu. Bereits vergebene Punkte und Auszeichnungen bleiben erhalten; rückwirkend werden keine Wochen nachgetragen, deren Zeitraum vorbei ist. Saison-Ziele, die aus der Historie rechnen (Saison-Treue, Bestleistungen), stimmen wieder.
  • Behoben: die Bestenliste rechnete Trainings und Wettkämpfe zusammen. Bei einigen Auswertungen fiel die Einschränkung „nur Trainings" unbemerkt weg, sodass Wettkampf-Ergebnisse mitzählten. Hat ein Verein gar keine Starterliste als Training gekennzeichnet, wurde umgekehrt gar nichts gezählt — dort greift jetzt dieselbe Namenserkennung wie in der Bestenliste.
  • Sonst ändert sich in der Web-App nichts Sichtbares.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): das Geisterduell entsteht nicht mehr ohne Grundlage. Wer noch keine gewertete Trainingsrunde hat, bekommt jetzt eine klare Auskunft, statt ein Duell gegen einen Zielwert von null zu starten, das jeder einzelne Schuss gewinnt. Duelle im Modus „Best of 3" werden nach dem gebuchten Ergebnis angezeigt statt bei jedem Aufruf neu gerechnet — Detailseite und Bilanz können damit nicht mehr auseinanderlaufen.

v0.10.0 · 2026-08-14

  • Behoben: Saison- und Herausforderungs-Fristen standen einen Tag zu spät. Das Ende der Vorsaison wurde als „01.10." angezeigt, obwohl sie am 30. September endet — und dasselbe galt für jede Wochen- und Monatsfrist. Die Fenster enden um Mitternacht (UTC); in deutscher Zeit gelesen fiel dieser Zeitpunkt bereits auf den Folgetag. Die angezeigten Fristen stimmen jetzt mit den tatsächlichen überein; an den Fristen selbst hat sich nichts geändert.
  • Behoben: Duell-Benachrichtigungen führten ins Leere. Wer eine Duell-Meldung angetippt hat, blieb stehen, wo er war — die Meldung trug eine vollständige Web-Adresse, und die Benachrichtigungsliste nimmt nur interne Ziele an. Neue Meldungen führen wieder auf das Duell.
  • Sonst ändert sich in der Web-App nichts Sichtbares. Kein neuer Bereich, keine geänderten Werte.
  • Unter der Oberfläche: eine neue Auskunft über die persönliche Duell-Bilanz (Siege, Niederlagen, Serie, Bilanz je Gegner). Sie führt bewusst keine Ringzahlen, nur Ausgänge und Namen. Genutzt wird sie vorerst nur von der App.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): die Arena ist ein eigener Ort geworden — Duelle anlegen, annehmen und ablehnen, laufende und beendete Duelle, dazu die neue Bilanz unter allem. Neu außerdem die Bestenliste des Vereins als Unterseite des Dashboards, mit Rang-Kachel auf der Startseite: vier Wertungen (Gesamtringe, Ø je Schuss, Bester Teiler, Meiste Trainings) je Disziplin, Zeitraum und Kategorie. Geisterduelle zählen bewusst nicht in die Gesamtbilanz, sondern stehen für sich. Erreicht die Testgeräte erst mit dem nächsten App-Build.

v0.9.10 · 2026-08-13

  • Neu: Season 0 — die Vorsaison läuft. Der Saison-Pass startet in eine Testsaison: Season 0 läuft rückwirkend ab dem 1. August bis zum 30. September, die reguläre Season 1 beginnt am 1. Oktober und läuft bis zum 30. April. In der Vorsaison wird der komplette Pass einmal im Echtbetrieb durchgespielt — Wochen-Herausforderungen, Saisonpunkte, Rangliste, Auszeichnungen.
  • Die Saison-Ziele passen sich der Saisonlänge an. „In 12 Wochen trainiert" wäre in einer neunwöchigen Vorsaison von Anfang an unerreichbar gewesen — in Season 0 gilt: Treue ab 4 Wochen, Gold ab 6. Volle Sportjahre bleiben bei den gewohnten Zielen, und der Teiler-Anspruch bleibt unverändert: Klasse skaliert nicht.
  • Was rückwirkend zählt: Saison-Treue und Bestserien rechnen aus deiner Trainingshistorie und zählen ab dem 1. August. Die Wochen-Punkte gibt es je laufender Woche — ab jetzt, nicht für vergangene Wochen.
  • In der Web-App ändert sich sonst nichts Sichtbares. Die Saison-Flächen (Challenges, Rangliste) zeigen ab sofort Season 0 statt der Sommerpause.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): der bisher leere Pro-Tab ist jetzt die Saison-Fläche — Saison-Pass mit Stufen und Medaillen-Meilensteinen, Herausforderungen der Woche, Duelle, Saison-Rangliste und verdienbare Auszeichnungen mit eigenem Artwork. Dazu behoben: der bezahlte Bereich wurde in der App auch zahlenden Konten nie angezeigt (der Plan kam nur aus dem Anmelde-Token, das ihn nie trägt — jetzt zählt der Server-Stand). Erreicht die Testgeräte erst mit dem nächsten App-Build; die Season-0-Daten sind ab sofort live.

v0.9.9 · 2026-08-12

  • Behoben: die Standaufsicht blieb bei einer Person hängen. Der Plan verteilt die Schichten reihum über alle Standaufsichten. Beim Weiterrücken des Plans bekam die jeweils neu hinzukommende Woche jedoch immer dieselbe Person — sichtbar wurde das erst, seit der Plan ein ganzes Jahr im Voraus reicht. Ab jetzt läuft die Reihe sauber weiter: die nächste freie Schicht bekommt, wer nach der zuletzt eingeteilten Person an der Reihe ist.
  • Neu: die Standaufsicht ist eine gepflegte Liste statt eines Häkchens je Mitglied. Bisher konnte nur eingeteilt werden, wer bereits ein Konto hat — am Schwarzen Brett stehen aber auch Mitglieder, die noch nicht eingeladen sind. Sie können jetzt in der Liste stehen und erscheinen mit ihrem Namen im Plan. Die Reihenfolge der Liste ist die Rotation, sie lässt sich also so führen, wie der Verein es gewohnt ist.
  • Und das Beste daran: die Einträge verknüpfen sich von selbst. Ein Eintrag merkt sich die Sportpass-Nummer. Wird die Person später eingeladen und meldet sich zum ersten Mal an, zeigt derselbe Eintrag auf ihr Konto — „deine nächste Schicht", Tauschanfragen und Benachrichtigungen beginnen zu wirken, ohne dass jemand die Liste anfassen muss. Tauschen kann weiterhin nur, wer ein Konto hat: eine Anfrage braucht jemanden, der antworten kann.
  • Bestehende Einteilungen bleiben erhalten. Wer bisher als Standaufsicht markiert war, steht automatisch in der neuen Liste, in derselben Reihenfolge wie vorher — der Plan sieht nach dem Update aus wie davor.
  • Sonst ändert sich für dich nichts Sichtbares. Die Web-App ist gegenüber v0.9.8 inhaltlich unverändert.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): der Sessions-Bereich öffnet wieder mit „Alle" statt mit dem Bereich der zuletzt geschossenen Session — wer einmal ein Preisschießen hatte, fand ihn sonst wochenlang darauf eingestellt vor und sah seine Trainings nicht. Erreicht die Testgeräte erst mit dem nächsten App-Build.

v0.9.8 · 2026-08-12

  • Behoben: Termine aus einem Vereinskalender kamen nirgends an. Wer im Vereinsbereich eine Kalender-Adresse hinterlegt und abgeglichen hat, bekam gemeldet, dass Termine übernommen wurden — zu sehen waren sie trotzdem nirgends. Zwei Ursachen: die importierten Termine wurden keinem Verein zugeordnet, und jede Ansicht filtert nach Verein; außerdem sah der automatische Abgleich nur in einer veralteten, vereinsübergreifenden Einstellung nach und hat einen im Verein eingetragenen Kalender nie angefasst. Beides ist behoben. Bereits importierte Termine werden beim nächsten Abgleich übernommen, nicht verdoppelt.
  • Sonst ändert sich für dich nichts Sichtbares. Die Web-App ist mit dieser Version inhaltlich unverändert — kein neuer Bereich, keine geänderten Werte, keine andere Darstellung. Wenn dir etwas anders vorkommt, liegt es nicht an diesem Release.
  • Unter der Oberfläche: Mitglieder dürfen jetzt den Standaufsichtsplan ihres Vereins lesen — er hängt ohnehin im Schützenhaus aus, und bisher kam nicht einmal die eigene Einteilung durch. Der Plan reicht jetzt ein Jahr voraus statt acht Wochen. Dazu eine schmale neue Auskunft über Vereinsname, Vereinslogo und die eigene Mannschaft, die bisher nur Vorstand und Trainer abrufen konnten.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): der Verein-Tab ist neu aufgebaut — Termine, Standaufsicht mit Tauschanfrage und die eigene Mannschaft; die Vereinseinstellungen sind hinzugekommen, inklusive Starterlisten-Zuordnung und Preisschießen-Wertung; Session-Ansicht und Session-Auswahl wurden überarbeitet. All das erreicht die Testgeräte erst mit dem nächsten App-Build, nicht mit diesem Release.

v0.9.7 · 2026-08-10

  • Neu: eine Erinnerung, wenn deine Woche noch offen ist. Hast du in der laufenden Woche noch nichts geschossen, meldet sich TargetShot einmal mit „Diese Woche noch nichts geschossen" — ohne Zahlen und ohne Vergleich, weil so eine Nachricht auf dem Sperrbildschirm liegt und jeder sie sehen kann, der aufs Display schaut. Sie kommt nur, wenn du sonst auch trainierst: wer längere Zeit gar nicht geschossen hat, wird nicht angestupst. Ohne erteilte Freigabe deiner Schießdaten kommt sie ebenfalls nicht, und mehr als einmal pro Woche kommt sie nie.
  • Neu: ein neuer Bestwert wird als solcher angekündigt. Übertrifft eine ausgewertete Session dein bisher bestes Ergebnis, steht über der Auswertungs-Meldung „Neuer Bestwert" statt „Training ausgewertet". Es ist keine zweite Nachricht — es bleibt bei einer Meldung je Session, sie heißt nur anders. Beim Preisschießen bleibt es bewusst bei der gewohnten Überschrift, weil dort auch die Ringzahl nicht genannt wird.
  • Beide neuen Meldungen gehören zur Benachrichtigungs-Art „Trainings-Auswertung" und lassen sich zusammen mit ihr abschalten. Ein eigener Schalter nur für die Wochen-Erinnerung oder nur für den Bestwert-Hinweis existiert nicht.
  • Behoben: Duell- und Standaufsichts-Meldungen haben deinen Push-Schalter übergangen. Wer Push in den Einstellungen ausgeschaltet hatte, bekam diese beiden trotzdem aufs Gerät, obwohl daneben stand, dass die Einstellung kontoweit gilt. Ab jetzt hält sich jede Benachrichtigung an den Schalter.
  • Aus einem Schalter werden mehrere Arten — Trainings-Auswertung, Wettkämpfe & Termine, Duelle, Aus dem Verein, Konto & Abo. Für dich ändert sich damit zunächst nichts: alle Arten stehen auf „an", und wer bisher Push aktiviert hatte, bekommt genau dieselben Meldungen wie vorher. Neu ist nur, dass du einzelne Arten abbestellen kannst, statt nur alles oder nichts zu haben.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): Android führt diese Arten als eigene Einträge in den Systemeinstellungen, sodass sich Ton und Wichtigkeit je Art getrennt einstellen lassen.
  • Unter der Oberfläche, ohne sichtbare Wirkung: Alle Benachrichtigungen laufen jetzt durch eine einzige gemeinsame Stelle — vorher lag dieser Weg viermal im Code, und zwei dieser vier Kopien waren es, die den Push-Schalter übergingen. Dazu drei Absicherungen im Bauprozess, die Fehler künftig vor der Auslieferung sichtbar machen statt danach.

v0.9.6 · 2026-08-10

  • Für dich ändert sich mit dieser Version nichts Sichtbares — keine neue Funktion, keine geänderten Werte, keine andere Darstellung. Wenn dir etwas anders vorkommt, liegt es nicht an diesem Release.
  • Unter der Oberfläche: Die Live-Anzeige aus der letzten Version fragt beim Schießen im Sekundentakt nach. Bei jeder dieser Anfragen hat der Server bisher auch dann in die Datenbank geschrieben, wenn sich an deinen Kontodaten gar nichts geändert hatte — das geschieht jetzt nur noch bei einer echten Änderung. Deine Daten bleiben dabei genauso aktuell wie vorher: ändert sich dein Name, deine E-Mail-Adresse oder deine Sportpass-Nummer, wird das wie bisher sofort übernommen. Dazu eine Abfrage weniger, die versehentlich doppelt gestellt wurde, und ein zusätzlicher Datenbank-Index, der erst bei deutlich mehr Mitgliedern greift.

v0.9.5 · 2026-08-10

  • Dein Dashboard zählt jetzt live mit, während du schießt. Sobald an der Anlage Treffer ankommen, erscheint ganz oben ein Bereich „Läuft gerade": die Zahl deiner Schüsse, die Ringe und dein bester Teiler, und jeder neue Schuss erscheint innerhalb weniger Sekunden. Lässt die Disziplin erkennen, wie viele Schüsse vorgesehen sind, steht dort „27 von 40" — sonst nur die Trefferzahl, weil eine geratene Zahl schlechter wäre als keine.
  • Außerhalb des Schießens ändert sich nichts. Läuft gerade nichts, ist der Bereich gar nicht da — kein leerer Kasten, kein Hinweis. Und kommt eine Weile kein Treffer mehr an, verschwindet er von selbst wieder; er wartet nicht darauf, dass eine Schusszahl erreicht wird.
  • Unter der Oberfläche, ohne sichtbare Wirkung: Die Abfrage für die Live-Ansicht passt ihr Tempo an. Während geschossen wird, fragt sie im Sekundentakt; liegt das Dashboard nur offen herum, geht sie schrittweise auf bis zu 30 Minuten zurück und ist sofort wieder schnell, sobald du hinsiehst oder ein Schuss ankommt. Dazu eine Aufteilung der Bauprüfung, die nur die Entwicklung betrifft.

v0.9.4 · 2026-08-10

  • Zurückgezogene Trainings zählen nirgends mehr mit — und deine Werte können dadurch sinken. Wird ein Blatt an der Anlage nachträglich zurückgezogen, blieb es in deinem Dashboard bisher enthalten: in der Trainingsliste, im Durchschnitt, im Trend und bei den Bestwerten. Ab jetzt wird es überall ausgeblendet, zusammen mit vier weiteren Flächen, die es ebenfalls noch mitgezählt haben (Wettkampfhistorie, Berichte, Vereinsauswahl und die Punkte des Saison-Passes). Wenn ein Bestwert, ein Durchschnitt oder ein „letztes Training" bei dir anders aussieht als vorher, ist das der Grund. Der neue Wert ist der richtige — der alte enthielt Ergebnisse, die es offiziell nicht mehr gibt.
  • Blendet ein Filter alle Trainings aus, sagt das Dashboard das jetzt auch im Web. Bisher stand dort „Keine Trainings gefunden" — derselbe Satz wie für ein Konto, das noch nie geschossen hat. Jetzt steht da, welche Einstellung gerade schneidet: die Kategorie oder die Disziplin. In der App war das bereits so.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): Beim Wechsel des Kontos können die Dashboard-Einstellungen des vorherigen Kontos nicht mehr ins neue geraten.
  • Unter der Oberfläche, ohne sichtbare Wirkung: Die Live-Ansicht aus dem letzten Release stützt sich jetzt ausschließlich auf die im Anmeldekonto hinterlegte Sportpass-Nummer, damit eine gemeinsam genutzte E-Mail-Adresse — etwa eine Familienadresse — niemals fremde Trainings in die eigene Ansicht zieht. Dazu ein zusätzlicher Datenbank-Index für die Live-Abfrage.

v0.9.3 · 2026-08-09

  • Zurückgezogene Scheiben zählen im Preisschießen nicht mehr mit. Wurde eine Scheibe nachträglich aus den Vereinsdaten entfernt, ging sie in Teilnehmerzahl und Rangliste eines Preisschießens weiterhin ein. Das ist behoben — Platzierungen und Teilnehmerzahlen können sich dadurch ändern. Es ist die Korrektur, kann für Teilnehmende aber wie ein neuer Fehler aussehen.
  • Vorarbeit für die Live-Ansicht: Das Backend kann jetzt beantworten, welche der eigenen Sessions gerade läuft — mit Schusszahl und Ergebnis, aber bewusst ohne die einzelnen Treffer, damit eine Fläche das später im Sekundentakt abfragen darf, ohne die Anlage oder die Datenbank zu belasten. An dieser Stelle ändert sich für dich noch nichts; die sichtbare Anzeige folgt in einem späteren Release.

v0.9.2 · 2026-08-07

  • Du kannst dein Dashboard jetzt nach Disziplin filtern. In den Einstellungen unter „Dashboard" lässt sich Luftgewehr, Luftpistole und alles Übrige einzeln ein- und ausblenden. Unter jedem Schalter stehen die Disziplinen, die du tatsächlich geschossen hast, damit erkennbar bleibt, was er ausblendet. Wer nur eine Disziplinart schießt, bekommt den Filter gar nicht erst zu sehen — ein Schalter ohne Wirkung hilft niemandem. Die Einstellung gilt für Web und App gemeinsam und wirkt nur im Dashboard; die Kategorie-Seiten zeigen weiterhin alles.
  • Blendet ein Filter alles aus, sagt das Dashboard jetzt, welcher. Bisher verwies der Hinweis immer auf die Kategorien, auch wenn der neue Disziplin-Filter geschnitten hatte — wer dann in die Einstellungen ging, fand dort alle Kategorien aktiv und suchte vergeblich.
  • In der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): Eine angetippte Benachrichtigung führt nur noch zu Seiten, die es in der App auch gibt, statt ins Leere zu laufen. Schalter mit Erklärzeile werden Screenreadern jetzt vollständig vorgelesen.

v0.9.1 · 2026-08-05

  • Du kannst dein Konto jetzt selbst löschen. Im Profil unter „Konto löschen": Der Zugang wird sofort gesperrt, endgültig entfernt werden Konto und Daten nach 30 Tagen — das genaue Datum steht auf der Bestätigungsseite und in der E-Mail, die du bekommst. Innerhalb dieser Frist nimmst du die Löschung über den Link in dieser E-Mail wieder zurück. Ein laufendes Pro-Abo wird dabei gekündigt.
  • Eine Benachrichtigung führt dich direkt zum Training. Ein Klick auf „Training ausgewertet" öffnet jetzt die Auswertung — in der Web-App, aus der Push-Nachricht heraus und in der TargetShot-App.
  • Push-Meldungen nennen das Ergebnis. Die Überschrift sagt, um welche Kategorie es geht, der Text nennt Schusszahl und Ergebnis in ganzen Ringen. Bisher stand dort nur, dass etwas ausgewertet wurde.
  • Gelöschte Treffer verfälschen die Trainerflächen nicht mehr. Wurden Treffer nachträglich aus einer Session entfernt, zählten sie in den Vereins- und Jugendflächen weiter in Summen und Durchschnitte hinein. Das ist behoben.
  • Sicherere Zuordnung zwischen Anmeldekonto und Profil: Eine Verknüpfung entsteht nur noch, wenn sie sich über die hinterlegte E-Mail belegen lässt. Bleibt die Zuordnung unklar, wird ein Löschantrag mit einer verständlichen Meldung abgelehnt und an den Support verwiesen, statt möglicherweise das falsche Konto zu treffen.
  • Vorbereitung der TargetShot-App (geschlossene Testphase, in keinem Store verfügbar): Serien erscheinen als Raster, „Bester Teiler" steht auch im Session-Detail, und Dashboard-Kategorien sowie ein persönlicher Vereinsfilter lassen sich in den Einstellungen setzen. Behoben: unvollständig angezeigte Serien in der Übersicht, ein nicht übertragener Lesestatus bei Benachrichtigungen, und Einstellungen, die still überschrieben werden konnten.

v0.9.0 · 2026-08-04

  • Vorbereitung der Android-App: Der Versand von Benachrichtigungen kann jetzt auch Android-Geräte erreichen. Die App selbst ist noch in Arbeit und in keinem Store verfügbar — an der Web-Anwendung ändert sich mit diesem Release nichts.
  • Interne Härtung der Benachrichtigungs-Zustellung: Ein Gerät wird nur noch dann abgemeldet, wenn der Push-Dienst es ausdrücklich als ungültig meldet. Eine Störung beim Dienst oder ein Fehler auf unserer Seite kostet damit keine Zustellungen mehr.

v0.8.0 · 2026-08-03

  • Benachrichtigung, wenn dein Training ausgewertet ist. Sobald eine Session vollständig eingelesen ist, erscheint sie in deinen Benachrichtigungen — mit Disziplin und Schusszahl, und ein Klick führt direkt zur Auswertung. Als Push kommt sie nur, wenn du Push in den Einstellungen eingeschaltet hast. Ohne erteilte Freigabe deiner Schießdaten wird nichts verschickt, und ältere Sessions aus einem Datenabgleich lösen nachträglich keine Meldungen aus.
  • Die Seitenleiste verdichtet sich bei niedrigem Fenster, statt unten abgeschnitten zu werden. Auf flachen Bildschirmen und in geteilten Fenstern bleiben damit alle Einträge erreichbar.
  • Vorbereitung für die TargetShot-App: Push-Benachrichtigungen gehen jetzt auch an iPhones. Die App befindet sich in geschlossener Testphase.

v0.7.2 · 2026-08-03

  • Push-Benachrichtigungen funktionieren. Erinnerungen an Termine, Duell-Ergebnisse und Standaufsichts-Hinweise kommen jetzt wirklich auf dem Gerät an — bisher wurde nichts verschickt. Aktivieren geht in den Einstellungen unter Benachrichtigungen; dein Browser fragt dabei einmal nach Erlaubnis.
  • Benachrichtigungs-Einstellungen lassen sich wieder ändern. E-Mail an/aus, Event-Mails, Einladungen, Push, Push-Ton und die E-Mail-Kategorien sprangen nach dem Speichern auf den alten Wert zurück. Das ist behoben.
  • Abgelaufene Push-Anmeldungen (deinstallierter Browser, entzogene Erlaubnis) werden automatisch entfernt, statt bei jeder Benachrichtigung erneut angefragt zu werden.

v0.7.1 · 2026-08-03

  • Verträge kündigen — ohne Anmeldung. Unter „Verträge hier kündigen" (im Footer, auf der Anmeldeseite und auf targetshot.app) kündigst du dein Pro-Abo direkt, auch wenn du gerade nicht an dein Konto kommst. Du erhältst sofort eine Eingangsbestätigung per E-Mail mit Datum, Uhrzeit und dem Enddatum deines Vertrags, und kannst die Erklärung zum Aufheben herunterladen.
  • Kündigung mit einem Klick zurücknehmen. War die Kündigung ein Versehen oder nicht von dir, nimmst du sie über einen Link direkt aus dieser E-Mail zurück — 30 Tage lang, einmalig. Danach bestätigen wir dir die Rücknahme und nennen dir die nächste Abrechnung.
  • Bestellbestätigung per E-Mail. Nach dem Abschluss von Pro bekommst du eine Bestätigung mit allen Vertragsangaben im TargetShot-Design.
  • Laufzeit immer sichtbar. Auf der Preisseite und im Profil steht jetzt, bis wann dein Abo läuft und wann die nächste Abrechnung ansteht — und bei gekündigtem Abo, wann es endet.
  • Behoben: „Kündigung rückgängig machen" schlug fehl. Behoben: die Free-Karte zeigte einen Kündigen-Knopf. Behoben: Umlaute in Bestätigungsmails wurden falsch dargestellt.
  • Interne Härtung der Kündigungsstrecke und der E-Mail-Zustellung.

v0.7.0 · 2026-07-24

  • TargetShot Pro ist da: das persönliche Abo für 5,99 € im Monat oder 59 € im Jahr, direkt in der App abschließbar. Die Zahlung läuft sicher über Stripe, ohne die App zu verlassen; verwalten, wechseln und kündigen kannst du dein Abo jederzeit selbst.
  • Statistiken (Pro): neu aufgebaut mit direktem A×B-Vergleich zweier Zeiträume, Trefferbild-Vergleich und einer Tiefe-Schublade für die Details. Vergleichswerte aus dem Verein erscheinen nur, wenn genügend Schützen dahinterstehen — niemand ist einzeln herauslesbar.
  • Berichte (Pro): schlankere Seite, PDF-Berichte in der TargetShot-Designlinie mit Logo. Geplante Berichte berücksichtigen die Einwilligungen aller enthaltenen Schützen; fehlt eine, werden die betroffenen Daten nicht versendet.
  • Bestenliste (Pro): fair neu entworfen — getrennte Ranglisten je Disziplin (Luftgewehr/Luftpistole) und Wertung im Schnitt je Schuss, damit unterschiedlich lange Serien vergleichbar bleiben. Die eigene Position ist immer sichtbar.
  • Herausforderungen (Pro): kompletter Neubau als Saison-Pass über das Sportjahr — wöchentliche, monatliche und saisonale Aufgaben mit klarer Anzeige, was gerade läuft und was noch offen ist, dazu Sammlung und Rekordbuch. Duelle gibt es in vier Varianten: direkt, nach Teiler, gegen die eigene Bestleistung (Geisterduell) und als Best-of-3 über drei Runden. Duelle werden nur ausgewertet, wenn beide Seiten eingewilligt haben.
  • Preise: die Preisseite wurde auf das neue Design umgestellt und auf das reduziert, was für einzelne Schützen zählt.

v0.6.1 · 2026-07-20

  • Mobile-Feinschliff auf dem Handy: Die Filter-Leiste der Kategorie-Seiten bricht sauber um, Serien werden mit ihrer Nummer beschriftet (S1 · S2 · S3 · S4), Diagramm-Beschriftungen bleiben auf schmalen Bildschirmen lesbar, die Preisschießen-Rangliste stapelt sich als Karten, und Bedienelemente halten die Mindestgröße für Touch ein.
  • Standaufsichtsplanung: Die Von/Bis-Zeitfelder liefen auf dem iPhone über den Kartenrand hinaus — jetzt behoben.
  • Persönliches Dashboard: Die in den Einstellungen gewählten sichtbaren Kategorien werden schon beim ersten Laden berücksichtigt (vorher konnte kurz eine ausgeblendete Kategorie erscheinen, bis die Einstellungen einmal geöffnet wurden).
  • General: Version bump to v0.6.1 for backend and web app.

v0.6.0 · 2026-07-19

  • Persönliches Dashboard neu geschnitten: Das Ergebnis-Band des letzten Trainings führt die Seite an (Ganzringe vor Zehntelwertung), darunter „Als Nächstes" (laufende Preisschießen mit Endtermin; allgemeine Vereinstermine neutral), ein ehrlicher Leistungs-Trend mit sauber benanntem Zeitfenster und die Bestwerte als eine kompakte Fläche.
  • Training, Wettkampf und Preisschießen teilen jetzt ein gemeinsames Seiten-Gerüst: Ergebnis-Band, Bestwerte-Zeile, Saison-Verlauf und ein nach Monaten gruppierter Verlauf. Preisschießen zeigt laufende Veranstaltungen mit Endtermin-Countdown und eigener Platzierung, die Historie nach Jahren.
  • Vereinsübersicht und Schützen-Profile sind statistik-getrieben neu gebaut (Kennzahlen-Band, Verteilung mit Statistik-Box, sortierbare Tabelle; Einzel-Ansicht mit Auffälligkeiten und Serien-Profil); der Jugend-Bereich nutzt dieselbe Struktur.
  • Die Session-Detailseite ist eine schlichte Schützen-Sicht: Ergebnis, Dauer, Serien, bester Teiler und der Umschalter Probe / Serie 1–4 / alle Wertungsschüsse.
  • Jugend-Onboarding: informierte Elterneinwilligung mit klarem Einwilligungsumfang und Status-Prüfung; der Eltern-Kontakt kann direkt beim Einladen hinterlegt werden, die Mitgliederliste zeigt den Freigabe-Status.
  • Kategorie-Darstellung vereinheitlicht: ein Badge-System mit einheitlichen Begriffen app-weit; Wettkampf erscheint nicht mehr in einer Warnfarbe.
  • Korrektheit: Ring-Skala-Fehler in mehreren Serien-Fallbacks behoben (Werte waren teils um den Faktor 10 zu hoch), „Beste Serie" zählt keine Probeschüsse mehr, und Trend-Zeiträume werden nur noch ausgewiesen, wenn die geladenen Daten sie wirklich abdecken.
  • Zuverlässigkeit: Der Daten-Ingest überwacht seinen Kafka-Consumer jetzt selbst und startet sich bei Hängern automatisch neu; ein täglicher Health-Check meldet Auffälligkeiten.
  • General: Version bump to v0.6.0 for backend and web app. Releases werden ab jetzt automatisch getaggt (Version-Wächter in der Prod-Pipeline + GitHub-Release mit generierten Notes). Die Zwischenstände v0.5.0/v0.5.1 (Mai 2026) wurden ohne Protokolleintrag ausgeliefert.

v0.4.33 · 2026-04-15

  • Health Contract: Die Hauptplattform stellt den Ingest-Status jetzt als eigenen leichten Endpoint unter /healthz/ingest bereit, statt ihn nur im vollen aggregierten /healthz zu verstecken.
  • Ops Reliability: Admin-Portal und Connector-Ops ziehen fuer Ingest-Diagnose und Runbook-Pruefung jetzt den dedizierten Endpoint, sodass langsame Gesamt-Checks nicht mehr faelschlich wie ein Ingest-Ausfall aussehen.
  • Diagnostics UX: Timeout-Faelle werden im Backoffice weiterhin sauber als unknown statt als harter Ausfall dargestellt, aber der Normalfall liefert jetzt wieder den echten Live-Worker-Zustand.
  • General: Version bump to v0.4.33 for backend and web app.

v0.4.32 · 2026-04-15

  • Ingest-Sicherheitsvertrag: Normalisierte Topics verlangen jetzt einen konsistenten expliziten Herkunftsvertrag aus source_topic und source_club_id; Konflikte zwischen Payload, Headern und Topic-Scope werden explizit als Contract-Rejects abgelehnt.
  • Ingest-Ops: Der Worker fuehrt jetzt Reject-, Burst-, Quarantaene- und Recovery-Zustaende mit, sodass Source-Drift von echtem Worker-Ausfall getrennt sichtbar bleibt und spaetere akzeptierte Events einen Incident wieder sauber auf recovered setzen koennen.
  • Test & Runbook: Neue Backend-Tests decken Reject-/Quarantaene-Pfade ab, und das Ingest-Runbook dokumentiert Incident-Matrix, Reprocessing-Reihenfolge und Rollback fuer Source-Drift-Faelle.
  • General: Version bump to v0.4.32 for backend and web app.

v0.4.31 · 2026-04-15

  • Release Gate: Staging fuehrt vor dem eigentlichen Image-Build und Deploy jetzt einen expliziten release-preflight aus, der Runtime-Pflichtwerte, URL-Vertrag, CORS, Keycloak-Basis-URLs, Audience-Trennung, Upload-Storage und Mail-Sender fail-closed prueft.
  • Deploy Ops: Der Staging-Workflow legt den Preflight-Bericht als eigenes Artefakt ab und blockiert den eigentlichen Deploy frueh, wenn Auth-, App- oder Storage-Konfiguration nicht zum erwarteten Betriebsvertrag passt.
  • Docs & Planning: Web-Release-Runbook, Deploy-Doku, Production-Readiness-Checklist und Sprint-Stand fuehren den neuen Gate-Vertrag jetzt explizit mit.
  • General: Version bump to v0.4.31 for backend and web app.

v0.4.30 · 2026-04-14

  • Schießdaten-Freigaben sind jetzt als eigener Produktpfad mit Selbstfreigabe, Widerruf, Elternfreigabe-Flow und fail-closed Sichtbarkeitsregeln im Backend und Web verankert.
  • Vereinsübersicht, Jugendpfade und Reports liefern ohne gültige Freigabe jetzt bewusst keine personenbezogenen Schießdaten mehr aus; das Profil zeigt den Freigabestatus und verwaltet den Zugang separat.
  • Geburtstage aus der Spiegelstrecke werden als Debezium-DATE korrekt aus Epoch-Days gelesen, inklusive Replay-/Backfill-Pfad für bestehende Vereinsdaten und Profilanzeige.
  • General: Version bump to v0.4.30 for backend and web app.

v0.4.29 · 2026-04-09

  • Das Jugend-Dashboard ist serverseitig an denselben Club- und Rollen-Scope wie die übrigen Vereins- und Report-Pfade gebunden; Frontend-only-Zugriffe reichen dafür nicht mehr aus.
  • Regression-Tests decken jetzt explizit die erlaubten und verbotenen Rollenpfade für /api/youth/dashboard ab.
  • General: Version bump to v0.4.29 for backend and web app.

v0.4.27 · 2026-04-03

  • Vereinsreports fuer Trainer und Jugendtrainer sind als eigene Club-Flaeche auf einem gemeinsamen serverseitigen Managed-Report-Vertrag ausgeliefert, inklusive PDF-Export.
  • Die Vereinsreports zeigen jetzt nur noch Schuetzinnen und Schuetzen mit aktiver ClubMember-Zuordnung des gewaehlten Vereins; alte ScoreSheet-Daten allein reichen nicht mehr aus.
  • Die Web-Hotpaths in Dashboard, Statistics und Settings wurden weiter entkoppelt, damit nachfolgende Feature-Bloecke nicht direkt wieder in die groessten Dateien kippen.

v0.4.26 · 2026-04-03

  • sportpassId ist jetzt die kanonische Personenidentitaet im Backend; alte Keycloak-sub-Werte werden als Alias gemappt, damit Rollen und persoenliche Daten bei Legacy- oder Duplikat-Accounts nicht mehr auseinanderlaufen.
  • Der persoenliche Vereinsfilter ist serverseitig in den Einstellungen verankert und unterstuetzt Mehrfachauswahl gezielt fuer persoenliches Archiv, Reports und Statistik.
  • FAQ und Aenderungsprotokoll liegen jetzt oeffentlich in den Docs; die Feedback-Webflaeche ist entfernt und die Konto-Navigation in der Sidebar kompakter gebuendelt.
  • Bestenliste und Preisschiessen bleiben bewusst auf ihren konservativen Produktzuschnitten, waehrend der persoenliche Filter und das Event-Scoping technisch gehaertet wurden.

v0.4.25 · 2026-04-03

  • Multi-Club-Auth und Rollen-Gating folgen jetzt dem aktiven Verein plus ClubMember.role statt den alten Keycloak-Club-Rollen.
  • Mitglieder- und Identitätslogik wurden für Multi-Club-Fälle bereinigt, inklusive klarerer Profil- und Vereinszuordnung.
  • Plattform-Admin-Flächen wurden deutlicher von club-spezifischen Verwaltungswegen getrennt.
  • Laufzeit-, Billing- und Routen-Härtung wurden für den produktionsnahen Backend-Pfad erweitert.

Weitere Historie

  • Frühere Release-Einträge werden schrittweise aus dem bisherigen Web-Änderungsprotokoll hierher überführt.
  • Für technische Artefakte und Tags siehe auch die GitHub Releases.