Änderungen was sich für Hörer und Sysops ändert
Aktuelle Version in der Registry: 1.6.0-186 vom 13.11.2026. Sysops holen sie mit docker compose pull && docker compose up -d.
Atom-Feed changelog.atom · Stand als JSON api/latest · Sysop-Handbuch
1.6.0-18613.11.2026 · 1 Änderung · latest
Digitale Sprache in M17 und Tern hören
- Der Digital-Knopf hat zwei neue Betriebsarten, M17 und TERN: digitale Sprache auf der eingestellten Frequenz wird hörbar.
- Ein Empfänger hört beides zugleich: M17 und Tern in den Profilen L12 und O12.
- Die Digitalzeile zeigt das Rufzeichen des Sprechers.
1.6.0-18308.11.2026 · 2 Änderungen
Neue Lizenz, Quelltext zum Selbstbauen
- crabSDR steht jetzt unter PolyForm Noncommercial 1.0.0: nicht kommerzielle Nutzung ist erlaubt, kommerzielle nicht.
- Der Quelltext einer Station liegt zu jeder Version unter https://crabsdr.de/quellen/ (ohne Support).
Sicherer und klarer konfiguriert
- Der Stream-Schlüssel kann in einer eigenen Datei auf dem Gerät liegen (
stream_key_file) statt in der Konfiguration. - Alte Namen in der Konfiguration lösen jetzt einen klaren Fehler aus, der den neuen Namen nennt.
1.6.0-11506.11.2026 · 2 Änderungen
API-Beschreibung für eigene Apps und Hardware
- Die Lese-Schnittstelle ist jetzt beschrieben:
/api/doczeigt sie lesbar,/api/openapi.jsonmaschinenlesbar. - Auch das WebSocket-Protokoll (Ton, Wasserfall, Abstimmung) ist jetzt verbindlich dokumentiert.
- Damit lassen sich eigene Oberflächen, Apps oder Geräte (z. B. ein Remote-Head) gegen eine Station bauen.
Betriebsart T (TETRA) überall dabei
- Das Standard-Image enthält jetzt den TETRA-Empfänger; das Zusatz-Image
crabsdr-tist dasselbe Image. - Auch das Release-Archiv und die Debian-Pakete bringen den TETRA-Empfänger mit (Installation ohne Docker).
1.6.0-10805.11.2026 · 2 Änderungen
Handy: volle Oberfläche statt App-Hinweis
- Handys laufen wieder im Browser, mit derselben Bedienleiste wie am Rechner unter dem Wasserfall (quer rechts daneben).
- Frequenz: Ziffer antippen und − / +, oder „MHz ✎“ zum Eintippen.
- Behoben: Eingetippte Frequenzen außerhalb des sichtbaren Ausschnitts wurden ignoriert.
Oberfläche komplett Deutsch oder Englisch
- Sprache nach dem Browser, Schalter DE/EN oben rechts, gilt für alle Seiten und Meldungen der Station.
- Zahlen nach Sprache (438,225 bzw. 438.225 MHz).
- Gäste heißen
crab-47stattHörer-47.
1.6.0-10204.11.2026 · 1 Änderung
Admin zeigt an, wenn es eine neue Version gibt
- Das Verzeichnis crabsdr.de nennt in der Antwort auf die Meldung der Station die aktuelle Version der Registry. Liegt sie vor der laufenden, zeigt die Admin-Seite oben eine grüne Leiste: Version, Datum, „Änderungen ansehen“ (crabsdr.de/changelog) und der Befehl zum Aktualisieren. Nur mit
[directory] enabled; ohne neue Version ist nichts zu sehen. - Die Änderungen stehen ab jetzt je freigegebener Version unter https://crabsdr.de/changelog, auch als Atom-Feed (
changelog.atom) und als JSON (api/latest).
1.6.0-10004.11.2026 · 1 Änderung
Handy-Browser: keine Oberfläche mehr, nur Hinweis auf App oder Computer
- Auf einem Telefon (iPhone, Android-Handy: kurze Bildschirmseite unter 600 px mit Touch, oder Telefon laut Browserkennung) leitet
index.htmlsofort auf die neue Seitehandy.htmlum: traurige Krabbe, Stationsname, „Bitte die crabSDR-App für iPhone nehmen oder die Seite am Computer öffnen“ (deutsch und englisch), Knöpfe zu crabsdr.de/app/ und crabsdr.de. Die kleine Handy-Ansicht gibt es damit nicht mehr; Tablets (iPad) und Rechner mit Touch-Bildschirm laufen wie bisher. - Der Server liefert
handy.htmlwieindex.htmlmit den{{STATION_*}}-Platzhaltern aus. Testtools/e2e/handy.spec.mjs(ersetztdecmenu.spec.mjsund den Handy-Teil vonbandpick.spec.mjs).
1.6.0-9903.11.2026 · 2 Änderungen
Spektrum-Abruf: Sysop schützt seine Leitung, Abholer holen kleiner
GET /api/spectrum/<band-id>?px=<n>verkleinert die Antwort aufnWerte (Zweierpotenz ab 64 bis zur FFT-Breite): je Wert das Maximum seinerfft/nBins, wie die Wasserfall-Pixel – ein Band mit 32768 Bins kommt so als 4096 Werte. Neue KopfzeilenX-Px(Werte im Body) undX-Bins-Per-Px;X-Fft-Sizebleibt die FFT. Krumme Werte: 400.- Zwei neue Sysop-Einstellungen in
[station]:spectrum_min_interval_ms(Mindestabstand zwischen zwei Abrufen derselben Adresse, Voreinstellung 500 = bisheriges Verhalten; darunter 429 mitRetry-Afterin ganzen Sekunden, aufgerundet; 0 = keine Bremse) undspectrum_max_px(breiteste Antwort, 0 = volle FFT). Beides auch über die Admin-API setzbar. Beschrieben indocs/CONFIG.mdunddocs/STREAM.md, Testtools/e2e/spectrum.spec.mjs.
Unterbereiche ohne Hörer: Wasserfall-Verlauf und Spektrum laufen sparsam weiter
- Seit 30.10. bekam ein Unterbereich ohne Hörer vom Elternband nichts (jeder kostete CPU, auch unbenutzt). Dadurch hatte ein neuer Hörer dort keinen Wasserfall-Verlauf und
/api/spectrumantwortete 503. Jetzt bekommt er je Wasserfallzeile (10 je Sekunde) einen zusammenhängenden Ausschnitt von 1,5 FFT-Längen – auf dem FFT-Weg aufeinanderfolgende Rahmen, auf dem DDC-Weg ein Stück des IQ-Stroms – und rechnet daraus genau eine Zeile, sonst nichts. - Kosten: etwa ein Viertel eines gehörten Unterbereichs (4096 Punkte, 250 kS/s: 25 ms Signal je 100 ms; bei 6 MS/s Elternband rund 150 000 Samples je Zeile durch den DDC bzw. die Band-FFT). Ruht auch das Elternband, rechnet es dafür je Zeile einen Ausschnitt durch die Band-FFT statt nur einer gefensterten FFT. Bei FPGA-Bändern bleibt alles wie bisher (ruhende Unterbereiche ohne Zeile).
- Testaufbau
testdata/config-spar.toml(Port 8084, FFT- und DDC-Weg) intools/e2e/run.sh.
1.6.0-9703.11.2026 · 3 Änderungen
Spektrum abrufen für Sysops und Monitoring
- Neue Schnittstelle
GET /api/spectrum/<band-id>: die aktuelle Wasserfallzeile des Bandes in voller FFT-Breite (geglättetes Anzeige-Spektrum, ein Byte je Bin = dBFS + 140), zstd-gepackt oder mit?raw=1roh; KopfzeilenX-Center-Freq,X-Sample-Rate,X-Fft-Size,X-Time,X-Encoding. Rechte wie beim Hören (öffentliche Bänder ohne Token), zählt nicht als Hörer, weckt kein ruhendes Band; höchstens zwei Abrufe je Sekunde und Adresse (sonst 429,HEADzählt nicht).X-Agenennt das Alter der Zeile; steht das Band (30 s keine FFT) oder wird es gerade umgestellt, kommt 503 statt einer alten Zeile. Beschrieben indocs/STREAM.md(„Spektrum abrufen (Monitoring)“), Testtools/e2e/spectrum.spec.mjs.
RTTY bei 170 Hz Ablage (Amateurfunk, 45,45 Bd) repariert
- Der Decoder machte bei 170 Hz 15–18 % Zeichenfehler, selbst ohne Rauschen (bei 450 und 850 Hz war er in Ordnung). Zwei Ursachen: Die Polaritätswahl zählte den Buchstabenmüll der falschen Lage als gültig und trennte die Lagen kaum; dazu kam, dass die Mitte im Vorlauf (nur Dauer-Mark) zuerst auf ein falsches Tonpaar sprang und beim Umstellen die Filter die Rollen tauschten, ohne dass die Polarität neu bewertet wurde – danach kam nur Müll. Und die Schwundregelung (ATC) folgte den Tonspitzen zu träge: bei 170 Hz ist ein einzelnes Space-Bit im Tonfilter nur eine kurze Spitze, die Begrenzung sättigte zu früh, das Bit wurde zu breit und das nächste falsch abgetastet (LTRS wurde V).
- Jetzt: Polaritätsgüte = Anteil der Rahmen mit Stoppbit (Fehlrahmen zählen voll); die Mitte wird erst gesetzt, wenn beide Töne da sind (ein Ton allein ist zweideutig); bei neuer Mitte werden Schwundregelung und Polaritätswertung neu begonnen; die ATC hält die Spitze sofort (8 Bit Abklingen) und nutzt einen gemeinsamen Rauschboden aus dem jeweils schwächeren Ton (wie fldigi).
- Ohne Funk geprüft (
plugins/rtty/test_rtty.py alle, 15 dB, Grenze 5 %): 45,45/170 mit Schwund 0,0 % (vorher 13 %), ohne Schwund 0,0 % (vorher 38 %), 50/450 0,0 % (vorher 3,8 %), 75/850 2,5 %, 100/850 2,9 % (unverändert); bei 8 dB 45,45/170 5,0 % statt 22,7 %. Beide Polaritäten (MARK_HIGH=1) und der Decoder auf Wunschfrequenz laufen.
RTTY: Vorgaben mit 850 Hz Ablage
- Decoder auf Wunschfrequenz: zusätzlich 50, 75 und 100 Bd mit 850 Hz Ablage (ohne Funk geprüft,
plugins/rtty/test_rtty.py). „Eigene“ für alles andere bleibt.
1.6.0-9302.11.2026 · 4 Änderungen
Teilen-Link nimmt den Decoder mit
- Wer gerade DV oder T hört, teilt das mit:
?tune=145500.000dv(DV in USB),…dvl(DV in LSB),…t; ein gehörter Stations-Decoder (z. B. FreeDV) hängt als&dec=<id>an. Der Text zum Link zeigt DV, DV-L, T oder den Decoder-Namen. So ein Link startet den Decoder nach dem Laden, sobald bekannt ist, dass die Station ihn kann (sonst nur die Betriebsart). - Der gemerkte Stand beim Gerätelook-Wechsel (
?skin=) nimmt den Decoder ebenfalls mit; der Neustart nach Stream-Abriss auch. - Neuer Test
tools/e2e/teilen.spec.mjs.core.js?v=133,ui.js?v=105.
Bandbreite frei je Betriebsart, Filterkanten nur Anzeige
- − / + gehen nicht mehr durch feste Vorgaben, sondern in Schritten der Betriebsart: CW 50 Hz (100 Hz – 2 kHz), USB/LSB 100 Hz (300 Hz – 6 kHz), AM 500 Hz (2 – 12 kHz), FM 1 kHz (6 – 25 kHz), DISC 5 kHz (10 – 250 kHz). Gedrückt halten läuft weiter. AM/FM/DISC symmetrisch, CW um den Mithörton. USB/LSB wie am Funkgerät: die untere Kante bleibt, die obere wandert (Hicut); schmal unter 1 kHz liegt das Fenster um den 1,5-kHz-Ton (RTTY/PSK), ein Fenster abseits des Trägers wird um seine Mitte breiter oder schmaler.
- USB/LSB starten mit 2,8 kHz (02.11.); gilt für den Betriebsarten-Knopf, Links mit
?tune=, die DV-Anzeige und den Gerätelook. „Hoch“ kennt dafür 3,1 kHz. - Betriebsart neu anklicken = Vorgabe. Tief, Hoch und NF werden nicht mehr je Betriebsart im Browser gemerkt: wer USB, AM oder FM neu wählt, bekommt immer die Standardfilter (02.11., damit es Einsteiger einfach haben). Innerhalb der Betriebsart (Bandwechsel, Seitenband) bleibt die Einstellung.
- Breite beim Laden gleich glatt („2,8“ statt „2.80“).
- Wert anklicken = eintippen: kHz („2,4“) oder Hz („2400“), Einheit darf dran („400hz“, „2.4k“), Enter übernimmt, Esc verwirft.
- Filterkanten im Wasserfall sind nur noch Anzeige. Das Ziehen der Kanten passierte ständig aus Versehen; Breite jetzt nur über − / +, Eintippen oder Tief/Hoch. Ziehen am gelben Balken zum Abstimmen geht weiter.
- Gerätelook rs: die BW-Taste läuft weiter durch eine kurze Liste je Betriebsart (eigene Datei im Stationsordner).
- Neuer Test
tools/e2e/bw.spec.mjs; Hörer-Anleitung angepasst.core.js?v=132,ui.js?v=104,ui.css?v=84,look.css?v=21.
Gerätelook ein/aus verwirft nichts mehr
- Beim Wechsel in einen Look (
?skin=rs) oder zurück (?skin=aus) bleibt alles, was der Hörer eingestellt hatte: Band, Frequenz, Betriebsart, Durchlassbereich, Zoom, Lautstärke, Stumm, freier VFO. Vorher begann die Seite nach dem Aufruf wieder mit der Startfrequenz des Bandes. Der Stand wird beim Verlassen je Tab gemerkt (sessionStorage, 10 min) und nur bei einem Aufruf mit?skin=wieder eingesetzt – auch beim Neuladen im Look; ein Link mit?tune=hat Vorrang. Neuer Testtools/e2e/skin.spec.mjs.core.js?v=129.
Relais: schönere Seite „Station nicht erreichbar“
- Ist eine Station über das Relais gerade nicht verbunden (Neustart, aus, ohne Internet), zeigt
<name>.crabsdr.dejetzt die traurige Krabbe groß im crabSDR-Look statt des orangen Krabben-Emojis. Die Seite fragt alle 5 s nach und lädt von selbst neu, sobald die Station wieder antwortet – nach einem Update geht es also nach Sekunden weiter.
Ältere Versionen (1.6.0-86 und davor, 14 Abschnitte)
1.6.0-8601.11.2026 · 46 Änderungen
Sammelt die Freigaben 1.6.0-43 bis 1.6.0-86 (17.10.–01.11.2026).
Hörerzahl auf crabsdr.de stimmt
- Die Startseite zählte jede offene Band-Ansicht als eigenen Hörer (DF0HHH mit drei Wasserfällen: „4 hört“ bei zwei Hörern). Die Station meldet dem Verzeichnis jetzt Personen (nach Sitzung zusammengefasst wie
/api/listeners).
Ruhigere Tasten, Wasserfall bleibt beim Größerziehen
- Tasten hüpfen beim Drücken nicht mehr (Betriebsart, − / +, Decoder, Bandbreite): sie bleiben stehen, nur der Grund wird dunkler.
- Wasserfall mit Auflösung von Hand (1:1): Ändert man die Fenstergröße, bleibt das Bild stehen. Vorher wurde der ganze Verlauf neu geholt und neu gezeichnet. Jetzt füllt der Verlauf nur den neuen Platz unten, beim Verkleinern wird gar nichts nachgeladen. Bei automatischer Auflösung bleibt es wie bisher.
- DV-Taste pulsiert bei Lock nicht mehr, grüne Schrift und Punkt zeigen den Lock ruhig an.
- Zoom und „Einstellungen ▾“ (Auflösung, Qualität, Farben) stehen wieder im Bedienfeld, rechts in der Zeile mit der Schnellwahl; der Rand oben am Wasserfall ist wieder frei.
- Eigener Look aus dem Stationsordner:
?skin=<name>lädtskins/<name>/skin.cssundskin.js, nur auf Wunsch des Hörers und nur, wenn die Station die Dateien hat;?skin=ausschaltet zurück (docs/CONFIG.md). core.js?v=128,look.css?v=20,ui.css?v=83. Neuer Testwfkeep.spec.mjs.
Band-FFT im FPGA
- Neues Format
format = "fpga"fürdriver = "rx_sdr"auf dem Pluto+-Klon mit crabSDR-FPGA-Bild: das FPGA rechnet die Band-FFT (4096 Punkte, Blöcke mit 25 % Überlappung wie bisher in der CPU) und schickt je Block nur die Bins, die Hörer-Kanäle und Zoom gerade brauchen. Die CPU schneidet daraus wie gewohnt die Kanäle aus. Gemessen vorher: die Band-FFT allein kostete auf dem Pluto 68 % eines Kerns bei 1,6 MS/s, 104 % bei 2,5 MS/s, bei 5 MS/s ging es nicht mehr. - Der Wasserfall kommt fertig gemittelt aus dem FPGA (über alle Blöcke statt jede 13. FFT, Blackman-Fenster im Frequenzbereich). Rauschen liegt dabei etwa 1 dB tiefer als bisher (Betrag statt Leistung gemittelt).
- FFT-Größe ist fest 4096, Unterbereiche gehen damit (noch) nicht. Ohne geladenes Bild meldet der Server einen Fehler und versucht es alle 10 s neu.
- Datenbudget im FPGA-Modus: Kanäle zuerst, ein feines Zoom-Spektrum nur, wenn seine Bins hineinpassen (sonst das gestreckte Gesamtspektrum). Auf dem Breitbild forderte die 2. Zoomstufe bei 10 MS/s 1332 Bins je Block an → 119 % eines Kerns, Ton kaputt. Blöcke werden wiederverwendet statt je Block neu angelegt.
packaging/build-tetra.shbaut crab_tetra auch für armv7 (Betriebsart T auf dem Pluto+).
Bedienfeld aufgeräumt: Frequenz in der großen Anzeige, Zoom im Wasserfall
- Die große grüne Frequenz ist jetzt das Eingabefeld: Zahl tippen (oder Doppelklick, Taste G) und Enter – in MHz (
438,9) oder kHz (438900); liegt die Frequenz in einem anderen Band, wechselt das Band. Ziffer anklicken = diese Stelle verstellen mit − / +, Mausrad oder ↑ ↓ (nochmal klicken oder Esc = wieder Rasterschritt). Das kHz-Feld in der zweiten Zeile ist weg. - Raster ist eine Taste im Stil der Betriebsarten zwischen − / + und FM (blass bei SSB/CW, dort rastet nichts).
- Zoom (− + ganzes Band) und das Menü „Einstellungen ▾“ (Auflösung, Qualität, Farben) stehen als schmale Leiste rechts am oberen Rand des Wasserfalls, ohne das Bild zu verdecken (
look.css?v=18); die vierte Zeile entfällt. - Das Klappmenü „Digital“ (Decoder der Station) ist am PC weg – dasselbe zeigt die Seite Digital. Im Handy-Menü bleibt es.
core.js?v=125,ui.js?v=102,look.css?v=18. Testfreqedit.spec.mjs,decmenu.spec.mjsprüft jetzt das Handy-Menü.
Logo ohne Punkt an der Schere
- Der weiße Leuchtpunkt an der linken Scherenspitze ist aus dem Logo entfernt (
logo.svg,crabsdr-mark.svg,crabsdr-logo.svg, Favicon, App-Symbol samt PNGs, Logo-Animation). Er wirkte bei kleiner Größe wie losgelöst.logo.svg?v=2,favicon.svg?v=3,icon-180.png?v=2,core.js?v=123.
Bedienfeld neu sortiert, Filter je Betriebsart
- Zeile 1: Frequenz, Betriebsart, S-Meter. Zeile 2: Frequenzeingabe, Schnellwahl, Bereich, Raster. Zeile 3 „Ton“: Lautstärke, Squelch, die Felder der Betriebsart, NB/NR/Notch, Stumm, Aufnahme. Zeile 4: Zoom, Wasserfall, Digital; die Digitalzeile steht unter der Ton-Zeile.
- Felder der Betriebsart: USB/LSB Tief/Hoch (Kanten) und Breite, AM Tief (NF-Hochpass) und Hoch, FM/DISC HF-Bandbreite und NF-Bandbreite (Tiefpass auf dem Ton), CW Breite und CW-Ton; AGC nur bei AM/SSB/CW. Feste Mindestbreite, nichts springt. Im Browser je Betriebsart gemerkt (
crab_fx). - Server: neue Nachricht
set_audio{lo, hi} (Hz) – Tonfilter je Hörer, Teil des Kanal-Schlüssels; wirkt bei AM/SAM (Hochpass/Tiefpass) und FM/DISC (Tiefton/NF-Bandbreite).core.js?v=122,look.css?v=16. - Handy-Ansicht unverändert (noch ohne die neuen Felder).
Unbenutzte Bänder ruhen, Stationsordner, Startfrequenz
- Bänder ohne Verbindung (kein Hörer, kein Wasserfall, kein Decoder) und ohne aktiven Unterbereich ruhen: statt der ganzen Overlap-Save-Kette nur eine FFT je Wasserfallzeile, damit der 2-min-Verlauf weiterläuft. Unterbereiche ohne Verbindung bekommen gar keine Daten (ihr Verlauf beginnt beim ersten Hörer). Vorher kostete jedes Band und jeder Unterbereich die volle Rechenzeit, auch unbenutzt. Log: „Band ruht“ / „rechnet wieder“.
- Ohne
site_dirgilt<data_dir>/site; der Server legt den Ordner an. Behebt „Kein Stationsordner (site_dir) konfiguriert“ unter Admin → Relais & Marker. - Neue Band-Einstellung
start_freq(Hz): neue Hörer starten dort statt in der Bandmitte. Admin-Seite: Feld „Startfrequenz (MHz)“ (admin.js?v=12).
Hörer-Kanäle schneller, Abstimmen ohne Stocken
- Resampler und FM-ZF-Filter rechnen das Skalarprodukt über einen verdoppelten Ringpuffer statt mit Modulo bzw. Verzweigung je Koeffizient (der Cortex-A9 hat keine Hardware-Division). FM-Kanal auf dem Pluto+ 112 → 28 ms je s; auf x86/aarch64 kann der Compiler die Schleife jetzt vektorisieren.
- Die Resampler-Koeffizienten werden je Ratenpaar einmal entworfen und von allen Kanälen geteilt. Der Entwurf kostete bei krummen Verhältnissen (12 891 → 24 000 S/s) auf dem Pluto+ 170 ms bei jedem Abstimmen und hielt so lange den DSP-Thread an; jetzt nur beim ersten Kanal dieser Bandbreite. Spart auch je Kanal ~1 MB Speicher.
32-Bit-ARM (Zynq/Pluto+): NEON-FFT und Band-FFT auf mehreren Kernen
- Auf
armv7rechnet die Band-FFT jetzt mit PFFFT (NEON) statt rustfft (dort nur skalar) und verteilt ab 2 MS/s die Blöcke eines Rahmens auf zwei Kerne; die Hörer-Kanäle laufen ab zweien ebenfalls auf zwei Kernen. Beides mit einem kurzlebigen Hilfs-Thread (zwei_kerne) statt rayon – rayon ließ auf zwei Kernen drei Threads kreisen (10 Hörer: 1,7 statt 1,4 Kern). Gemessen auf dem Pluto+ (2× Cortex-A9, 667 MHz): FFT 5–10 % schneller, parallel ~30 % weniger Wartezeit im DSP-Thread. amd64/arm64 unverändert. - libopus für armv7 mit NEON (
packaging/build-binaries.sh: cmake bekam beim Cross-Bau keinen Prozessor und ließ die ARM-Teile weg). - Startmeldung des DSP-Threads nennt die FFT (
rustfft,pffft-neon,parallel);CRABSDR_FFT=rustfft|pffftundCRABSDR_FFT_PARALLEL=0|1überstimmen die Wahl (Messen, Fehlersuche). Messung:cargo test -p crabsdr-dsp --release --test fft_tempo -- --ignored --nocapture.
RX888: ganze Kurzwelle aus einem Gerät
- Neuer Treiber
driver = "rx888"(MkII, MkIII): crabSDR spricht den RX888 selbst über USB an (ohne libusb, ExtIO oder SoapySDDC) und lädt die Firmware beim Start.sample_rate= IQ-Rate, der ADC läuft mit dem Doppelten, Mitte fest bei der halben Rate: 32 MS/s → 0–32 MHz, nutzbar 1,6–30,4 MHz. Verstärkunggaingesamt odergain_elementsRF (Dämpfung −31,5…0 dB) und IF (VGA −24,6…+33 dB),settings = "pga=1"/"dither=1",bias_teefür die HF-Fernspeisung. - Reell → IQ mit einem Halbbandfilter, das nur auf jedem zweiten Wert rechnet (AVX2 auf x86-64): ≈ 0,2 Kern bei 64 MS/s auf einem älteren Xeon/i5.
- Unterbereiche, deren Rate die FFT des Elternbandes ganzzahlig teilt (z. B. 250 kS/s aus 32 MS/s mit FFT 65536), schneiden jetzt direkt aus dieser FFT (echtes FIR mit 90 dB im Overlap-Save) statt mit Mischer und Filter bei voller Rate – je Unterbereich wenige Prozent statt gut 0,1 Kern. Gilt für alle Stationen; andere Raten bleiben beim Mischer.
- Admin-Seite „Sticks“: findet den RX888 und legt ihn mit einem Klick als Band an, auf Wunsch mit allen Amateurfunkbändern 160–10 m als Unterbereiche.
admin.js?v=11. - Docker: RX888 und USRP melden sich nach dem Firmware-Laden neu an –
/dev/bus/usbals Volume plusdevice_cgroup_rules: ["c 189:* rmw"](siehedocs/DOCKER.md).
PlutoSDR, USRP, Airspy HF+ im Docker-Image
- Neu im Image: SoapyPlutoSDR (
driver=plutosdr, USB oderhostname=…), SoapyUHD mit UHD 4.3 (driver=uhd, FPGA-Images einmal mituhd_images_downloaderins Volume,/data/uhd-images), SoapyAirspyHF (driver=airspyhf). Abstimmbereich des freien VFO nach Gerät (Pluto 70–6000 MHz, USRP 10–6000, Airspy 24–1800, HF+ 0,009–260). - Fehler behoben:
driver = "airspy"bzw."airspyhf"stand in der Doku und wurde von der Prüfung angenommen, das Band startete aber nie („Unknown SDR driver“). Beides läuft jetzt über SoapySDR wierx_sdr.
Betriebsart: vier Umschalter
- Vier Tasten statt einzelner Knöpfe: FM ⇄ AM, USB ⇄ LSB, CW ⇄ CWr, Digital (DV und T, wenn die Station sie anbietet, dazu DISC). Jede Taste zeigt die gewählte Betriebsart groß, darunter klein alle Stellungen, ⇄ oben rechts = Tippen schaltet weiter; die Tasten haben Tiefe und geben beim Drücken nach. Erstes Tippen auf USB/LSB wählt das Übliche (unter 10 MHz LSB, darüber USB). Die Frequenz bleibt beim Wechsel stehen.
- Neue Betriebsart CWr (CW im anderen Seitenband, Ton gespiegelt): Server, Stream-Links (
/stream/…/cwr),mode = "cwr"im Band. - CW-Ton (Mithörton) 300–1200 Hz als Auswahl, im Browser gemerkt; der Browser schickt ihn als
pitchmit, der Decoder „CW“ auf Wunschfrequenz hört auf derselben Tonhöhe. - Die Leiste springt nicht mehr: CW-Ton und AGC bleiben stehen und werden nur blass, wenn sie nicht gelten.
core.js?v=116,ui.js?v=97,ui.css?v=77,look.css?v=14,decode.js?v=5.
Digitalzeile immer an derselben Stelle
- Die Zusatzzeile steht jetzt fest unter der Hauptzeile, auch ohne DV/T (dann blass „DIGITAL aus“) – die Leiste springt nicht mehr, das S-Meter bleibt oben. Dort steht DV (Rufzeichen, Mode, SNR) und T (Zelle, Gespräch, Signalqualität) – die Betriebsarten des Digital-Knopfs. Decoder auf Wunschfrequenz (CW, RTTY, PSK31) schreiben nur ins Decoder-Feld.
core.js?v=119,decode.js?v=7,ui.css?v=79.
Decoder-Feld in der Chat-Leiste
- Der Decoder auf Wunschfrequenz (CW, RTTY, PSK31) sitzt jetzt in der angedockten Leiste und sieht aus wie der Chat. Sind beide offen, teilen sie sich die Leiste halb/halb (breit übereinander, mittel nebeneinander).
- Kopf in einer Zeile: Auswahlliste statt Knopfreihe, SQ, Leeren (⌫), Kopieren (⧉), Schließen.
Hauptzeile einheitlich
- Frequenz − +, Decoder und Bandbreite − Wert + sehen jetzt aus wie die Betriebsart-Tasten: einzelne Tasten mit Tiefe, alle gleich hoch. Decoder zeigt klein darunter, was er mitliest (CW · RTTY · PSK31); die Bandbreite steht als eingelassene Anzeige mit Komma da („2,4“ / kHz).
look.css?v=15,core.js?v=121,ui.js?v=101,decode.js?v=8.
Unterbereiche unter ihrem Gerät
- In der
config.tomlstehen virtuelle Bänder jetzt eingerückt als[[bands.sub]]unter dem Gerät, aus dem sie geschnitten werden, statt als eigene[[bands]]mitparent = …daneben. Intern wie bisher (gleiche Bänder, gleiche Prüfungen);parent = …gilt weiter. In der Oberfläche stehen die Unterbereiche als Reiter vor ihrem Gerät. - Admin-Seite: Unterbereiche eingerückt unter ihrem Gerät, „Quelle: Unterbereich von …“ legt sie dort an; für ältere Dateien „Unter ihr Gerät schreiben“ (stellt
parent = …um, mit Sicherung, Kommentare wandern mit).admin.js?v=10,admin.css?v=4. - DO0RAM umgestellt (160/80/60/40 m unter „KW gesamt“). Doku:
docs/CONFIG.md, Sysop-Handbuch.
Mini-Player: weiterhören auf Digital und Info
- Digital und Info öffnen jetzt innerhalb der Hören-Seite; der Empfänger läuft mit allen Einstellungen weiter (Frequenz, Betriebsart, Bandbreite, Lautstärke, Decoder). Unten rechts ein kleiner Player wie bei YouTube: Frequenz, Betriebsart, Band, Pegel, Stumm, Lautstärke, „Hören ↩“. Am PC verschiebbar (an jeder freien Stelle greifen, Position wird gemerkt), am Handy als Leiste unten.
- Browser-Zurück schließt die Seite wieder (
#digital,#infoals Adresse, auch zum Teilen). Links aus den Seiten zurück zur Hören-Seite (z. B.?tune=…) stimmen ab, ohne neu zu laden; Admin u. a. öffnen weiter im ganzen Fenster. - Eingebettet blenden die Seiten ihren eigenen Kopf und Fuß aus (
?embed=1,common.js?v=4,pages.css?v=3). Neuminiplayer.js?v=3,ui.js?v=100,ui.css?v=82; Testminiplayer.spec.mjs.
Betriebsart bleibt beim Bandwechsel
- Beim ersten Besuch eines Bandes setzte die Seite die Vorgabe der Station (
modeim Band) und überschrieb damit die eigene Wahl (z. B. CW → LSB). Jetzt bleibt die gewählte Betriebsart; nur USB/LSB folgt dem Band (Vorgabe des Bandes, sonst unter 10 MHz LSB). Die Vorgabe der Station gilt, solange der Hörer noch nichts selbst gewählt hat.core.js?v=120,ui.js?v=99.
Bandbreite schlicht
- Statt der Vorgabe-Knöpfe nur noch der Wert zwischen − und +; die Knöpfe springen zur nächsten Vorgabe, am Ende der Liste bleibt es stehen (feiner: Filterkante im Wasserfall ziehen).
- Feste Vorgaben aus 200 · 400 · 1800 · 2400 · 2800 · 4000 · 6000 · 12000 · 16000 Hz, je Betriebsart die sinnvollen: CW/CWr 200 · 400 · 1800, USB/LSB 400 · 1800 · 2400 · 2800 · 4000 (400 Hz liegt um 1,5 kHz Ton, für RTTY/PSK), AM 4000 · 6000 (Start 6000 statt 8000), FM 12000 · 16000 (16 kHz für ±5 kHz Hub), DISC/T weiter 12,5 · 25 · 50 · 100 kHz.
S-Meter mit fester Zahlenbreite
- Die Zahlen rechts neben dem Balken haben eine feste Spalte; der Balken springt nicht mehr, wenn der Wert von +9 auf +23 wechselt oder die S-Stufe dazukommt.
Decoder schonen die SD-Karte und den Ton
- Zwischendateien (FT8/FT4/WSPR-WAV alle 15 s,
summary.json,ft8.json) liegen im RAM (/dev/shm/crabsdr, Plugins bekommenCRAB_TMPundTMPDIR); bleibende Protokolle (events.jsonl, Bilder) weiter im Datenordner. - Decoder laufen mit
nice 19(niedrigste Priorität), Ton und Wasserfall der Hörer gehen vor.
RTTY von Hand einstellen
- Im Decoder-Feld gibt es zu Decodern mit Vorgaben den Knopf „… eigene“: Baud, Shift und Polarität frei eintragen.
Temperatur: höchster Fühler
- Statuszeile und Admin-Überblick zeigen die höchste Temperatur aller Fühler (thermal_zone*, hwmon) statt
thermal_zone0– das war auf manchen Rechnern der Gehäusefühler (27 °C statt 49 °C Kern).
Admin: Stationsangaben ohne Neustart
- Name, Untertitel, Impressum usw. gelten sofort nach dem Speichern; nur andere Änderungen verlangen den Neustart.
- Der Hinweis „Neustart nötig“ stand wegen eines CSS-Fehlers immer da, auch ohne ausstehende Änderung – behoben.
admin.js?v=8,admin.css?v=3.
Tests
- Neuer Oberflächentest
modes.spec.mjs; veraltete Tests (Logbuch, Titel, Aufnahme, Raster, Decoder-Menü, Admin) an die heutige Oberfläche angepasst –tools/e2e/run.shläuft wieder komplett grün.
Animierte Krabbe im Stream
?anim=1am.ogg-Stream legt die crabSDR-Krabbe als kleine Theora-Videospur dazu (160 × 140, 6 Bilder/s, 3-s-Schleife, rund 8–10 kbit/s). Nur auf Wunsch; ohne den Parameter bleibt der Stream unverändert. Die Schleife ist vorab kodiert (tools/krabbe-anim, eingebettet alsassets/krabbe.thp), die Bilder gehen im Takt des Tons mit.
Aufnahme als Opus
- Die Aufnahme-Taste speichert jetzt
.opus(Ogg, 96 kbit/s mono, 48 kHz) statt WAV – rund ein Achtel der Größe. Kodiert wird im Browser mit WebCodecs, verpackt nach RFC 7845; Browser ohne Opus-Kodierer bekommen weiter WAV.core.js?v=114,ui.js?v=95.
Hörername bei DV/T
- Wer DV oder T hört, verschwand aus der Hörerleiste (Name und Marke), weil der Server ihn ohne eigenen Kanal als „nicht abgestimmt“ meldete. Jetzt trägt der Hörer die Frequenz der Decoder-Gruppe (Modus
dv/t), Name und Marke bleiben stehen;/api/listenerszählt ihn als hörend.
T: Signalqualität
crab_tetrameldet alle 2 s die Qualität ({"kind":"q","err":…,"foff":…}: Phasenfehler in % von π/4, Trägerversatz in Hz), crabSDR reicht sie nur live an die Hörer weiter (nicht in den Ereignisspeicher). Die Digitalzeile zeigt „FEHLER 15 %“ (grün bis 30, gelb bis 50, rot darüber) und den Versatz.core.js?v=113,ui.css?v=75.
Station ohne öffentliche Bänder
- Sieht ein Gast kein Band (alle nur für Mitglieder/Admins), hing die Hören-Seite bei „Wasserfall läuft an …“ und warf Fehler. Jetzt steht dort „Hier gibt es keine öffentlichen Bänder – bitte anmelden.“, ein Klick öffnet Anmelden.
ui.js?v=94,ui.css?v=74.
Betriebsart T (TETRA)
- Knopf T neben DV: TETRA-TMO auf der eingestellten Frequenz. Die Station startet dort bei Bedarf den Empfänger
crab_tetra(Plugintetra, Eingang DISC 25 kHz / 48 kHz) als Gruppet-<Hz>wie bei DV, Hörer teilen ihn. Ton = unverschlüsselte Sprache (Zeitschlitz des ersten Gesprächs), der Knopf leuchtet bei TDMA-Sync. Marke neben dem Knopf: Zelle (MCC, MNC, Farbcode, LA) und im Gespräch Sprecher → Ziel in einer eigenen Digitalzeile zwischen Frequenz und Signal; SDS in der Statuszeile. DV nutzt dieselbe Zeile (Rufzeichen, Mode, SNR, Alter) statt der Pille neben dem Knopf.crab_tetrastartet den Demodulator nach 5 s ohne Sync neu (lief sich sonst beim Einschwingen fest). Meldungensync,cell,call,sdsgehen live unter der Gruppen-ID an die Hörer, die Antwort auftetrabringt die letzte Zelle mit. Zählt gegendv_max.core.js?v=112,ui.js?v=93,ui.css?v=73. crab_tetra= Demodulator TetraDemod aus der C62-Firmware (OpenRTX) + libtetra + OpenACELP, gebaut vonplugins/tetra/build.shbzw.packaging/build-tetra.sh. Braucht die ETSI-Codebücher (EN 300 395-2) und ist deshalb nicht im Paket oder Release, nur auf eigenen Stationen.
Betriebsart DISC (Diskriminator)
- Neuer Knopf DISC neben FM/AM/USB/LSB/CW: FM-Diskriminator flach über die ganze Bandbreite, ohne De-Emphasis, Hochpass, Sprachfilter und Regelung. Bandbreite frei (Vorgaben 12,5 / 25 / 50 / 100 kHz, Vorgabe 25 kHz), das ZF-Filter schneidet, der Kanalausschnitt ist 1,5-mal so breit. Zum Anhören breiter Digitalsignale und als Eingang für Decoder: Plugins nehmen sie mit
input.mode = "disc", der Stream…/<kHz>/disc.wav?bw=25000liefert sie direkt in 48 kHz (ohne Rauschsperre). Link?tune=<kHz>disc.core.js?v=109,ui.js?v=92.
Lizenz
- crabSDR ist ab jetzt nicht mehr freie Software: © DO1XX, alle Rechte vorbehalten, Nutzung für Funkamateure auf Anfrage (
LICENSE). Quelltext privat, keine öffentlichen Quelltext-Veröffentlichungen mehr; Info-Seite, Marke neben dem Stationslogo, README, Paket-Metadaten ohne Verweise auf den Quelltext. Das .deb enthält statt der CHANGELOG Lizenz und Drittcode-Hinweise.
Hörhilfen und Spots für Kurzwelle
- NB, NR, Notch neben Squelch und AGC: Störaustaster auf dem I/Q-Signal vor dem Demodulator (Impulse samt Vorlauf ausblenden), Rauschunterdrückung auf dem Ton (Kurzzeitspektrum, Rauschschätzung über Minimumverfolgung, Wiener-Verstärkung), automatischer Notch (NLMS-Linienvorhersager gegen Träger und Pfeiftöne). Je Kanal, Hörer mit gleicher Einstellung teilen ihn; die Wahl bleibt im Browser gespeichert.
core.js?v=108. [spots]: FT8/FT4 an PSKReporter, WSPR an wsprnet melden (aus, bis eingeschaltet; Prüfbetrieb mittest).- Digital-Karte: Graulinie (Tag-Nacht-Grenze, jede Minute neu), Karte breiter, Listen rechts schmaler.
digi.js?v=28,digi.css?v=20.
Decoder auf Wunschfrequenz
- Neuer Knopf „Decoder“ unter den Betriebsarten: RTTY (45 Bd/170 Hz, 50/450 DWD, 50/85), PSK31 oder CW auf der eingestellten Frequenz mitlesen, wie die Erweiterungen eines KiwiSDR. Der Text läuft Zeichen für Zeichen in einem Feld unter dem Wasserfall ein (Leeren, Kopieren, Rauschsperre abschaltbar), Striche im Wasserfall zeigen, wo der Decoder hört (RTTY: Mark und Space), ein Klick legt das angeklickte Signal auf die Tonhöhe. Der Decoder läuft nur für diesen Hörer, folgt beim Abstimmen und endet mit dem Schließen. Neu
decode_max(Voreinstellung 4) unddecode_plugins(welche der Knopf anbietet, leer = alle).core.js?v=106,decode.js?v=1,ui.css?v=68. - Plugins melden sich dafür mit
listenin decoder.json an und dekodieren mitsingle = 1nur das Signal beiaf(plugins/README.md). Die Digital-Seite bleibt für die festen Dienste rund um die Uhr.
Decoder modular, neue Decoder
- Anzeige aus dem Plugin: Ein Plugin beschreibt in
decoder.jsonunterdisplay, wie die Seite Digital seine Treffer zeigt (Karte, Stationsliste, Trefferliste mit Spalten, Textkonsole, Bildergalerie). Die Seite baut den Reiter daraus selbst, neue Decoder brauchen keine Änderung an der Oberfläche. Übersicht je Plugin unter/digi/p/<plugin>.json(alle Decoder dieses Plugins zusammen, mit Band-Kürzel je Zeile). Eigene Plugins im Stationsordnerdata_dir/plugins/<name>, gemeinsame Bausteine inplugins/_lib/crablib.py. Beschreibung:plugins/README.md.digi.js?v=26,digi.css?v=19. - FT4 (
jt9 --ft4, 7,5-s-Zyklen) und WSPR (wsprd, Baken mit Locator, Leistung, Entfernung). - Wetterfax (HF-FAX 120 Zeilen/min, IOC 576, Start-/Stoppton, Phasing; DWD 3,855 und 7,880 MHz).
- RTTY (Baudot, Schwundausgleich je Ton wie fldigi, Mitte und Polarität automatisch, Rauschsperre; Amateurfunk 45,45/170 und DWD 50/450).
- PSK31 und CW: lesen alle Signale im Durchlass gleichzeitig, CW mit Tempo je Signal; beide mit Rauschsperre aus dem Signal (sauberes BPSK bzw. Tastung über dem Rauschboden), ohne Textfilter.
- NAVTEX (SITOR-B mit FEC, ganze Meldungen ZCZC … NNNN).
- Optionen
modeundbandwidthgelten für jedes Plugin (z. B. SSTV in LSB). Docker-Image und Pakete enthalten alle Plugins.
FreeDV in LSB
- Betriebsart DV hört jetzt auch LSB: Wer vor dem Knopf „DV“ LSB gewählt hat, bekommt RADE und Codec 2 auf LSB (Knopf „DV-L“, Gruppe
dvl-<Hz>), sonst wie bisher USB (FreeDV-Regel auf allen Bändern). USB- und LSB-Hörer auf derselben Frequenz bekommen getrennte Decoder.core.js?v=103. - Docker-Image: enthält jetzt auch die Plugins
freedv(Codec 2, mitlibcodec2-1.0aus bookworm: 700D, 700E, 1600) undpocsag. Bisher liefen in Docker-Stationen in der Betriebsart DV nur RADE und kein Pager-Decoder.
Schärferer Wasserfall
- Breite passend zum Bildschirm: Der Server liefert die Wasserfallzeile jetzt in 512, 1024, 2048 oder 4096 Pixeln statt fest 1024. Die Oberfläche wählt automatisch die größte Breite, die zu den echten Bildschirmpixeln passt (Fensterbreite × devicePixelRatio); bisher wurde das 1024er Bild auf dem Retina-Bildschirm fast dreifach gestreckt und dabei verwischt. Unter „Auflösung“ lässt sich die Breite von Hand wählen, dann wird 1:1 gezeigt (ein Canvas-Pixel = ein Bildschirmpixel, breiter als das Fenster scrollt waagerecht). Skalen, Marken und Durchlassbereich bleiben im 1024-px-Layout, nur die Canvas hat mehr Pixel. Neu
max_waterfall_px(Voreinstellung 4096). - Qualität: „sparsam“ (Änderungen bis ±2 dB werden nicht übertragen, wie bisher), „normal“ (±1 dB, neue Voreinstellung), „scharf“ (jede Änderung). Der Server rechnet jede Kombination aus Ausschnitt, Breite und Qualität einmal und schickt sie allen, die sie gewählt haben.
- Verlauf ohne JPEG: Beim Öffnen kommt der Wasserfall-Verlauf als Rohzeilen statt als JPEG (Qualität 70); kaum größer, aber ohne Kompressionsflecken. Zoom-Spektren rechnen mindestens so viele FFT-Punkte wie Pixel.
- Farbtabelle „All Colors Are Beautiful“ (Menü „Farben“): nutzt den ganzen RGB-Raum, schwache Signale in Grau.
- Flüssig auch bei 4096 Pixeln: Statt bei jeder Zeile die ganze Canvas umzukopieren, ist sie ein Ringpuffer doppelter Höhe; die neue Zeile wird zweimal geschrieben und das Bild per CSS verschoben (Grafikkarte). Eine Zeile kostet so 0,2 ms statt eines Kopiervorgangs über die ganze Fläche (ruckelte am Mac mit mehreren breiten Wasserfällen).
- Alte Oberflächen (ohne
px/q) bekommen weiter 1024 Pixel mit ±2 dB.core.js?v=101,ui.js?v=87,ui.css?v=67.
Kurzwelle: Bandplan und SSTV in SSB
- Bandplan 160–10 m nach dem IARU-Region-1-Bandplan (gültig ab 16.10.2020, vom DARC übernommen) in der Voreinstellung der „Bereiche“: alle Segmente nach Bandbreite (CW, Schmalband, Digimodes, unbemannte Stationen, alle Betriebsarten, Contest-Bereiche, DX-Fenster, Baken, 10-m-FM/Satelliten) und die Aktivitätszentren als schmale Fenster (QRP-CW, QRS, QRP-SSB, Bild/SSTV, Digital Voice, Notfunk, DXpeditionen), dazu FT8/FT4 als „üblich“. Schmale Fenster unter 10 kHz bleiben in der Auswahl, wenn sie ganz im Band liegen.
ui.js?v=86. - Decoder-Optionen
modeundbandwidthfür jedes Plugin, z. B. SSTV auf Kurzwelle mitoptions = { mode = "lsb" }; von FM auf SSB kommen 3 kHz Breite und der Pegelregler dazu.--checkprüft die Werte.
Digital: FT8 auf mehreren Bändern
/digi/ft8.jsonfasst jetzt alle öffentlichen FT8-Decoder zusammen (vorher nur den ersten), jeder Eintrag trägt die Frequenz seines Decoders. Die Seite färbt Locator-Felder, Kartenpunkte und Listen nach Amateurfunkband (160 m rot, 80 m gelb, 60 m violett, 40 m grün, 20 m blau …); ein Feld trägt die Farbe des Bandes, auf dem es zuletzt gehört wurde. Bei mehr als einem Band erscheint oben links auf der Karte eine Legende, ein Klick blendet ein Band aus (bleibt im Browser gemerkt).digi.js?v=24,digi.css?v=17.
Mehrere Bänder aus einem Empfänger
- Neu
parentim Band (virtuelles Band): ein Ausschnitt aus einem echten Band mit eigenem Reiter, eigener Mitte, eigener Breite und eigenem Wasserfall, z. B. 160/80/60/40 m aus einem MSi2500 mit 8 MS/s. Das Elternband verteilt seinen IQ-Strom an Abnehmer; je virtuellem Band mischt ein DDC-Thread auf die Mitte und dezimiert in Stufen (Kaiser-FIR, 90 dB;crabsdr-dsp::ddc), danach läuft ein gewöhnlicher DSP-Thread. Ein langsamer Abnehmer bremst das Elternband nicht (Blöcke werden verworfen und gemeldet). - Virtuelle Bänder lassen sich nicht umstimmen und haben keine Verstärkung (Schnittstelle lehnt ab, Admin-Seite zeigt stattdessen Elternband und Breite, „Band hinzufügen“ kann einen Ausschnitt anlegen). Zustand folgt dem Elternband (offline → „gestört“),
/api/healthund Admin-Überblick nennenparent.smeter_calund Verstärkung fürs S-Meter vom Elternband. --check: Elternband vorhanden und echt, Ausschnitt liegt drin, Rate teilt die Elternrate; Hinweis bei Ausschnitten am Rand und bei Elternband mitfree_vfo. Feste Decoder ohnebandwählen bei Überlappung das echte Band.- Schneller auf x86-64: DDC mit AVX2/FMA (Laufzeiterkennung, ältere CPUs nehmen den allgemeinen Pfad), Mischen ohne Rekursion, Stufenaufteilung nach geschätztem Aufwand (z. B. 8:1 und 2:1 statt viermal 2:1). Am Xeon E5-2660 v3 je virtuellem Band 32–54 ms Rechenzeit je Sekunde statt 140–300 ms.
- musl-Binaries mit mimalloc: Der musl-Allokator holte jeden IQ-Puffer (128 KB) per mmap und gab ihn sofort zurück, am Xeon 64 µs je Puffer statt ~1 µs. Betrifft alle statischen Binaries (Docker,
build-binaries.sh), jedes Band. - Tests: DDC (Lage, Faltung),
tests/virtuelles_band.rs(Ton im Elternband → im Wasserfall und im Kanal des Kindes).admin.js?v=7.
Grüne Krabbe statt 🦀
- Favicon (
web/icons/favicon.svg) und der Sysop-Link unten rechts zeigen jetzt das grüne crabSDR-Logo statt des 🦀-Emojis – wie Kopfzeile und Apps. Favicon-Links mit?v=2,core.js?v=100,look.css?v=11.
Relais: öffentlich erreichbar ohne eigene Domain, Portfreigabe oder VPN
- Neu
[relay](Admin-Seite → Station → „Über crabsdr.de erreichbar machen“): Die Station baut einen ausgehenden Tunnel (WSS, Port 443) zum Relaisrelay.crabsdr.deauf und ist danach unterhttps://<name>.crabsdr.deerreichbar. Identität ist ein Ed25519-Schlüssel auf dem Gerät (data_dir/relay.key); der Name gilt erst nach Freigabe durch den Betreiber von crabsdr.de, beide Seiten können jederzeit abschalten. Lokal bleibt die Station unverändert erreichbar. Verbindungen aus dem Tunnel landen auf einem zweiten, nur lokal gebundenen Anschluss, dort ist die Verwaltung gesperrt ([relay] admin = truehebt das auf). Ist[station] urlleer, gilt die Relais-Adresse fürs Verzeichnis. Protokoll und Betrieb:docs/RELAY.md. Das Relais selbst ist der neue Cratecrabsdr-relay(gleiches Repo), wer will, betreibt ein eigenes und trägt es unter[relay] serverein. - Treffer und Verbund-Chat durch denselben Tunnel, ohne Zugangsdaten: Eine Station am Relais schickt die Treffer ihrer öffentlichen Decoder als MQTT durch den Tunnel an den Broker des Relais (Thema
crabsdr/<name>), sobald[mqtt]keinenhosthat; und mitchat_verbund = trueden Verbund-Chat an den Verzeichnisdienst des Relais, ohne Verzeichnis-Eintrag. Identität ist in beiden Fällen der Relais-Schlüssel, Absender der Relais-Name; das Relais setzt ihn durch (nurcrabsdr/<name>/…, kein Abonnieren, nur/api/verbund/…). Protokoll: beide Seiten eröffnen Ströme (Relais gerade, Station ungerade Nummern), OPEN trägt ein Zweck-Byte, Hello/Antwort nennen Fähigkeiten (caps). Ältere Stationen und Relais laufen unverändert weiter. Eigener Broker ([mqtt] host) wie bisher.
Empfänger
- Hängende RTL-Sticks kommen von selbst zurück: Ab dem zweiten Fehlschlag in Folge (dann jeden dritten) setzt crabSDR den USB-Port des Sticks zurück, bevor
rtl_sdrneu startet – nur diesen Port, gefunden im sysfs über die Seriennummer (Index nur bei einem einzigen Stick). Anlass: DM0NDR 70 cm war am USB sichtbar und stimmte ab, lieferte aber 5 Tage lang 0 Byte; zehn Neustarts vonrtl_sdrhalfen nicht, ein Soft-Reset des Ports sofort. Neue udev-Regel60-crabsdr-usbreset.rules(Paket,install.sh): Gruppe crabsdr darfauthorizedder RTL-Sticks schreiben, kein root nötig; ohne sie Port-Reset über/dev/bus/usb(plugdev). - Nicht mehr nach zehn Versuchen für immer aufgeben: Danach ist das Band „offline“ und crabSDR versucht es alle 5 min, nach einer Stunde immer seltener bis stündlich; erst nach 24 h ohne Erfolg „aufgegeben“ (zurück durch Umstellen des Bandes oder Neustart). Neu gestartet wird immer nur das Leseprogramm des Bandes, nie der Server. In der langsamen Phase höchstens stündlich Zeilen im Protokoll.
- Ein Stick, der nach dem Start kurz liefert und dann hängt, zählt als Fehlschlag (vorher begann die Zählung nach jedem ersten Datenblock neu); erst 30 s Daten setzen sie zurück.
- Befehle an ein Band in der langsamen Phase (Frequenz, Gain …) gehen nicht mehr verloren.
Schnittstelle
/api/healthmeldet den Zustand je Band (bands:state= startet, läuft, gestört, offline, aufgegeben;fails,usb_resets,down_s) undbands_down;admin_only-Bänder stehen nicht darin. Admin-Überblick: Zustand, Dauer und Ursache je Band, bei laufenden Bändern die Zahl der USB-Resets.
Oberfläche
- Statuszeile „läuft seit“ zeigt immer die Laufzeit von crabSDR, auch wenn ein Wächter eine eigene
status.jsonliefert (vorher dort die Rechnerlaufzeit).
1.6.017.10.2026 · 3 Änderungen
Logbuch entfernt, SSTV erkennt auch schwache Bilder, Pager-Seite mit RIC-Filter, APRS-Objekt fürs iGate, POCSAG mit Vorgabefrequenz, Digital-Seite in voller Höhe.
Entfernt
- Logbuch (Reiter, Seite
logbuch/,GET/POST /logbuch/api/log, Admin-Liste, Schalter[ui] logbook): kaum genutzt, dazu weniger öffentliche Beiträge, die jemand prüfen muss. Die Tabelleloginpinnwand.dbwird beim Start gelöscht;logbuch/leitet auf die Hören-Seite um, ein alter Schlüssellogbookin der Konfiguration wird ignoriert. Chat und „Hörer online“ behalten ihre Pfade unter/logbuch/api/(Apps nutzen sie).
Oberfläche
- Digital-Seite ist genau so hoch wie das Fenster: Kopf, Reiter und Fuß fest, die Listen scrollen innen, die Karte spannt mit. Vorher feste Pixelhöhen, je nach Fenster blieb unten Platz leer oder die Seite wuchs darüber hinaus.
- Pager-Seite: Rufe links in voller Höhe, RICs rechts.
Decoder
- SSTV erkennt auch schwache Bilder: Der VIS-Sucher verlangte lückenlose 1-ms-Läufe auf 1200 Hz, mit Rauschen riss das an einer einzigen Millisekunde ab – nur sehr starke Signale kamen durch (gemessen mit echtem Empfängerrauschen von DF0HHH: Grenze 12 dB S/N breitbandig). Jetzt Bandpass vor der Frequenzmessung (900–2600 Hz für den Kopf, 700–3000 Hz fürs Bild, der Rohton des Diskriminators rauscht sonst flach bis 12 kHz mit) und Fensterbewertung (Mittel über das Startbit, Anteil 1900 Hz im Vorlauf, Median je Bit, Plausibilität der Bits, Parität, Stoppbit): Grenze 0 dB, keine Fehlalarme in 90 s Rauschen. Mit der Vollkette (
tools/fake_rtl_fm.py, Robot 36 bei ≈12 dB im Kanal) sauber decodiert. - SSTV: Option
dump = <Sekunden>schneidet den Eingangston ab Start als WAV mit (Diagnose des Decoder-Pfads);tools/fake_rtl_fm.py= nachgebauter rtl_tcp, der eine WAV-Datei FM-moduliert (Decoder-Tests ohne Hardware). - SSTV: hört der Lauscher den 1900-Hz-Vorlauf, kann aber keinen VIS-Kopf lesen, meldet er das (
vis_miss) und legt die zwei Sekunden als WAV im Bildordner ab (misses, Standard 20 Dateien), damit verpasste Bilder untersucht werden können. - Pager-Seite: Rufliste nutzt die Fensterhöhe; Klick auf einen RIC rechts zeigt nur dessen Rufe, bis zu 60 RICs.
- APRS-iGate kann ein zusätzliches Objekt melden (
object_name,object_comment, …), z. B. den Clubabend als eigenen Punkt auf der APRS-Karte. - Pager/POCSAG live: Plugins können eine Vorgabefrequenz nennen (
freqindecoder.json); ein[[decoders]]-Eintrag ohnefreqübernimmt sie, ohne Vorgabe meldet die Prüfung „freq fehlt“.pocsagbringt 439,9875 MHz (DAPNET) mit –plugin = "pocsag"genügt, wenn das 70-cm-Band die Frequenz abdeckt. Die Decoder-Karte im Menü zeigt Rufe lesbar (RIC, Funktion, Baudrate, Text bzw. „numerisch“/„Tonruf“; vorher nur der Text, bei Tonrufen rohes JSON). Doku: CONFIG.md (Optionenbaud,keep,charset), READMEs, config.example.toml.
1.5.015.10.2026 · 7 Änderungen
RADE-Rufzeichen, SSTV-Korrektur, neuestes Bild als feste Adresse, Rechtstexte, Rauschsperre ohne Fahne, FM-Klang, Ogg-Stream im Browser und im Auto, Ton auf iPhone, Handy-Ansicht mit Querformat.
Handy-Ansicht (iPhone und Android)
- Querformat ist jetzt eine Handy-Ansicht. Ein Handy quer (850–930 px breit, nur 350–400 px hoch) landete bisher in der Desktop-Ansicht: dreizeilige Bedienleiste, Wasserfall als schmaler Streifen. Jetzt gilt „Handy“ auch bei Touch und weniger als 500 px Höhe (gleiche Abfrage in
ui.css,look.cssundui.js): Bandleiste oben, Wasserfall über die volle Höhe, die Bedienleiste als schmale Spalte rechts (Frequenz, Betriebsart, SQ, Stumm, Menü, Ton, −/+, Chat), Notch und Rand übersafe-area. Reiter (Logbuch, Info) und Sprache stehen im Querformat oben im Menü. Drehen baut die Ansicht ohne Neuladen um – Ton und Verbindung laufen weiter. - Wasserfall mit dem Finger: Tippen stimmt ab (beim Loslassen, mit Raster), Ziehen mit einem Finger verschiebt den Ausschnitt wie auf einer Karte (bisher ging das nur über Zoom raus/rein), zwei Finger zoomen – jetzt eine Stufe je Verdopplung des Fingerabstands (vorher vier Stufen je Geste).
- Leiste unten: alle Ziele 44 px hoch (vorher 30), zweite Zeile mit Schritt-Knöpfen −/+ (ein Kanal im Raster), Pegel und Chat-Knopf mit Zähler – der Chat war auf dem Handy nur über das Menü erreichbar. Der Wasserfall lag 10 px unter der Leiste (die feste Leiste wurde nicht mitgerechnet), jetzt endet er darüber.
- Menü (Einstellungen): Knöpfe, Auswahlfelder und Umschalter mindestens 40 px (look.css hatte 30 px), Schnellwahl und „Liste“ nebeneinander, Bereich darunter, Squelch und Stumm nebeneinander mit dem Regler darunter, Frequenzfeld 16 px (iOS zoomt sonst hinein), Griff im Kopf. Neu: Karte „Decoder“ mit Zustand, letzten Treffern, „Hören“ und dekodiertem Ton – wie das Decoder-Menü der Desktop-Leiste (Stationen mit Decodern).
- Tastatur: öffnet sich die Tastatur (Frequenz, Name, Chat), heftet sich das Menü bzw. der Chat an den sichtbaren Ausschnitt (
visualViewport) – auf iOS lag das Feld bisher hinter der Tastatur. - Reiter und Bandleiste 40 px hoch, aktives Band rollt in der Bandleiste ins Bild, Chat sitzt über der Leiste, Hinweise (Toast) darüber, kein Überscrollen/„Pull to refresh“ beim Ziehen im Wasserfall.
iPhone und iPad
- Ton auf iOS zuverlässig: der Stummschalter machte Web-Audio lautlos (eine stille Tonschleife hält die Sitzung jetzt in der Wiedergabe-Kategorie), nach Anruf, Siri, Sperre oder App-Wechsel blieb der Ton aus (Zustand „interrupted“ wird jetzt bei jeder Berührung und beim Zurückkommen fortgesetzt), und nach einem Anruf lief der Ton mit falscher Abtastrate (Context wird neu angelegt).
Oberfläche
- Relais-Marker mit Hover-Tafel.
relais.jsonim Stationsordner trägt jetztlocatorundqth; daraus entstehen Marker im Wasserfall (Rufzeichen an der Ausgabe; die Eingabe als gedimmte Marke „↑ Rufzeichen“, wo das Band sie zeigt) und beim Überfahren eine Tafel mit Ausgabe/Eingabe/Ablage, Ton, QTH, Locator, Entfernung und Richtung von der Station (aus[station]locator bzw. lat/lon). Bei Gedränge behalten die nahen Relais ihre Beschriftung, die fernen nur die (jetzt breitere, anklickbare) Linie – die Tafel geht an beiden. Die Liste hinter „Liste“ zeigt zusätzlich die Richtung. Feldsystem(DMR, C4FM, D-Star, TETRA, ATV, DAPNET) kennzeichnet digitale Relais: Linie und ein Strich unter dem Rufzeichen zeigen die Systeme als Farbstreifen (FM grün, DMR orange, C4FM blau, D-Star violett, TETRA rot), gleiche Ausgabe mit mehreren Systemen (DB0HEW: FM, DMR, D-Star, C4FM) ist eine Marke mit „Regenbogen“, die Tafel listet je System Ton und Info; kleine Legende in der Statuszeile.ui.json"crab_brand": falselässt die crabSDR-Marke neben einem eigenen Logo weg. - Admin-Seite: Reiter „Relais & Marker“.
relais.jsonals Tabelle (Zeilen hinzufügen/löschen, Speichern) oder als Text,markers.jsonals Text; EndpunkteGET/PUT /api/admin/site/{relais,markers,presets}.jsonmit Prüfsumme gegen Überschreiben, Sicherungen unterdata_dir/site-backups/(die letzten 20). Die Oberfläche liest die Dateien bei jedem Laden neu, kein Neustart nötig. - RADE-Rufzeichen sichtbar. Das Rufzeichen, das
crab_radeam Ende jeder Durchgabe aus dem EOO-Rahmen meldet ({"kind":"text",…}), erscheint jetzt als Marke neben dem Knopf „DV“ (Tooltip: Mode, SNR, „vor n min“; grau nach 10 min, weg nach 1 h) – für die gehörte DV-Gruppe, sonst für eine DV-Gruppe auf der eingestellten Frequenz (±3 kHz); Anfangszustand beim Laden ausapi/decoders/events, danach live über den WebSocket. Der Server sendettext-Treffer einer DV-Gruppe wiesyncunter der Gruppen-ID (dv-<Hz>,data.plugin). Das Decoder-Menü zeigt Sync, EOO und Rufzeichen der DV-Plugins lesbar statt als JSON. - Digital-Seite: Reiter „FreeDV“. Neu (bisher nur vorbereitet): Liste der gehörten Rufzeichen (Zeit, Rufzeichen, Frequenz, Mode, SNR) aus dem Ereignisspeicher der Plugins
radeundfreedv– auch von schon beendeten DV-Decodern –, dazu die Decoder (feste und flüchtige der Betriebsart DV) und der Codec-2-Zustand ausfreedv.json. Der Reiter erscheint, sobald die Station DV kann oder einrade/freedv-Decoder läuft; Deep-Linkdigi/?tab=freedv./digi/freedv.jsonliefert dafür{status, decoders, calls}statt nur der Plugin-Datei (nie 404).
Streams
- Live-Titel im Ogg-Stream (Ogg-Kettung): Abspielprogramme sehen statt eines festen Titels den Zustand des Kanals – „145700 kHz FM · +18 dB“, „… · Rauschsperre zu“, mit Rufzeichen aus den Decodern (RADE/FreeDV-Durchgabe ±3 kHz, APRS-Absender ±10 kHz): „145700 kHz FM · DO1XX · +24 dB“. Der Server kettet dafür Ogg-Ströme wie Icecast beim Titelwechsel (EOS-Seite, neuer Strom mit neuer Seriennummer, Granule 0, OpusHead/OpusTags); Rauschabstand in 6-dB-Stufen mit Hysterese, Wechsel höchstens alle 5 s. An der Naht geht kein Abtastwert verloren: der alte Kodierer gibt seine Verzögerung mit einem letzten Rahmen aus, der neue wird angewärmt und kodiert seinen ersten Rahmen intra (dafür libopus direkt über
audiopus_sys,OPUS_SET_PREDICTION_DISABLED) – gemessen am 50-Hz-Ton bleibt der Fehler an der Naht unter −33 dB (kette_sinus). VLC reicht den Titel an Bluetooth/AVRCP und die Sperrbildschirm-Anzeige weiter (VLC 3 setzt dabei einen Rahmen aus, weil es die Spur neu anlegt; VLC 4 nicht), mpv und ffmpeg spielen lückenlos.?live=0schaltet die Kettung ab; Browser bekommen sie nie. Neu auchALBUM=<Station>in den Tags. docs/STREAM.md „Live-Titel“. - Wasserfall als Titelbild:
?cover=wflegt alle 10 s ein JPEG 320 × 180 (letzte 18 s Wasserfall um die Frequenz, Kanal rot markiert, 3–25 kB) alsMETADATA_BLOCK_PICTUREins neue Kettenglied – VLC zeigt es als Cover. - Ogg-Kopf über mehrere Seiten: Pakete mit mehr als 255 Segmenten (große OpusTags, z. B. mit Bild) verteilt der Muxer jetzt auf Fortsetzungsseiten (Flag 0x01, Granule −1); vorher überlief das Zählbyte und die Seite war ungültig. Für Browser (User-Agent Mozilla) enden die Kopfseiten mit einem
PADDING-Kommentar knapp unter 32 kB und der Ton kommt mit konstanter Paketgröße (CBR): Chrome reicht einen Strom ohne Content-Length nur in vollen 32-kB-Blöcken an seinen Demuxer weiter (gemessen mit dem Stationsstrom in Echtzeit: Bursts bis 62 kB und 93 kB nichts, 68 kB und 99 kB spielen). Mit VBR-Stille (3-Byte-Ruhepakete, ~0,5 kB/s) brauchte ein leiser Kanal über eine Minute je Block – der Browser-Stream von DF0HHH blieb scheinbar für immer stumm. Jetzt füllen die ersten Tonseiten den ersten Block sofort, jeder weitere kommt bei 32 kbit/s nach ~7,5 s (?br=64: ~4 s); so viel Verzögerung hat der Browser-Stream, der WebSocket-Ton der Oberfläche nicht. - Ogg-Stream spielt jetzt auch im Browser: Chrome legte für das eingebettete Stationsbild eine Videospur ohne Bilder an und blieb stumm. Browser (User-Agent Mozilla) bekommen den Stream ohne Bild, Abspielprogramme weiter mit;
?pic=0|1erzwingt es. Beispiel-Adressen auf der Info-Seite nutzen die öffentliche Adresse der Station ([station] url).
Info-Seite
- Impressum und Datenschutzerklärung neu gefasst: sachlich, ohne Anrede, auf das beschränkt, was die Software tatsächlich verarbeitet; Chat-Haltegrenzen, Verbund und Verzeichnis kommen aus der Konfiguration. Neu
[station]hostingundhosting_log_daysfür einen vorgeschalteten Server (Proxy/Hoster) mit seinem Zugriffsprotokoll.
Decoder
- RADE: Rufzeichen am Ende der Durchgabe.
crab_radeliest jetzt das Rufzeichen aus dem EOO-Rahmen (Format der FreeDV-App: LDPC HRA_56_56 mit CRC-8) und meldet es als{"kind":"text","mode":"RADE V1","text":"DO1XX","snr":…}; das Ereigniseoobleibt. Decoder-Modulplugins/rade/eoo/EooCallsignCodecaus radae_decoder (Peter Marks, LGPL 2.1, siehe THIRD-PARTY.md), per C-Brücke eingebunden –build.shbraucht jetzt auch einen C++-Compiler (CXX, im Cross-Container$HOST-g++). Zeichensatz wie in FreeDV: A–Z, 0–9 und&'()*+,-./, wobei/on air wie0kodiert wird (DF0HHH/P→DF0HHH0P). - RADE: sauberer Start je Durchgabe. Die Sprachsynthese (FARGAN) beginnt bei jedem neuen Sync von vorn (
fargan_init+ 5 Rahmen Vorlauf, wiewebrx_rade_decode), statt den Zustand der vorigen Durchgabe mitzunehmen. - RADE: Frequenzversatz im Sync-Ereignis.
syncträgtfoff(Hz, ausrade_freq_offset) – zeigt, wie weit der Hörer neben der Sendefrequenz liegt (Mitschnitt DF0HHH: −18 Hz, passt zur Stick-Messung). - Testsender
plugins/rade/rade_eoo_tx.c(EOO_TX=1 plugins/rade/build.sh): Sprache 16 kHz → RADE-V1-Signal 8 kHz mit EOO-Rufzeichen, für Prüfungen des Decoders ohne Funkgerät. - Neuestes SSTV-Bild als feste Adresse:
/digi/sstv/latest.png(immer das jüngste Bild, nie gecacht),/digi/sstv/latest.jsonund die Vollbildseite/digi/latest.htmlfür Monitore und Spiegel (?decoder=,?max_age=,?caption=0,?every=). - SSTV: Farben und Zeilen stimmen wieder. Der Decoder bekam vom Lauscher den Puffer ohne die Lage des VIS-Kopfs und nahm den Stoppbit als ersten Zeilensync; alle Zeilen rutschten eine nach oben – bei Robot 36 vertauscht das R-Y/B-Y (grün/magenta), bei Martin verschiebt es die Farben. Jetzt wird das VIS-Ende mitgegeben. Prüfung gegen den Referenz-Encoder pysstv:
plugins/sstv/test_sstv.py(Robot 36, Martin 1/2, Scottie 1, PD 120).
Ton
- Rauschsperre ohne Rauschfahne: die Sperre schließt jetzt am ungeglätteten Pegel (bisher hielt der geglättete Pegel sie nach dem Trägerende noch 100–150 ms offen), und mit eingeschalteter Sperre läuft der Ton einen Rahmen (20 ms) verzögert – der Rahmen mit dem Trägerende und der erste Rahmen beim Öffnen werden verworfen, wie es Funkgeräte über Rauschdetektor und Abschaltton auch tun. Im Messaufbau (
tools/fake_rtl_tcp.py 6999 3,2, getasteter Träger) bleibt nach fünf Trägerenden kein Rauschstoß mehr. Ohne Sperre keine Verzögerung. - FM klingt wie im Funkgerät: De-Emphasis −6 dB/Oktave ab 300 Hz (530 µs, TIA-603) und Tiefpass 3,2 kHz statt 4 kHz. Funkgeräte senden mit Pre-Emphasis; ohne die Umkehr klang Sprache dünn und das Diskriminatorrauschen zischte. Lautstärke bleibt gleich (Ausgleich ×2,2). Betriebsart „Daten“ bleibt flach.
1.4.011.10.2026 · 3 Änderungen
Betriebsart DV versteht RADE (FreeDV ab 2.0); freier VFO für private Stationen.
Freier VFO (Labor)
free_vfo = true(Station oder Band,free_vfo_min/free_vfo_maxals Grenzen): Hörer verschieben die Mitte des Wasserfalls im Betrieb – Zeile Mitte mit Eingabe in MHz und Schritten ±½ Band, ±1, ±10 MHz. Gilt für alle Hörer des Bandes, deshalb nur für private Stationen; Bänder ohne die Option lassen sich weiter nicht umstimmen (bisher ging das nur für Admins auf Admin-Bändern, ohne Bedienelement).- Skala, Bandleiste, Bereiche und Schnellwahl folgen sofort, der Wasserfall beginnt neu; die eigene Frequenz bleibt stehen oder rutscht an den Rand des neuen Fensters. Link „Teilen“ enthält die Mitte (
&band=…&vfo=). - Grenzen nach Empfänger (RTL-Stick 24–1766 MHz, HackRF, Airspy) oder aus der Konfiguration; Konverter-Bänder ohne Treibergrenze. Feste Decoder auf einem Band mit freiem VFO bleiben aus (
--checkmeldet es), DV-Decoder außerhalb des neuen Fensters enden sofort. Die neue Mitte gilt bis zum Neustart.
Betriebsart DV: RADE (FreeDV ab 2.0)
- Neues Plugin
rade: dekodiert RADE V1, die Wellenform der FreeDV-App ab Version 2.0 (neuronaler Sprachcodec, OFDM mit 30 Trägern) – das, was heute auf 144,280 MHz und auf Kurzwelle tatsächlich gefahren wird; die Codec-2-Modes des Pluginsfreedvsind on air kaum noch zu hören. Programmcrab_rade(C, gegen die Bibliothek rade_c, BSD-2-Clause, Sprachsynthese FARGAN aus Opus): USB-Ton 8 kHz rein, Sprache 16 kHz raus, Sync- und EOO-Ereignisse mit SNR; braucht auf einem Pi 4 etwa 20 % eines Kerns je Hörerfrequenz. Bauen:plugins/rade/build.sh(holt rade_c und Opus in festen Ständen), statisch für amd64/arm64:packaging/build-rade.sh; Release-Archiv, Debian-Pakete und Docker-Image enthalten das Programm (nicht für ARMv7). - DV startet auf der Hörerfrequenz jetzt alle vorhandenen DV-Plugins (
radeundfreedv) als Gruppedv-<Hz>; der Hörer hört den Decoder, der gerade Lock hat (bei beiden: RADE), der Knopf leuchtet beim Lock eines der beiden.dv_maxzählt weiter Frequenzen, nicht Prozesse. Fehltfreedv(kein libcodec2), läuft DV mitradeallein und umgekehrt; der DV-Knopf erscheint nur, wenn ein DV-Plugin wirklich lauffähig ist (Programm vorhanden). - Sync-Ereignisse der Gruppe tragen die Gruppen-ID und das Plugin (
data.plugin), Hörer-Kennungendv-<Hz>bleiben gültig; Decoder-IDs der Mitglieder heißendv-<Hz>-rade/dv-<Hz>-freedv.
Oberfläche
- DV-Knopf ohne dauerhaften Akzentrand.
- DV-Knopf leuchtet jetzt wirklich bei Lock: die Antwort der Station auf
dv(Kennung des Decoders) kam als Textnachricht und wurde nur als Binärrahmen ausgewertet, der Lock blieb deshalb unsichtbar.
1.3.207.10.2026 · 2 Änderungen
Betriebsart DV: FreeDV auf der Frequenz des Hörers.
Oberfläche
- DV neben FM/AM/USB/LSB/CW: abstimmen wie gewohnt, DV drücken, die Station startet dort einen FreeDV-Decoder (Hörer auf derselben Frequenz teilen ihn) und spielt die dekodierte Sprache. DV bleibt beim Abstimmen an und folgt der Frequenz (kurze Verzögerung beim Drehen); erst ein anderer Betriebsarten-Knopf schaltet zurück. In DV leuchtet nur DV, Bandbreite und AGC sind ausgegraut; der Knopf pulsiert bei Lock.
- Flüchtige DV-Decoder erscheinen nicht im Decoder-Fenster; FreeDV-Text nur bei stabilem Lock.
Server
- Decoder können zur Laufzeit entstehen (
dv_max, Vorgabe 3 gleichzeitig je Station) und enden, wenn niemand mehr hört (sofort beim Weiterdrehen, sonst nach 90 s). Sync und Text von Ton-Decodern gehen live an alle Hörer des Bandes.
1.3.107.10.2026 · 1 Änderung
Oberfläche
- Betriebsart DV: Knopf neben FM/AM/USB. Der Hörer stimmt wie gewohnt ab und drückt DV, die Station startet auf dieser Frequenz einen FreeDV-Decoder (Hörer auf derselben Frequenz teilen ihn, Ende nach 90 s ohne Hörer, höchstens
dv_maxgleichzeitig) und spielt die dekodierte Sprache. DV bleibt beim Abstimmen an und folgt der Frequenz; erst ein anderer Betriebsarten-Knopf schaltet zurück. Abstimmen oder eine andere Betriebsart holt den normalen Kanal zurück. Der Knopf pulsiert, solange der Decoder Sync hat (Lock), die Station meldet Sync und Text live an alle Hörer. FreeDV steht nicht mehr auf der Digital-Seite.
1.3.007.10.2026 · 1 Änderung
Zwei neue Decoder: FreeDV und Pager.
Decoder
- FreeDV (Plugin
freedv, libcodec2): Codec-2-Modes 700D, 700E und 1600 laufen parallel auf einem USB-Kanal; die dekodierte Sprache ist als Kanal hörbar (Knopf „Dekodiert hören“ im Decoder-Fenster, Digital-Seite,?dec=<id>), Rufzeichen aus dem Textkanal als Treffer, Sync und SNR je Mode. Brauchtlibcodec2-1.2. - Pager/POCSAG (Plugin
pocsag, multimon-ng): 512/1200/2400 Bd auf der Betriebsartdata, Rufe mit RIC, Funktion und Text, Übersicht auf der Digital-Seite. Für DAPNET auf 439,9875 MHz. - Decoder können jetzt Ton zurückliefern (
outputindecoder.json): crabSDR kodiert ihn als Opus, verteilt ihn an Hörer, dielisten_decodergewählt haben, und unter/stream/decoder/<id>.ogg(öffentliche Decoder frei, andere mit Sysop-Token oder Stream-Schlüssel).
1.2.207.10.2026 · 1 Änderung
Härtung
- WebSocket-Befehle: Bandbreite auf 100 Hz bis 250 kHz begrenzt (vorher beliebig, ein Megahertz-Kanal hätte den DSP ausgelastet), Frequenz außerhalb des Bandes wird mit Hinweis abgelehnt, Nachrichten höchstens 16 kB.
1.2.107.10.2026 · 1 Änderung
Stream
- Fester Stream-Schlüssel (
stream_key, Admin-Seite → Station → „Erzeugen“):?token=<Schlüssel>zählt wie der Sysop, gilt nur für/stream/…, läuft nicht ab. Für I/Q-Streams und gesperrte Bänder in VLC, ohne Anmelde-Token aus dem Browser.
1.2.007.10.2026 · 1 Änderung
Stream
- I/Q-Stream
…/stream/<kHz>/iq.wav(links I, rechts Q, 48 oder 32 kHz, 16 oder 8 bit) und als Experimentiq.ogg(Opus auf I/Q): komplexes Basisband eines Kanals für externe Decoder (TETRA, DMR). Freigabe überiq_stream(Vorgabe nur Sysop), höchstensmax_iq(1) gleichzeitig. Siehe docs/STREAM.md.
1.1.207.10.2026 · 1 Änderung
Oberfläche
- Info-Seite: Abschnitte „Link mit Einstellungen“ und „Stream für VLC, mpv und Decoder“ mit Anleitung und anklickbaren Beispielen aus der Schnellwahl der Station.
1.1.107.10.2026 · 1 Änderung
Stream
- Ogg/Opus-Stream trägt Titel (Frequenz, Betriebsart, Station) und Künstler in den OpusTags; liegt
logo.pngoderlogo.jpgim Stationsordner, wird es als Titelbild mitgeschickt (VLC zeigt beides).
1.1.007.10.2026 · 3 Änderungen
Stream in WAV und Stereo, Link mit allen Einstellungen, Lastgrenzen.
Stream
.wavzusätzlich zu.ogg: PCM 16 bit 48 kHz, verlustfrei für Decoder (DMR, POCSAG, AFSK).pair.wav?l=<kHz>/<mode>&r=<kHz>/<mode>: zwei Kanäle auf links und rechts, für ein Audiokabel mit zwei Decodern.br: Opus-Bitrate je Stream (8–128 kbit/s); Opus wird jetzt je Stream kodiert, der DSP liefert PCM.
Oberfläche
- Teilen-Link trägt Rauschsperre und AGC; im Link außerdem
vol,mute,nameundui=min(Minimal-Ansicht ohne Wasserfall für viele Tabs). Tab-Titel zeigt Frequenz und Betriebsart. - Hinweis statt stummem Fehlschlag, wenn die Station voll ist.
Lastgrenzen
- Neue Schlüssel
max_listeners(50),max_per_ip(10),max_channels(16),max_streams(6) je Band, 0 = keine Grenze. Jede andere Frequenz/Betriebsart/Bandbreite kostet einen DSP-Kanal, Hörer auf demselben Kanal teilen ihn; darüber „Station voll“.
1.0.007.10.2026 · 0 Änderungen
Erste Veröffentlichung.
- Ein Programm, eine Konfigurationsdatei: mehrere Empfänger (RTL-SDR, SDRplay über SoapySDR, rtl_tcp), jeder Hörer mit eigener Frequenz und Betriebsart (FM, AM, SAM, USB, LSB, CW, WFM, Daten).
- Wasserfall mit Zoom bis in den Kanal, Bereiche nach Bandplan, Schnellwahl, Teilen-Link, Aufnahme.
- Ton als Opus mit anpassendem Vorlauf; AGC wie am Transceiver mit Schwelle, Rauschsperre mit sofortigem Schließen.
- Ton-Stream für VLC, mpv und Decoder (
/stream/<kHz>/<betriebsart>.ogg, Senderlistepresets.m3u). - Decoder als Plugins (APRS mit Karte und Digipeater-Übersicht, FT8, SSTV), Treffer per MQTT.
- Chat und Logbuch der Hörer, Verbund-Chat über crabsdr.de, Hörerzahl nach Personen.
- Admin-Seite: Bänder, Decoder, Betreiberangaben, Konfiguration ohne Neustart, Verzeichnis-Anmeldung bei crabsdr.de.
- Oberfläche für Handy und als Web-App, Tastaturbedienung, Info-Seite mit Impressum und Datenschutz.
- Debian-Pakete (amd64, arm64, armhf), statische Binärdateien und Docker-Image; Frequenzkorrektur je Band in Software.