Skip to content

Bekannte Bugs

Aktive Issues + Workarounds. Wird händisch gepflegt; gemeldete Bugs landen im Posteingang bugs@funkwelt.net.

Aktiv

  • Contest-Scoring (neu in v1.10.0) ist in Erprobung. Die komplett neu aufgebaute Wertungs-Engine ist noch nicht vollständig gegen offizielle Contest-Resultate validiert — Endpunktzahlen vor einer Einreichung prüfen. Noch ohne eigene Regeln (und daher mit 1 Punkt/QSO gewertet): ARRL RTTY Roundup, Russian DX, All Asian DX, JIDX. Für die IARU-HF-Wertung („gleiche ITU-Zone") muss die eigene CQ-/ITU-Zone in den Stations-Einstellungen gesetzt sein.

Behoben in v1.10.8

  • WSJT-X lief nicht parallel zu HAM-Tools (User-Report HB9HJL). Solange HAM-Tools per CAT verbunden war, blockierte es den seriellen Port exklusiv — WSJT-X kam nicht ans Funkgerät. Jetzt kann HAM-Tools' eingebetteter rigctld als lokaler Server (127.0.0.1:4532) offen gehalten werden, an den sich WSJT-X & Co. parallel anhängen (Einstellungen → CAT → »CAT teilen«). Der Server bleibt am Leben, auch wenn HAM-Tools die eigene Verbindung trennt.
  • Yaesu: TUNE löste keinen Tuner-Abgleich aus, sondern schaltete den Tuner aus (User-Report HB9HJL). Die TUN-Pille togglet den Tuner nur an/aus. Neu: ein separater TUNE-Knopf startet bei modernen Yaesu einen echten Abgleich (AC002;). Bei Rigs ohne CAT-Tuner (FT-817/857/897) ausgeblendet — der genaue Tune-Befehl ist pro Profil überschreibbar.

Behoben in v1.10.7

  • Moxon Rectangle lieferte ~24 % zu lange Antenne. Die Konstanten im Rechner stammten aus einer unverifizierten Quelle und führten zu einer Resonanz bei 11.4 MHz statt 14.2 MHz (20 m). Jetzt Cebik W4RNL MoxGen-Polynome drahtdurchmesser-abhängig — verifiziert gegen die offizielle Cebik-Wire-Moxon-Tabelle. Material-Picker Draht 2 mm / Alurohr 12 mm + Validitäts-Warnung außerhalb des Modellbereichs.
  • POTA/WWFF/BOTA-ADIF-Export schrieb Multi-Park-Liste als Komma-Liste in MY_SIG_INFO. Die Upload-Plattformen pota.app / wwff.co / wwbota.net verlangen aber pro Aktivierungsziel ein eigenes File. Jetzt: pro Park/Ref/Bunker eine eigene ADIF mit single MY_SIG_INFO, Filename {call}@{ref} YYYYMMDD.adi. Activator-Call überall einheitlich auf den Log-Aktivierer normalisiert (löst WSJT-X-„STATION_CALLSIGN gemischt"-Problem).
  • Spiderbeam Multi-Band Lel-Werte waren systematisch zu lang. 23 Tabellenwerte (5-Band, Low-Sun, WARC, Original) korrigiert nach DF4SA Bauanleitung v2.20 §2.3.2 („Lel = Tabellenwert − 8 cm" für isolierten Kupferlackdraht).
  • Hexbeam-Rechner skalierte alle Bänder linear aus 20 m. Jetzt bandspezifische Werte direkt aus der WiMo HEX6B-Bauanleitung (G3TXQ Rev. V2.1) für 20/17/15/12/10/6 m, andere via Extrapolation.
  • Spiderbeam-Einzelband konnte nur Flat-Yagi. V-Form-Modus mit Spreader-Halbarm ergänzt, Label „mm" → „cm" gefixt, Multiband-Armwerte angeglichen.
  • HB9CV hatte keine Gamma-Match-Auslegung. Innenleiter-Ø, Abstand und Trimmer-Kapazität werden jetzt berechnet, plus Material-Toggle Rohr/Draht.
  • Groundplane: Drift zwischen App und Web (1.02 vs 1.05) — beide jetzt einheitlich auf 1.02.

Behoben in v1.10.6

  • Zweiter TRX verband nicht / „Port besetzt" (User-Report HB9HJI). Nach Crash, Force-Quit oder USB-Replug blieb ein rigctld-Prozess auf dem fest verdrahteten TCP-Port 4532 liegen und blockierte neue Verbindungen. Die App räumt verwaiste rigctld jetzt vor jedem Verbindungsaufbau auf (exakter Binary-Pfad-Match via libproc).
  • Transceiver-Menü zeigte „CAT einschalten" trotz Verbindung. Der Eintrag richtete sich nach einem internen Schalter statt nach der echten Verbindung → „einschalten" obwohl verbunden, Klick trennte. Jetzt „CAT verbinden/trennen" nach tatsächlichem Zustand, konsistent mit dem Start/Stop-Button.

Behoben in v1.10.5

  • IC-9700 verband nicht über CAT (User-Report HB9HJI). Hingen zwei Icom-Geräte mit CP210x-USB (IC-9700 + IC-7610) am selben Mac, waren ihre Ports im Picker nicht unterscheidbar (usbserial-XXXXX) → es wurde der falsche gewählt, rigctld brach mit „Exit -1" ab. Der Port-Picker zeigt jetzt die USB-Identität (CP210x-Seriennummer). Dazu: echte rigctld-Fehlermeldung (Exit-Code + stdout/stderr) statt „kein stderr", Band-Plausibilitäts-Warnung bei unpassender Frequenz, Icom-Flusssteuerung immer None, CI-V-Platzhalter = Modell-Default.

Behoben in v1.10.4

Drei Fixes aus dem Live-Test (User-Reports HB9HJI) plus Export-Spec-Konformität:

  • Laufende Nummer beim Bearbeiten nicht eingebbar. Der Contest-QSO-Editor hatte keine Felder für Serial/Exchange — jetzt sind S-Nr, Sent Exch und Recv Exch editierbar (wie die Spalten der Log-Tabelle).
  • Contest-Rate viel zu hoch. „Rate 10/60 min" rechnete auf die Spanne seit dem ersten QSO im Fenster hoch (wenige dichte QSOs → absurde Werte). Jetzt feste Fensterbreite als Divisor (N1MM-Verhalten).
  • DX-Cluster „Kont."-Filter filterte nach dem DX statt nach dem Spotter. „Kont. = EU" zeigt jetzt nur Spots von Spottern aus EU (Propagations-Sicht). Land-Spalte und Band-Activity bleiben beim DX-Kontinent.
  • Export-Konformität (Cabrillo/ADIF/EDI). Cabrillo: CATEGORY-MODE: SSB statt PH, neue CATEGORY-ASSISTED/CATEGORY-TRANSMITTER, LOCATION: DX für internationale Calls, ungültige CATEGORY-TIME weggelassen. ADIF: MY_ANTENNA statt des undefinierten ANTENNA. Cabrillo + EDI: CR-LF-Zeilenenden. Geprüft gegen WWROF-v3-, ADIF-3.1.5- und REG1TEST-Spezifikation.

Behoben in v1.10.3

  • EDI-Export: falscher Wertungsblock bei UKW-Contesten. Im EDI-/REG1TEST-Export war das Bänder-Feld der Zähl-Zeilen falsch (CQSOs=n;0 statt n;1; CWWLs/CExcs/CDXCs ohne drittes Feld). Entspricht jetzt VHF Managers Handbook + RUMlogNG-Referenz; gegen reale IARU-R1-145-MHz- und DARC-UKW-Logs geprüft. QSO-Zeilen, QRB-Distanzen und Punktsummen waren bereits korrekt.

Behoben in v1.10.2

Reines Feature-Release (neues „Letzte QSOs"-Panel in der DX-Sidebar) — keine Bugfixes.

Behoben in v1.10.1

Drei Fixes aus dem Live-Test von 1.10.0 (User-Reports HB9HJI):

  • ATNO meldete fälschlich „NEW MODE". Im DX-Cluster zeigte die ATNO-Pille „NEW MODE" für Länder, die in SSB längst gearbeitet waren. Grund: Der aus der Frequenz abgeleitete Seitenband-Mode (USB/LSB) wurde gegen den ADIF-Mode SSB aus dem Log verglichen. Seitenbänder werden jetzt zusammengefasst (USB/LSB = SSB, CWR = CW, RTTYR = RTTY).
  • FT8/FT4 wurde als SSB/USB angezeigt. Die Mode-Erkennung verlangte einen Treffer exakt auf die Dial-Frequenz; FT8-Signale liegen aber über das ~3 kHz breite NF-Passband oberhalb der Dial-QRG verteilt. Jetzt wird das ganze Passband erkannt, plus ergänzte Dial-Frequenzen für 4 m und 2 m FT4.
  • QRZ-Bild-Bereich ließ das Eingabeformular springen. Ohne geladenes Bild hielt die Profil-Spalte ihre Breite nicht — die Felder sprangen nach rechts, mit Bild zurück nach links. Feste Bild-Box mit Platzhalter, kein Springen mehr. Neu: Klick aufs Bild öffnet es in dreifacher Größe.

Behoben in v1.10.0

Kern-/Refactor-Release — keine klassischen Bugfixes, aber zwei Scoring-Korrekturen, die mit der neuen Engine kommen:

  • Kanton-/Distrikt-Multiplikatoren bei vollem Austausch. Steht der Multiplikatorwert als Token in einem mehrteiligen Austausch (z. B. 599 ZH, 599 B07), wird er jetzt korrekt erkannt — zuvor wertete der Multiplikator das ganze Feld und zählte dadurch 0 (Helvetia/Weihnachtswettbewerb-Kantone, WAG-Distrikt).
  • USKA 50 MHz (CW/SSB): kein Großfeld-Multiplikator mehr. Endpunktzahl ist die reine km-Summe gemäß offiziellem USKA-Reglement (zuvor fälschlich mit Großfeldern multipliziert).

Behoben in v1.9.18

Contest-Scoring-Fix aus dem Live-Test (User-Report HB9HJI):

  • Helvetia-Contest-Score komplett falsch berechnet. Ein 219-QSO-Log zeigte 411 Pkt × 23 Mult = 9 453 statt korrekt 1 328 × 110 = 146 080. Drei Fehler: (1) Punkte zählten HB-QSOs mit 1 statt 10 und alle Nicht-HB pauschal mit 3 statt 1 (gleicher Kontinent EU) / 3 (DX) — entgegen USKA-Reglement §2.7. (2) Der Multiplier wertete nur Kantone und deduplizierte sie global, statt Kantone UND DXCC-Länder je Band zu zählen. (3) Das Stats-Panel zeigte in der Summen-Zeile 23 statt 66 Kantone. Jetzt korrekt, mit neuer »Länd«-Spalte und robuster Länder-Auflösung (HB→Schweiz, sonst Feld, sonst Präfix). DXCC-Präfix-Tabelle um fehlende EU-Subpräfixe (DL-Block, BE, NL, PL, BY) erweitert.
  • Export-Buttons in Outdoor-Logs zeigten das volle DX/Contest-Menü. In BOTA/POTA/SOTA/WWFF-Logs erschienen Cabrillo + EDI (und bei SOTA ADIF), obwohl die Portale andere Formate verlangen. Jetzt log-typ-spezifisch: SOTA → nur CSV, POTA/WWFF/BOTA → nur ADIF, Standard/Contest → ADIF + Cabrillo + EDI.

Behoben in v1.9.17

Critical-Hotfix aus dem Live-Test:

  • Outdoor-Log-Anlage »Anlegen«-Button stumm disabled bei unbekannten Refs. Alle vier Outdoor-Wizards (BOTA/POTA/SOTA/WWFF) setzten zwingend einen DB-Match auf den eingegebenen Ref voraus. Neue Refs (noch nicht im gebundelten CSV) oder ungewöhnliche Schreibweisen führten zu canCreate == false, aber der .borderedProminent-Button bleibt visuell aktiv — Klick passierte nichts. Jetzt reicht ein nicht-leerer Query, DB-Lookup ist Bonus für Auto-Fill. Orange Hinweiszeile wenn Ref nicht in DB.
  • Multi-Ref-Hopping-Sektion war versteckt bei ungelookupten Primär-Refs. Greift jetzt sobald ein nicht-leerer Primär-Query da ist.

Behoben in v1.9.16

UX-Hotfix aus dem Live-Test:

  • Outdoor-Tab öffnete ohne Wahl direkt das POTA-Sheet. Wer SOTA, WWFF oder BOTA aktivieren wollte, musste den POTA-Wizard erst abbrechen und über den Sub-Picker neu navigieren. Jetzt zeigt sich beim Outdoor-Klick (wenn noch kein Outdoor-Log existiert) ein Programm-Picker mit allen vier Optionen.
  • WWFF/BOTA-Logs wurden bei Outdoor-Klick ignoriert. Die »existiert schon ein Outdoor-Log?«-Prüfung checkte nur POTA und SOTA — wer ein WWFF- oder BOTA-Log hatte, sah trotzdem den POTA-Wizard. Reihenfolge ist jetzt POTA → SOTA → WWFF → BOTA, also wird zu jedem existierenden Outdoor-Log korrekt gewechselt.

Behoben in v1.9.15

Privacy-Hotfix — drei vergessene Setup-Reste mit dem Call des Autors, retroaktiv beim ersten Lauf des neuen Pre-Release-User-Daten-Checks aufgefallen:

  • Sidebar-Subtitle »HB9HJI Funkwelt« hardcoded. Im Hauptfenster oben unter »HAM-Tools« stand der Call des Autors statt eines neutralen oder dynamisch übernommenen Werts. Jetzt aus den Station-Settings dynamisch, leer bei nicht-gesetztem Callsign.
  • Previous-QSOs-Popover-Hilfetext nannte »HB9HJI« als Beispiel für Base-Call-Match-Erklärung. Auf generisches »DL1ABC« umgestellt.
  • QTHLocator-Feld zeigte »JN47PN« als Placeholder ohne »z.B.«-Prefix — sah aus wie Default-Wert. Auf »z.B. JN47PN« vereinheitlicht.

Erweitert die Privacy-Welle aus v1.9.7 (damals fünf Stellen). Neuer Pre-Release-Check ist seit heute fester Pipeline-Schritt vor build-dmg.sh.

Behoben in v1.9.14

Outdoor-Logger-Polish + 1 selbst gemeldeter Bug:

  • SOTA-Chaser-Logs konnten gar nicht als CSV exportiert werden. Der SOTACSVExporter prüfte »gibt es eigene Summits im Log?« und gab bei Chaser-Logs (logischerweise keine eigenen Summits) stumm eine leere File-Liste zurück. Du hattest also einen sauber geführten Chaser-Trip, aber kein CSV das du auf sotadata.org.uk hochladen konntest. Jetzt eigenes Chaser-Spalten-Schema + neues Pre-Export-Sheet mit Rollen-Picker.
  • Per-Summit-Aktivierungs-Status war über alle Summits eines Logs summiert. Bei Multi-Summit-Hopping zeigte »12/4 — Aktivierung gültig«, obwohl jeder einzelne Summit für sich noch keine 4 QSOs hatte. SOTA-Regel ist aber pro Summit + UTC-Tag separat. Jetzt korrekt mit SOTASessionStatus-Helper und Pro-Aktivierung-Pillen im Form.
  • WWFF-Aktivierungs-Status hatte den gleichen Bug (X/44 über alle Refs summiert), Hunter hatte gar keinen Live-Status. Jetzt analog gelöst mit WWFFSessionStatus + Hunter-Block »N Refs · M Programme · R2R K«.
  • POTA-Aktivierungs-Status ebenfalls (X/10 über alle Parks/Tage summiert). Identisch nachgezogen.
  • BUG-20260522-2040-AW: »Felder nach QRZ-Lookup nicht alle korrekt« (HB9HJI, v1.9.12). Im Standard-Log blieb nach einem zweiten QRZ-Lookup das Feld »Country« mit dem Wert der vorigen Station hängen, andere Felder waren korrekt. Root cause: clearCallbookFields() in QSOEntryPanel räumte 11 Felder, applyCallbookResult() schrieb in 12 — country war im Apply, aber nicht im Clear. Eine Zeile Fix + Symmetrie-Invariante explizit dokumentiert.

Behoben in v1.9.13

Contest-Saison-Cleanup + ein paar Spec-Stellen, die wir bisher kreativ ausgelegt hatten:

  • Contest-ADIF schickte RST doppelt. STX_STRING/SRX_STRING enthielten zusätzlich zum dedizierten RST_SENT/RST_RCVD nochmal den Rapport (»59 LU«). USKA/DARC-Cross-Check verdoppelte das beim Auswerten. Jetzt nur noch das Exchange-Datum (Kanton/State/Grid/Zone) im STX_STRING/SRX_STRING.
  • Cabrillo ohne T-Spalte (Cabrillo-3.0-Spec). Manche Contest-Robots wiesen die Files mit »Parse error: missing T-field at column 80« zurück, weil der Transmitter-ID-Wert am Zeilenende fehlte. Jetzt 0 automatisch ans Ende — und gleich auch CREATED-BY von hardcoded »HAM-Tools 1.5« auf dynamisch BuildInfo.appVersion umgestellt.
  • ADIF: MY_GRIDSQUARE nur bei POTA/SOTA-QSOs. Bei normalen DX- und Contest-Logs fehlte das Feld komplett. LoTW machte deswegen für VHF-QSOs (wo das Feld pflicht ist) keinen QRB-Cross-Check, Club-Log konnte für manche Awards (WAB etc.) die geografische Zuordnung nicht herleiten. Jetzt für jedes QSO geschrieben, generisch aus den Station-Settings.
  • Contest-Form: Cursor blieb nach Enter beim Exchange-Feld. Bei 100 QSOs pro Stunde merkbarer Klick-/Tab-Detour. Jetzt @FocusState mit Cursor-Rücksprung auf »Call« nach jedem Submit + Auto-Uppercase für Kanton/State/Grid/Zone (damit »so« nicht klein im Log landet).
  • USKA 50 MHz Contest-Template hatte falsches Datum + falsche Time-Category. Datum war auf das 2. Wochenende Juni statt 3., Time-Cat war 6 h statt 24 h. Plus Template-Name war nur »USKA 50 MHz« — jetzt »USKA / IARU R1 50 MHz Contest«, damit klar ist welche Regelwerks-Variante gilt.
  • RadioControlPanel-Footer war seit 1.9.4 statisch. Stand permanent »Idle — nicht verbunden«, auch wenn die CAT-Verbindung längst stand. Ein TODO aus dem CAT-Refactor, das durch alle Bug-Reports gerutscht ist. Jetzt echter CATController.Status im Footer.

Behoben in v1.9.12

Feature-Release — reine Erweiterungen, keine Regressionen aus 1.9.11:

  • Logbuch ADIF-Export war »alles-oder-nichts«. Bisher exportierte der »Export ADIF«-Button immer das komplette aktive Log. Für ein Lebens-Log mit ein paar tausend QSOs unpraktisch, wenn man nur einen Ausschnitt (Contest-Tag, letzte 50 QSOs für Club Log) hochladen wollte. Jetzt: ⌘-/⇧-Klick in der QSO-Tabelle markiert eine Auswahl, der Button wechselt zu »Export ADIF (N)« und schreibt nur diese N Zeilen.
  • CAT-Panel hatte keine Slider für Volume und TX-Power. RUMlog/HamLog-Vorbilder zeigen AF/RF-Slider — wir hatten nur Mode/VFO/Split-Buttons. Jetzt zwei neue Slider zwischen S-Meter und Status-Badges. Drag-and-Release-Pattern: während des Ziehens läuft das Update lokal, beim Loslassen einmal ans Rig — spart Roundtrips.
  • SWR war nirgendwo sichtbar. Bei jedem TX musste man aufs Rig-Display schauen, ob die Stehwelle okay ist. Jetzt SWR-Live-Balken im Panel während des Sendens, farbcodiert (≤ 1.5 grün, ≤ 2.0 gelb, > 2.0 rot).
  • TX/RX-Badges waren Placeholder. Die zwei kleinen RX / TX-Pillen neben dem PWR-Wert hatten keinen Live-Read und blieben immer grau. Jetzt liest die App jeden Poll-Tick den PTT-Status (t-Befehl) und färbt die Badges entsprechend — egal ob die PTT vom Mikro, Data oder CAT kommt.
  • Keine schnellen DSP-Toggles. Standard-Funktionen wie Noise Blanker, Noise Reducer, Auto-Notch und Antennen-Tuner waren nur am Rig erreichbar — bei einer leise reinkommenden CW-Station verschwendet man Zeit am Knopf. Jetzt vier Toggle-Pills unter den Status-Badges, Klick togglet die Funktion am Rig.

Behoben in v1.9.11

Live-Test-Feedback aus 1.9.10 (5 Bug-Mails über In-App-Reporter):

  • Previous-Popover fand keine /P-/M-/QRP-QSOs (BUG-20260521-2000-QP). LogbookDatabase.findQSOs(matching:) verglich Calls exakt — wer als »HB9XYZ« suchte, fand keine »HB9XYZ/P«-Einträge, obwohl die im Log waren. Jetzt Base-Call-Match: längster Teil zwischen den »/«-Trennern wird auf beiden Seiten verglichen. Empty-State diagnostiziert zusätzlich »X Logs durchsucht · Base-Call-Match«.
  • »QSL-Bestätigungen abrufen« nur im QSL-Tab versteckt (BUG-20260521-1958-WJ). User suchten die Buttons in den Einstellungen, wo auch die Credentials liegen. Buttons jetzt gespiegelt in Einstellungen → Lookup & Upload → QRZ.com / LoTW, mit Hint »(auch im QSL-Tab verfügbar)«.
  • Contest-Cluster fehlte Worked-Filter + Mult-Markierung (BUG-20260521-2005-CT). Im Contest-Modus erscheint jetzt eine Filter-Bar oben mit Toggle »👁 Gearbeitete ausblenden« + auffälligem grünem »MULT«-Badge neben Multiplikator-Kandidaten + Color-Legende. Erscheint nur bei activeLog?.type == .contest.
  • Frequenz-Eingabe steuerte das Radio nicht (BUG-20260521-1937-SS). Das TextField im RadioControlPanel war editierbar, commitFreqText() setzte aber nur radio.frequencyMHz lokal — kein cat.setFrequencyMHz(). Der Poll-Loop überschrieb den Wert ~200ms später mit der echten Radio-Frequenz, aus User-Sicht »passierte nichts«. Jetzt sendet das Commit bei aktiver CAT die Frequenz ans Radio, mit optimistischem UI-Update um Flicker zu vermeiden.
  • USB-Port musste nach jedem Reboot neu gewählt werden (BUG-20260521-1954-YH). Bei FTDI/CP210x-Chips vergibt macOS dem Stick nach Boot ggf. ein anderes Pfad-Suffix; der gespeicherte Pfad war dann tot, Connect schlug stumm fehl. Neue SerialPortDiscovery.resolve(stored:)-Logik: wenn der Pfad weg ist und genau ein USB-Serial-Port da ist, wird der automatisch übernommen + in CATSettings persistiert (Info-Toast »ℹ️ USB-Pfad migriert: alt → neu«). Bei Mehrdeutigkeit klare Fehlermeldung mit Kandidaten-Liste.

Behoben in v1.9.10

  • LoTW-Pfad-Setup war terminal-lastig. Feld »tqsl-Binary« in den LoTW-Einstellungen war ein reines TextField — wenn die Auto-Detection die App nicht fand (TQSL.app statt Tqsl.app, ungewöhnlicher Installationsort, Homebrew), musste der User mit mdfind oder find im Terminal nach dem Pfad suchen. Jetzt »📁 Suchen…«-Button rechts neben dem Feld, der einen Finder-Picker öffnet und das Binary automatisch aus dem .app-Bundle extrahiert.
  • Yaesu Voice-Memory V5-Slot fehlte. TRX-Voice-Keyer-Reihe zeigte bei Yaesu-Profilen nur V1–V4, obwohl die unterstützten Modelle (FT-991/A, FT-710, FTDX-10, FTDX-101D/MP) hardware-seitig 5 Slots haben. Fünfter Button ergänzt — der Code-Kommentar wies sogar selbst auf das »wir mappen nur 4«-TODO hin. ICOM bleibt unverändert bei 4 Slots (Hardware-Limit).

Behoben in v1.9.9

  • Schedules-Tab war Platzhalter ohne Inhalt. Tab-Bar zeigte »Schedules« mit Calendar-Icon aber disabled-Tooltip »kommt in späterer Phase«. Tab ist jetzt voll implementiert: Skeds + DX-Events mit Countdown, QSO-Form-Pre-Fill, Cluster-Filter, Status-Menü und macOS-Notifications. Persistiert in ~/Documents/HAM-Tools/Cache/schedules.json. Doku unter Module → Schedules.

Behoben in v1.9.8

  • TRX-Voice-Keyer-UI war ICOM-only. V1–V4-Buttons in DX/Contest/Outdoor-Forms zeigten »ICOM Voice / IC-7300/7610/9700/705« und waren stillschweigend nur für ICOM gedacht — Yaesu/Kenwood/Elecraft-User konnten nicht klicken um zu sehen ob ihr Hamlib-Backend das mittlerweile unterstützt. Jetzt markenspezifische Anzeige, Buttons immer aktiv solange CAT verbunden ist.
  • RPRT -11 in der Status-Zeile war kryptisch. Bei Voice-Memory-Aufrufen, die das Hamlib-Backend nicht implementiert, kam »sendVoiceMem abgelehnt: RPRT -11«. Jetzt verständliche Meldung: »Funktion wird vom Hamlib-Backend für dieses TRX-Modell (noch) nicht unterstützt.«

Behoben in v1.9.7

  • Privacy-Leck: DXCluster-Default-Callsign war hardcoded HB9HJI, QTH-Locator hardcoded JN47PN an fünf Stellen (Cluster, Weltkarte 2×, QTH-Locator, Grayline), und der API-User-Agent enthielt »HAMTools/2.0 HB9HJI«. Bei Erstinstallation ohne Eintrag in Station-Settings starteten andere User mit Autor-Identität in Cluster-Login + Distanz-Berechnung; bei jedem API-Request an pota.app/sotadata.org.uk/wwff-cc.org wurde der Autor-Call im HTTP-Header mitgeschickt. Alle Defaults auf "" gesetzt, User-Agent jetzt HAMTools/<appVersion>.
  • Cluster-Spot-Zeit-Mismatch (BUG-20260520-1945-JS): Spot-Liste zeigte je nach Quelle Mac-Lokalzeit, RBN-Skimmer-»UTC«-Strings mit lokalem Inhalt, oder gar gar keine Zeitzone. Jetzt rendert DXSpot.displayTime immer aus dem timestamp-Date in UTC (HHmmZ).
  • Mode-Multi-Select + Band-Sortierung (BUG-20260520-1943-G8): Mode-Filter war Single-Pick, jetzt Multi-Select (Set<String> mit Migration). Band-Filter-Liste sortiert nach Wellenlänge statt alphabetisch.
  • TRX-Setup-Submenu schließt sich (BUG-20260520-1942-B3): CATController als @ObservedObject in TransceiverCommands triggerte sekündliche CommandMenu-Rebuilds durch den Status-Poll-Loop. Jetzt let-Reference, Status wird nur beim Klick gelesen.
  • Spot-Cap zu klein (BUG-20260520-1942-AA): SpotPersistence.maxSpots 500 → 2000. An Contest-WE mit 4+ DXSpider-Knoten waren 500 in ~50 s voll.
  • Grayline-Performance (BUG-20260520-1940-33): nightCells war computed property → 2592 Polygon-Constructions pro Body-Render. Jetzt @State-Cache mit Recompute nur in onAppear/onChange. Plus Grid-Step 5° → 10° (648 statt 2592 Polygone).

Behoben in v1.9.6

  • LoTW: Station-Location-Picker fand keine in tqsl 2.5+ konfigurierten Locations, weil nur der alte Pfad ~/Library/Application Support/TrustedQSL/station_data.xml versucht wurde — aktuelles tqsl legt sie unter ~/.tqsl/station_data.xml ab. Zweiter Pfad-Kandidat ergänzt; Picker zeigt jetzt automatisch was in tqsl-GUI eingerichtet wurde.
  • LoTW: tqsl-Exit-Codes 9 und 10 waren vertauscht. Ein Tester mit falsch eingegebener Station-Location bekam »LoTW-Server nicht erreichbar« statt der korrekten »Location nicht gefunden«-Meldung. Mapping aus tqsl 2.8.4 Live-Test verifiziert: 9 = CONNECTION_FAILED, 10 = COMMAND_ERROR.
  • LoTW: »Station Location X could not be found« landete im generischen CLI-Argument-Fehler-Branch und zeigte einen wenig hilfreichen Text. Eigene Klartext-Erkennung im interpret() gibt jetzt direkt »in Einstellungen → LoTW prüfen« aus.

Behoben in v1.9.5

  • LoTW-Upload meldete »Netzwerk: LoTW-Server nicht erreichbar« obwohl der Upload tatsächlich erfolgreich war. Ursache: das Wort »Connection« in einer tqsl-Zwischen-Logzeile triggerte den Network-Branch im interpret(). Erfolgs-Klartext-Match (»uploaded successfully« / »queued for processing«) läuft jetzt VOR den Netzwerk-Heuristiken. Zusätzlich startet der Subprocess jetzt mit explizitem HOME/PATH + cwd=$HOME (manche App-Sandboxing-Szenarien lieferten ein leeres Environment, das tqsl verwirrte). Fehler-Alerts zeigen jetzt die letzten 500 Zeichen der tqsl-Rohausgabe als Diagnose-Hilfe.

Behoben in v1.9.4

  • LoTW-Upload: tqsl-Exit-Codes waren auf das alte 1.x-Schema (0/3/4/6) gemappt — die aktuelle tqsl-2.5+-Version benutzt Codes 0–11 mit komplett anderer Semantik. UploadOutcome bei Erfolg/Duplikat/Network-Fehler war daher unzuverlässig. Codes neu nachgezogen aus tqsl-Source (apps/tqsl.cpp), Duplikate werden zusätzlich per Text-Match in stdout erkannt (tqsl 2.5+ signalisiert sie nicht mehr per Exit-Code).

Behoben in v1.9.3

  • Startcrash auf macOS 26.3.x: HAM-Tools.app crashte unmittelbar nach Login mit EXC_BREAKPOINT in SCPService.loadRawFile. Ursache war ein vergessener Bundle.module-Direktaufruf — der toleranten AppResource-Helper (aus 1.8.16 für genau diese Klasse von Bugs gebaut) wurde im neuen Contest-SCP-Code übersehen. Jetzt umgestellt; SCPService findet die MASTER.SCP-Datei jetzt unabhängig vom Bundle-Format (flat oder canonical Contents/-Layout). Tester die nach 1.9.2 nicht mehr starten konnten: 1.9.3 manuell laden, danach läuft Auto-Update wieder normal.

Behoben in v1.9.2

  • Rechte Sidebar sprang nach dem 1.9.1-Release weiterhin auf wechselnde Breiten, sobald man zwischen Contest und Standard/Outdoor wechselte. Ursache: HSplitView identifizierte ContestStatsPanel und PropagationPanelView als zwei verschiedene Child-Views und resettete den Splitter bei jedem Wechsel. Beide Panels sitzen jetzt in einem gemeinsamen Outer-VStack, der Frame-Modifier sitzt außen — HSplitView sieht damit stets dieselbe View-Identity. Frame zusätzlich nochmal enger gezogen (min 230 / ideal 255 / max 290).
  • ICOM-Voice-Keyer-Marken-Einschränkung war nur per .help()-Tooltip am Text-Label sichtbar. SwiftUI auf macOS triggert den Hover-Tooltip auf reinen Text-Views unzuverlässig — User sahen die Einschränkung deshalb nicht. Modell-Liste jetzt inline als zweiter Text-View neben „ICOM Voice": IC-7300/7610/9700/705.

Behoben in v1.9.1

  • Light-Theme: CAT-Frequenzanzeige war schwarz-auf-schwarz unsichtbar — Vordergrund hing an theme.textPrimary (fast schwarz), Hintergrund an theme.bgLog (fast schwarz). Wechsel auf theme.logText (grünes Radio-Display) macht die Anzeige in allen Themes konsistent lesbar.
  • Light-Theme: Sidebar-Headlines (DX-Spot senden, Propagation, Solar-Daten, Eigene Spots, Band Activity) waren in hellem Pastell-Gold auf weißem Panel kaum lesbar. Im Light-Theme jetzt theme.accentOrange (#E07000) als Headline-Ton; Dark/Ham Classic bleiben unverändert beim klassischen Gold, Matrix nutzt das Cyan-Akzent.
  • Contest-Wizard speicherte die im Cabrillo-Picker gewählte Band-Kategorie nicht — Wert ging beim Anlegen verloren, Cluster-Filter und Cabrillo-Export fielen immer auf den Template-Default zurück. Schema-v12-Migration ergänzt log_meta.contestBandCategory, alle drei Konsumenten (Cluster-Tab, Export-Sheet, Stats-Panel) lesen jetzt zuerst den Log-Wert.
  • Rechtes Panel sprang beim Wechsel zwischen DX/Outdoor/Contest auf bis zu 340px („zu breit"). Beide Sidebar-Varianten (Propagation, Contest-Stats) nutzen jetzt identische Frame-Werte (min 250 / ideal 285 / max 320), HSplitView kann nicht mehr an den oberen Anschlag ziehen.
  • „Band Activity"-Headline brach bei schmaler Sidebar zweizeilig um (Picker mit width: 100 ließ nicht genug Platz). lineLimit(1) + Picker auf 88px verschmälert — Headline bleibt zwingend einzeilig.

Behoben in v1.9.0

  • DX-Cluster Heatmap-Picker (Band Activity, rechtes Panel): Die 15/30/60-Min-Auswahl wirkte nur visuell — die Zahlen in der Heatmap rechneten weiter mit dem alten Wert. Picker im Panel und bandMatrix-Berechnung waren über zwei unabhängige States entkoppelt. Jetzt computed property direkt im Panel, AppStorage-basiert. Zusätzlich »5 min«-Option, damit man bei vollem Cluster (~500 Spots in der 15-Min-Retention) überhaupt einen Unterschied sieht.
  • App war auf Englisch nicht startbar (war auch nie wirklich englisch). Drei Bugs gleichzeitig: SwiftPM kompiliert das String-Catalog nicht automatisch in die runtime-fähige Form; die generierten Lokalisierungs-Dateien landeten nur im SwiftPM-Sub-Bundle (für SwiftUI unsichtbar); Info.plist fehlten die CFBundleLocalizations-/DevelopmentRegion-Einträge. Alle drei Stellen gefixt — Sprach-Picker im Darstellungs-Tab tut jetzt was er soll.
  • DX-Map QTH-Zentrierung griff nach interaktiver Camera-Bewegung nicht: MapCameraPosition.region wurde von SwiftUI als »gleich« verworfen wenn der User die Karte vorher manuell verschoben hatte. Jetzt mit .camera(MapCamera(...))-Snapshot, animiert sauber zurück zum eigenen QTH.

Behoben in v1.8.16

  • Callbook-Lookup: Beim Klick auf einen neuen Cluster-Spot oder bei manuellem Call-Wechsel + Tab blieben First/Last/Street/City/State/Email/Locator/Zonen der vorigen Station stehen, obwohl Bild und Header schon die neue Station zeigten. applyCallbookResult füllte nur leere Felder; jetzt räumt ein gemeinsamer Helper vor jedem frischen Lookup auf.
  • Radio/CAT-Frequenz-Anzeige: rechtes Segment war nur 2-stellig (10-Hz-Auflösung) — »7.095.00«. Jetzt 3-stellig mit voller 1-Hz-Auflösung: »7.095.000«.
  • Programm-Maps (POTA/SOTA/WWFF/BOTA) hatten dasselbe MapKit-Stall-Risiko wie der History-Tab vor 1.8.15. Hard-Cap + Overflow-Banner ist jetzt auf alle Programm-Maps ausgedehnt.

Behoben in v1.8.15

  • History-Tab-Crash: Bei »Zeitraum = Alle« und einem großen Standard-Log konnte die App beim Klick auf den History-Tab komplett »verschwinden« — Prozess lief weiter, aber kein Fenster wurde mehr sichtbar. Ursache: MapKit-Render-Stall durch zu viele Annotations + Polylines. Drei Schutzschichten: Hard-Cap auf 1500 Annotations, Linien-Limit 500, »Alle«-Option im Zeitraum-Picker entfernt (Max »2 Jahre«).

Behoben in v1.8.13

  • Auto-Update-Check meldete »HAM-Tools ist aktuell«, obwohl auf dem Server eine neuere Version bereitstand — isNewerBuild() verglich nur das Build-Datum als String, Hotfix-Releases vom selben Tag (1.8.11 → 1.8.12 → 1.8.13) wurden so nicht erkannt. Jetzt numerischer Semver-Vergleich primär, Build-Datum nur als Tiebreaker. Wirkt ab dem 1.8.13-Build — wer auf 1.8.12 oder älter sitzt, muss einmalig manuell aus /app/dmg/latest.dmg updaten.
  • Multi-Cluster: Host- oder Port-Änderungen an einem bereits aktiven Cluster-Node wurden vom Pool-Resync ignoriert (alter Client lief weiter). applyActiveNodes() macht jetzt einen Field-Diff und startet betroffene Clients gezielt neu.

Behoben in v1.8.12

  • App-Startcrash auf macOS 26.5 (echte Ursache): macOS 26.5's Bundle.init(url:) liefert für SwiftPM-Resource-Bundles bei manchen Setups nil — Bundle.module greift dann auf seinen fatalError-Fallback zurück und die App crashed direkt in BOTARefService.init. Der 1.8.11-Fix (Bundle-Format kanonisch umbauen) hat das nicht behoben. Ab 1.8.12 wird Bundle.module komplett umgangen: ein neuer AppResource-Helper sucht das Resource-Bundle selbst, toleriert verschiedene Bundle-Layouts und gibt nil statt zu crashen.

Behoben in v1.8.11

  • App-Startcrash auf macOS 26.5 (erster Versuch — siehe v1.8.12 für die echte Behebung): Bundle-Format-Korrektur in build-dmg.sh. Brachte allein noch keinen Erfolg, ist aber für saubere Code-Signing-Hygiene weiter im Build drin.

Behoben in v1.8.10

  • POTA-ADIF-Upload abgelehnt mit „Only a single STATION_CALLSIGN value is supported per log file" — beim FT8-Loggen über WSJT-X-Spots konnte mid-session der my_call von Home- auf Portable-Call wechseln (z.B. HB9HJIIT/HB9HJI/P). Jetzt zwei Sicherungen: WSJT-X-Importer nimmt für Outdoor-Logs immer das im Log-Wizard gewählte Aktivierungs-Rufzeichen; zusätzlich vereinheitlicht der POTA-Export auch alte gemischte Logs.
  • Mode-Picker im Radio/CAT-Panel war ohne CAT-Verbindung gedimmt und nicht klickbar — Loggen ohne Funkgerät (z.B. Remote/Reise-Setup) war damit auf den zuletzt aktiven Mode festgenagelt. Jetzt immer klickbar; ohne CAT zusätzlich FT8/FT4/JT65/JT9/PSK31/JS8/Q65/MSK144 wählbar (Hamlib kennt diese nicht direkt — laufen am TRX über PKTUSB).

Behoben in v1.8.9

  • Club-Log-Upload: 403 Forbidden bei Email-Adressen mit @ und anderen Sonderzeichen — Form-Encoding war nicht RFC-3986-konform und wurde von Club Logs nginx-WAF blockiert. Jetzt strikt RFC-3986-kodiert.
  • Standard-DX-Log warnte bei Mehrfach-Logs desselben Calls (Lebens-Log/Stammrunde/Tages-Log) mit „Schon gearbeitet" — dort sinnlos. Dupe-Warnung jetzt nur noch in Programm-Logs (POTA/SOTA/WWFF/BOTA) und Contest.

Behoben in v1.8.8

  • POTA-ADIF-Upload wurde von pota.app abgelehnt — Export verwendete das ältere nicht-dokumentierte Feld MY_POTA_REF. Jetzt standardkonform mit MY_SIG=POTA + MY_SIG_INFO.
  • WWBOTA-ADIF: alter Stub erzeugte kein hochladbares File — jetzt offizielles Format mit MY_SIG=WWBOTA und Komma-Liste in MY_SIG_INFO für Multi-Bunker.
  • POTA Multi-Park-Hopping: pota.app verweigerte Komma-Listen in MY_SIG_INFO — Export schreibt jetzt automatisch eine eigene Datei pro Park.
  • QRZ-Auto-Fill in POTA/SOTA/WWFF/BOTA-Logs übernahm nur den Namen, der Rest blieb leer — ADIF war DXCC-unvollständig. Jetzt zusätzlich QTH, Locator, Country, Continent, CQ-/ITU-Zone.
  • Hopping-Feld beim Log-Anlegen zeigte nur Häkchen ohne Kontext — jetzt voller Name + Details (Park/Summit/Bunker) pro Eintrag.
  • Bandplan war beengter Sub-Tab im Logbuch — jetzt eigenes Fenster (⌘⇧P, Menü Fenster → Bandplan-Fenster).

Behoben in v1.8.7

  • Update-System verglich die macOS-Mindestversion als String — „10.9" hätte fälschlich als höher als „10.15" gegolten. Jetzt strikt numerischer Versionsvergleich.
  • Inkompatibler Update-Dialog zeigte aktivierbaren „Download öffnen"-Button, obwohl die DMG auf dem System nicht laufen würde. Jetzt deaktiviert mit klarer Begründung.

Behoben in v1.8.6

  • FAQ-Link „Updates rückgängig machen?" verwies auf /app/dmg/ — der Pfad lieferte 403 statt eines Versions-Listings. Jetzt Verzeichnis-Index aller DMG-Versionen.
  • Top-Nav-Download zeigte auf eine versionsspezifische DMG und veraltete bei jedem Release — jetzt versionsloses latest.dmg mit Auto-Symlink.

Behoben in v1.8.5

  • Bandmap als Sub-Tab im Logbuch eingeschränkt — jetzt zusätzlich als Pop-up-Fenster pro Band öffenbar, mehrere parallel auf einem Zweitmonitor sichtbar.
  • DX-Propagation: keine globale Tag/Nacht-Sicht — neue Grayline-Karte als eigenes Fenster.
  • Einstellungs-Zahnrad in der Logbuch-Top-Bar wurde schnell übersehen — entfernt, Einstellungen jetzt über das App-Menü "HAM-Tools → Einstellungen…" (⌘,) bzw. das Transceiver-Menü.

Behoben in v1.8.4

  • CAT-Verbindung trennte sich nach einem QSY oder Mode-Wechsel — Race-Condition zwischen Poll-Loop und Write-Operationen auf demselben rigctld-TCP-Socket. Neuer Client-Lock im CATController serialisiert alle Operationen.
  • Spot-Klick wechselte zwangsweise vom DXClusters- in den Log-Sub-Tab. Du bleibst jetzt, wo du bist — der Draft füllt sich im Hintergrund.
  • DX-Cluster-Tabelle zeigte „SSB" als Mode, obwohl LSB/USB band-abhängig korrekt ableitbar ist (jetzt automatisch).
  • "Einstellungen…"-Eintrag im Transceiver-Menü reagierte nicht (alter NSApp-Selector durch SwiftUI-API ersetzt).
  • 13"-MacBook-Air-Layout: rechte Sidebar (Propagation/Solar/Band Activity) passte nicht auf den Bildschirm, man musste scrollen.

Behoben in v1.8.3

  • BOTA-Map Sub-Tab erschien fälschlich im Standard-DX-Log (nur im BOTA-Programm-Log sinnvoll)
  • "Neuer Contest"-Sheet war zu klein → Buttons "Abbrechen / Anlegen" im Kategorien-Schritt abgeschnitten
  • POTA-Spalten "State" und "Their Park" wurden im Standard-Log angezeigt, obwohl sie nur in POTA-Logs Sinn ergeben
  • Spalten-Auswahl der QSO-Tabelle war nur via Header-Rechtsklick erreichbar → neuer "Spalten"-Button in der Toolbar mit allen 32 Spalten + Reset
  • Spot-Tabellen (DX/POTA/SOTA/BOTA/WWFF) hatten keine Reorder-/Hide-Show-Funktion → komplett auf SwiftUI Table umgestellt

Behoben in v1.7.1

  • Cluster-Click füllte das Contest/POTA-Form nicht — Race-Condition zwischen QSOEntryPanel und dem spezialisierten Form
  • Mode-Picker im Contest zeigte alle Modes statt nur die zur Cabrillo-Mode-Kategorie passenden
  • "Neu…"-Button für CAT-Config kopierte den Serial-Port nicht mit
  • DX-Cluster im Contest zeigte Spots in allen Modes statt nur Contest-Mode

Behoben in v1.7.0

  • Sidebar mit 42 Tools war unübersichtlich → 3 Top-Punkte (Logbuch / DX-Cluster / Rechner) mit Akkordeon
  • Bandplan war eigener Sidebar-Eintrag → in Logbuch-Sub-Tab verschoben
  • DX-Cluster verband erst beim Tab-Klick → jetzt global beim App-Start

Bug melden

In der App: Cmd+Shift+B oder Menüleiste → Hilfe → Bug melden… Per Mail: bugs@funkwelt.net

HAM-Tools © HB9HJI · Funkwelt