Selbst hostbares Mesh-VPN auf WireGuard-Basis.
đź In Entwicklung (Ausblick auf nĂ€chstes Release)
Noch nichts seit v0.11.0.
â Stable v0.11.0 (22.10.2026)
EnthÀlt alles aus v0.11.0-develop.1 bis v0.11.0-develop.3.
Neue Funktionen (gegenĂŒber v0.10.0)
- Admins und EigentĂŒmer Ă€ndern Rollen in der Mitgliederliste: Bei jedem
Mitglied, dessen Rolle man Àndern darf, steht jetzt eine Auswahl
âMitgliedâ/âAdministratorâ mit âSpeichernâ. Der EigentĂŒmer stellt jedes andere
Mitglied um, ein Administrator befördert Mitglieder zu Administratoren; einen
anderen Administrator herabstufen darf nur der EigentĂŒmer. Die Rolle des
EigentĂŒmers und die eigene Rolle bleiben unverĂ€ndert. Die neue Rolle gilt
sofort auch fĂŒr Regeln mit
role:in der Zugriffsrichtlinie, und die Ănderung steht im Audit-Log (member.role). (seit develop.3)
Fehlerbehebungen (gegenĂŒber v0.10.0)
- Der Client bricht beim Verbinden nicht mehr ab, wenn der Control-Server
nicht erreichbar ist: Ist der Server beim Start oder bei
wave login/wave upnicht erreichbar (Verbindung verweigert, ZeitĂŒberschreitung, Netz nicht da, Server startet gerade neu) oder meldet das Betriebssystem beim Auflösen des Servernamensgetaddrinfo ETIMEOUT, versucht der Client es mit wachsenden Pausen (0,5 bis 30 Sekunden) so lange erneut, bis die Verbindung steht oder du abbrichst. Das gilt fĂŒrwave up,wave loginund den Dienst sowie fĂŒr die iOS- und die Android-App. Im Terminal steht dabei, warum und wann der nĂ€chste Versuch kommt; der Dienst zeigt âwartet auf den Control-Serverâ statt âfehlgeschlagenâ, undwave downbeendet das Warten. Eine falsche Adresse, eine Ablehnung des Servers, Zertifikatsfehler und bei einem eben eingegebenen Login ein unbekannter Servername werden weiter sofort gemeldet. In den Apps gibt es das Abbrechen jetzt auch, solange noch verbunden wird. (seit develop.1, DNS-Timeout seit develop.2)
đŹ Development v0.11.0-develop.3 (22.10.2026)
Neue Funktionen
- Admins und EigentĂŒmer Ă€ndern Rollen in der Mitgliederliste: Bei jedem
Mitglied, dessen Rolle man Àndern darf, steht jetzt eine Auswahl
âMitgliedâ/âAdministratorâ mit âSpeichernâ. Der EigentĂŒmer stellt jedes andere
Mitglied um, ein Administrator befördert Mitglieder zu Administratoren; einen
anderen Administrator herabstufen darf nur der EigentĂŒmer. Die Rolle des
EigentĂŒmers und die eigene Rolle bleiben unverĂ€ndert. Die neue Rolle gilt
sofort auch fĂŒr Regeln mit
role:in der Zugriffsrichtlinie, und die Ănderung steht im Audit-Log (member.role).
đŹ Development v0.11.0-develop.2 (20.10.2026)
Fehlerbehebungen
- Ein DNS-Timeout beim Verbinden bricht den Client nicht mehr ab: Meldet
das Betriebssystem beim Auflösen des Servernamens
getaddrinfo ETIMEOUT(oder antwortet der Namensserver nicht, lehnt ab oder fĂ€llt aus), wartet der Client jetzt mit wachsenden Pausen und versucht es erneut, bis die Verbindung steht. Das gilt auch fĂŒr ein GerĂ€t, das sich noch nie angemeldet hat, und fĂŒr den Linux-Dienst beim Start, der auf âwartet auf den Control-Serverâ bleibt, statt âfehlgeschlagenâ zu zeigen. Ein unbekannter Servername bei einer eben eingegebenen Adresse und Zertifikatsfehler werden weiter sofort gemeldet. Die iOS- und die Android-App verhalten sich bei einem DNS-Timeout genauso.
đŹ Development v0.11.0-develop.1 (20.10.2026)
Fehlerbehebungen
- Beim ersten Verbinden wartet der Client auf den Control-Server, statt
abzubrechen: Ist der Server beim Start oder bei
wave login/wave upnicht erreichbar (Verbindung verweigert, ZeitĂŒberschreitung, Netz nicht da, Server startet gerade neu), versucht der Client es mit wachsenden Pausen (0,5 bis 30 Sekunden) so lange erneut, bis die Verbindung steht oder du abbrichst. Das gilt fĂŒrwave up,wave loginund den Dienst sowie fĂŒr die iOS- und die Android-App. Im Terminal steht dabei, warum und wann der nĂ€chste Versuch kommt; der Dienst zeigt âwartet auf den Control-Serverâ statt âfehlgeschlagenâ, undwave downbeendet das Warten. Eine falsche Adresse, eine Ablehnung des Servers und Zertifikatsfehler werden weiter sofort gemeldet. Bei einem Login, den du gerade eingegeben hast, gilt ein unbekannter Servername ebenfalls weiter sofort als Fehler. In den Apps gibt es das Abbrechen jetzt auch, solange noch verbunden wird.
â Stable v0.10.0 (13.10.2026)
EnthÀlt alles aus v0.10.0-develop.1.
Neue Funktionen (gegenĂŒber v0.9.0)
- Waves verkaufen, Teil Control-Server: Eine Verwaltungs-API unter
/api/billing/*, ĂŒber die wave-mesh.org nach einer Zahlung mit Stripe einen Wave anlegt, ihn bei ausbleibender Zahlung pausiert und nach einer KĂŒndigung nach einer Frist löscht. Ein pausierter Wave behĂ€lt alle Daten, nur sehen sich seine GerĂ€te nicht mehr. Ein bezahlter Wave nimmt höchstens so viele Personen auf, wie gebucht sind. Der neue EigentĂŒmer legt sein Passwort ĂŒber einen Link fest, den die Seite ihm schickt. OhneWAVE_BILLING_TOKENgibt es nichts davon; selbst betriebene Server Ă€ndern sich nicht.- Ein bezahlter Wave gehört nur einem bestĂ€tigten Konto oder einem Platzhalter, nie einem unbestĂ€tigten Konto mit fremder Anmeldung. Meldet sich der EigentĂŒmer mit Google an, bevor er den Link nutzt, ĂŒbernimmt diese Anmeldung den Platzhalter, statt ein zweites Konto ohne Wave anzulegen.
- Ein gekĂŒndigter Wave bleibt gekĂŒndigt, auch wenn ein veraltetes Ereignis spĂ€ter âaktivâ meldet, und ein gebuchter Wave lĂ€sst sich nicht von Hand löschen, solange sein Abo lĂ€uft.
- Ein pausierter Wave sagt auf seiner Karte, warum die GerÀte niemanden sehen, und bekommt keine Zertifikate, auch keines, das vor der Pause bestellt war. Ein beendetes Abo nennt das Datum der Löschung.
- Hat sich der EigentĂŒmer schon mit Google angemeldet, bevor er den Link aus der Mail nutzt, zieht der bezahlte Wave in dieses Konto um, statt dass der Link verfĂ€llt. (neu in diesem Release)
Fehlerbehebungen (gegenĂŒber v0.9.0)
- Ein Telefon auf Mobilfunk weckt seinen Wave nicht mehr bei jedem Aufwachen. Hinter dem NAT des Mobilfunkanbieters bekam es nach jedem Schlaf einen neuen Port und veröffentlichte ihn sofort â jedes Mal eine neue Netzkarte fĂŒr alle GerĂ€te im Wave, 73-mal in 18 Stunden. Ein neuer Port geht jetzt erst hinaus, wenn er sich ĂŒber eine halbe Minute hĂ€lt. Gilt fĂŒr die Apps, den Desktop-Client und den Connector. (seit develop.1)
- Der Control-Server trennt schlafende Telefone nicht mehr jede Minute
(Deployment
deployment/server/overlays/prod): der Proxy davor lÀsst eine stille Verbindung jetzt eine Stunde offen statt 60 Sekunden. Wer einen eigenen nginx-Ingress vor/v1/controlbetreibt, setztproxy-read-timeoutundproxy-send-timeoutebenso. (seit develop.1)
đŹ Development v0.10.0-develop.1 (13.10.2026)
Fehlerbehebungen
- Ein Telefon auf Mobilfunk weckt seinen Wave nicht mehr bei jedem Aufwachen. Hinter dem NAT des Mobilfunkanbieters bekam es nach jedem Schlaf einen neuen Port und veröffentlichte ihn sofort â jedes Mal eine neue Netzkarte fĂŒr alle GerĂ€te im Wave, 73-mal in 18 Stunden. Ein neuer Port geht jetzt erst hinaus, wenn er sich ĂŒber eine halbe Minute hĂ€lt. Gilt fĂŒr die Apps, den Desktop-Client und den Connector.
- Der Control-Server trennt schlafende Telefone nicht mehr jede Minute
(Deployment
deployment/server/overlays/prod): der Proxy davor lÀsst eine stille Verbindung jetzt eine Stunde offen statt 60 Sekunden. Wer einen eigenen nginx-Ingress vor/v1/controlbetreibt, setztproxy-read-timeoutundproxy-send-timeoutebenso.
â Stable v0.9.0 (11.10.2026)
EnthÀlt alles aus v0.9.0-develop.1 bis v0.9.0-develop.3.
Neue Funktionen (gegenĂŒber v0.8.0)
- Die Android-App sieht aus und verhĂ€lt sich wie die iPhone-App: dieselben Abschnitte und Texte, Anmelden ohne vorheriges Verbinden, Freigabe im Browser, Waves pausieren, prĂŒfen und verlassen, Protokoll teilen, Beitritt per QR-Code und âAutomatisch verbindenâ nach einem Neustart. (seit develop.3)
- Aus dem Cluster in den Wave: der Connector beantwortet die Namen selbst.
Ein Dienst, der im Wave dazukommt, ist nach Sekunden auflösbar; der Eintrag
in CoreDNS muss nie mehr angefasst werden. Wer die Egress-Komponente schon
nutzt, stellt ihn einmal um (siehe
coredns.example.yaml). (seit develop.1)
Fehlerbehebungen (gegenĂŒber v0.8.0)
- Die iPhone-App hĂ€lt das Telefon nicht mehr stĂ€ndig wach â es wachte Tag und Nacht alle fĂŒnf bis sechs Sekunden auf, jetzt etwa zehnmal seltener. (seit develop.2)
- Ein Connector im Cluster schiebt dem Wave nicht mehr jede Minute eine neue Netzkarte zu, die jedes Telefon weckte. (seit develop.2)
- Die Android-App stĂŒrzte nach der Freigabe nicht mehr ab, behĂ€lt nach dem Verlassen des letzten Waves ihre Namensauflösung, steht nach dem Verbinden nicht mehr eine halbe Minute still und zeigt Fehler beim Anmelden an. (seit develop.3)
- Der Update-Dialog unter macOS zeigt Umlaute richtig â statt âverfâÂșgbarâ steht dort wieder âverfĂŒgbarâ. (neu in diesem Release)
- Neue Karten im Zugriffsgraphen landen an einem freien Platz statt unter einer bestehenden. (seit develop.1)
đŹ Development v0.9.0-develop.3 (11.10.2026)
Neue Funktionen
- Die Android-App sieht aus und verhĂ€lt sich wie die iPhone-App. Dieselben Abschnitte und Texte, auf Deutsch und Englisch, hell und dunkel. Anmelden startet den Tunnel von selbst, die Freigabeseite öffnet sich im Browser und verschwindet nach der Freigabe wieder. Jeder Wave lĂ€sst sich pausieren, prĂŒfen (âVerbindung prĂŒfenâ) und mit RĂŒckfrage verlassen; Dienste öffnen sich mit einem Tippen, Namen und Adressen lassen sich kopieren. Dazu ein eigener GerĂ€tename, ein teilbares Protokoll, Beitritt per QR-Code und âAutomatisch verbindenâ, das den Tunnel nach einem Neustart zurĂŒckbringt.
Fehlerbehebungen
- Die Android-App stĂŒrzte direkt nach der Freigabe ab, sobald sie die erste Netzkarte ĂŒbernahm.
- Nach dem Verlassen des letzten Waves löste das Android-Telefon keine Namen mehr auf.
- Nach jedem Verbinden stand der Tunnel unter Android eine halbe Minute, weil er beim Start den Port wechselte.
- Fehler beim Anmelden blieben unter Android unsichtbar, und âAnmeldenâ ohne vorheriges âVerbindenâ tat nichts.
đŹ Development v0.9.0-develop.2 (11.10.2026)
Fehlerbehebungen
- Die iPhone-App hĂ€lt das Telefon nicht mehr stĂ€ndig wach. Nach jedem Aufwachen fragte der Tunnel seine Server, ob die Verbindungen noch stehen â und die Antworten weckten das Telefon gleich wieder. So wachte es Tag und Nacht alle fĂŒnf bis sechs Sekunden auf. Jetzt fragt es höchstens einmal pro Minute; im ersten Protokoll danach wachte es etwa zehnmal seltener auf.
- Weniger Unruhe im ganzen Wave durch einen Connector im Cluster. Ein Connector hinter dem NAT eines Kubernetes-Clusters meldete jede Minute eine neue Adresse, die niemand je erreicht hat, und jede Meldung schob allen GerĂ€ten im Wave eine neue Netzkarte zu â jedes Telefon wurde davon geweckt. Eine solche Adresse wird erst gemeldet, wenn sie sich bestĂ€tigt; bei einem NAT, das jedes Mal eine neue vergibt, bleibt es ruhig.
đŹ Development v0.9.0-develop.1 (11.10.2026)
Neue Funktionen
- Aus dem Cluster in den Wave: der Connector beantwortet die Namen selbst.
Ein Pod, der einen Namen im Wave aufruft, bekommt ihn jetzt vom Connector
aufgelöst, der die Netzkarte kennt â ein Dienst, der im Wave dazukommt, ist
nach Sekunden auflösbar, und ein Name, den es nicht gibt, ist sofort âgibt es
nichtâ statt einer Adresse, an der die Verbindung erst abgewiesen wird. Der
Eintrag in CoreDNS ist dafĂŒr ein einfaches
forwardauf eine feste Adresse und muss nie mehr angefasst werden. Wer die Egress-Komponente schon nutzt, stellt den CoreDNS-Eintrag einmal um (siehecoredns.example.yaml).
Fehlerbehebungen
- Neue Karten im Zugriffsgraphen lagen unter alten. Wer einmal eine Karte verschoben hatte, bekam eine spĂ€ter hinzugefĂŒgte Karte (etwa âalle Diensteâ) genau unter eine bestehende gelegt. Neue Karten rĂŒcken jetzt an einen freien Platz.
â Stable v0.8.0 (09.10.2026)
EnthÀlt alles aus v0.8.0-insiders.1 und v0.8.0-develop.1 bis v0.8.0-develop.3.
Neue Funktionen (gegenĂŒber v0.7.0)
- Die Telefon-Apps fĂŒr iPhone, iPad und Android. Ein Telefon ist in mehreren Waves zugleich, mit direktem Weg und Relay als RĂŒckfall; jeder Wave hat seinen eigenen Schalter, verbindet sich nach Neustart und Netzwechsel von selbst wieder und sagt, was mit ihm nicht stimmt, statt nur ânicht verbundenâ. Dazu ein eigener GerĂ€tename, ein teilbares Protokoll, âVerbindung prĂŒfenâ je Wave und Dienste, die sich mit einem Tippen öffnen. Die App nimmt keinem anderen VPN ungefragt den Platz weg. (seit develop.2)
- Telefon per QR-Code hinzufĂŒgen: âTelefon hinzufĂŒgenâ in der WeboberflĂ€che zeigt einen Code, die Kamera öffnet die App mit dem Server schon eingetragen. (seit develop.3)
- Mehrere Waves am selben Server, etwa fĂŒr getrennte Projekte: auf dem
Desktop mit
wave login <url> --new-wave, in der App mit âWeiteren Wave an diesem Server hinzufĂŒgenâ. (seit develop.2) - In der WeboberflĂ€che erscheinen Telefone als iOS bzw. Android mit ihrer Version, GerĂ€te lassen sich umbenennen, und Mitglieder können einen Wave selbst verlassen. (seit develop.2)
svc:*in den Zugriffsregeln gibt alle Dienste im Wave frei, auch kĂŒnftige, aber kein GerĂ€t. (seit develop.1)- Apple-signierte und notarisierte macOS-Clients fĂŒr Intel und Apple Silicon. (seit insiders.1)
Fehlerbehebungen (gegenĂŒber v0.7.0)
- Weniger Akkuverbrauch auf dem Telefon. Weder das Telefon noch die Desktops im Wave messen ruhende GerĂ€te stĂ€ndig neu oder schicken Keepalives; ruhende GerĂ€te stehen ĂŒberall als âruhtâ. Der Server schickt keine neue Netzkarte mehr, wenn sich nichts geĂ€ndert hat. Beim ersten Paket nach einer Pause geht die Verbindung kurz ĂŒber das Relay, bis der direkte Weg wieder steht â ein Server ohne Relay findet zwischen zwei GerĂ€ten hinter NAT keinen direkten Weg mehr. (seit develop.2 und develop.3)
- Ein neues GerÀt im Wave riss bestehende Verbindungen nicht mehr ab: Der Desktop-Client wechselt seinen Port nur noch, wenn gar kein Peer erreichbar ist. (seit develop.3)
- Ein Connector, der nichts mehr trÀgt, wird neu gestartet, statt online auszusehen und keinen Dienst mehr erreichbar zu machen. (seit develop.3)
- Der Connector meldet seine echte Version statt
v0.0.0-dev. (seit develop.1)
GerÀte auf
develop, die zwischendurch v0.8.0-insiders.1 installiert hatten, bekamen keine Develop-Builds mehr angeboten:0.8.0-develop.Ngilt nach Semver als Àlter als0.8.0-insiders.1. Mit v0.8.0 sind alle KanÀle wieder auf demselben Stand.
đŹ Development v0.8.0-develop.3 (09.10.2026)
Neue Funktionen
- âVerbindung prĂŒfenâ in der iPhone-App: pro Wave eine Seite, die in SĂ€tzen sagt, was geht und was nicht â Tunnel, Control-Server, Relay, Namensauflösung, jedes GerĂ€t (erreichbar, ruht, offline, nie erreicht) â und zu jedem Dienst eine echte Verbindung durch den Tunnel aufbaut.
- Telefon per QR-Code hinzufĂŒgen: In der WeboberflĂ€che zeigt âTelefon hinzufĂŒgenâ bei jedem Wave einen Code. Die iPhone-Kamera öffnet damit die App mit dem Server schon eingetragen; die App fragt, bevor sie verbindet, und freigegeben wird wie immer im Browser.
- Die iPhone-App schreibt ins Protokoll, was iOS ĂŒber sie misst: einmal am Tag CPU-Zeit, Daten ĂŒber Mobilfunk und WLAN und die Zeit im Hintergrund, getrennt fĂŒr App und Tunnel, und warum ein Lauf endete, wenn er abstĂŒrzte, hing oder zu viel CPU brauchte.
- TestFlight per Knopfdruck, erst nach allen Tests: Vor dem Upload laufen Unit-Tests, Go-Kern, die End-to-End-Tests des Telefon-Kerns gegen echte Server und die iOS-Tests im Simulator; ein roter hÀlt den Build auf.
- TestFlight per Knopfdruck: Der Workflow âTestFlightâ baut die iPhone-App aus dem gewĂ€hlten Stand, signiert sie und lĂ€dt sie hoch â gestartet von Hand in GitHub, auch aus der GitHub-App auf dem Telefon. Die Build-Nummer ist die nĂ€chste freie in App Store Connect, die SchlĂŒssel kommen aus 1Password.
- Der Status des Telefons kennt je GerĂ€t die Byte-ZĂ€hler von WireGuard selbst â damit lĂ€sst sich sehen, ob ĂŒber eine Verbindung wirklich etwas lĂ€uft, statt es aus dem Pfad zu schlieĂen.
Fehlerbehebungen
- Die Telefone kommen endlich zur Ruhe. Das Telefon selbst sendete schon
nichts mehr an ruhige GerÀte, aber jeder Laptop und jeder Server im Wave
maĂ alle drei Sekunden jeden Weg zum Telefon und schickte alle 25 Sekunden
ein Keepalive â und weckte damit das Mobilfunkmodem immer wieder. Jetzt
verhalten sich auch die Desktop-Clients so wie das Telefon: Gemessen wird nur
ein GerÀt, mit dem gerade gesprochen wird, Keepalives gibt es nicht mehr, und
wave statussowie das Tray zeigen ruhende GerĂ€te als âruhtâ. Wirksam wird das, sobald die Desktops diese Version haben. Beim ersten Paket nach einer Pause geht die Verbindung kurz ĂŒber das Relay, bis der direkte Weg wieder steht â ein Server ohne Relay findet zwischen zwei GerĂ€ten hinter NAT keinen direkten Weg mehr. - Mit zwei Waves auf dem iPhone ging der zweite nicht: Jeder Dienst im ersten Wave antwortete, im zweiten nichts, bis der erste pausiert wurde. iOS schickte alles mit der Adresse des ersten Waves los. Der Tunnel setzt jetzt selbst die richtige Absenderadresse je Wave.
- Ein neues GerĂ€t im Wave riss bestehende Verbindungen ab. Der Desktop-Client wechselte seinen UDP-Port, sobald irgendein Peer noch keinen Weg hatte â und das hat jedes GerĂ€t, das gerade beitritt. Telefone, die ruhige GerĂ€te seit dem Akku-Fix nicht mehr stĂ€ndig anpingen, brauchten dann ĂŒber zehn Sekunden, um den neuen Port zu finden. Gewechselt wird jetzt nur noch, wenn gar kein Peer mehr erreichbar ist.
- âNoch nicht erreichtâ stand auch bei GerĂ€ten, die nur ruhen: Seit das Telefon ruhige GerĂ€te nicht mehr anpingt, gibt es mit ihnen keinen Handshake, und das ist kein Fehler.
- Der Server schickte stÀndig neue Netzkarten an alle GerÀte, in einem Wave mit einem Dutzend GerÀten etwa alle acht Sekunden: Jedes GerÀt, das seine Adressen neu meldete, löste eine aus, auch wenn sich nichts geÀndert hatte. Das weckte jedes Telefon und kostete Akku. Gleiche Adressen Àndern jetzt nichts mehr.
- Ein Connector, der nichts mehr trÀgt, wird neu gestartet. Er konnte am Steuerkanal hÀngen, beim Server als online gelten und trotzdem keinen einzigen Dienst mehr erreichbar machen. Eine Liveness-Probe fragt jetzt den Daemon: Tunnel oben, Relay verbunden, und mit mindestens einem Peer ein Handshake in den letzten zehn Minuten.
đŹ Development v0.8.0-develop.2 (08.10.2026)
Neue Funktionen
- Die Telefon-Apps sind bereit fĂŒr App Store und Google Play. Sie heiĂen jetzt wave-mesh, tragen das Zeichen als App-Icon und Petrol als Akzent und zeigen vor der ersten Verbindung einmal, was mit Daten geschieht: kein Server von Moellenbeck Digital im Weg, keine Analyse, keine Werbung. Die iOS-App lĂ€uft auf iPhone und iPad ab iOS 17, die Android-App ab Android 10 und zielt auf API 36, wie Google Play es verlangt.
- Die iPhone-App verbindet sich von selbst wieder nach Neustart und Netzwechsel, bis man ausdrĂŒcklich trennt.
- Jeder Wave hat seinen eigenen Schalter, wie im Tray: pausieren, ohne ihn zu verlassen, und ohne neue BestÀtigung wieder einschalten.
- Ein eigener GerĂ€tename statt âiPhoneâ; die App zeigt vorher, wie das GerĂ€t
im Wave heiĂen wird (âMöllenbeckâ wird zu
moellenbeck, nichtm-llenbeck). - Eine wartende Anmeldung lĂ€sst sich abbrechen, âWave verlassenâ fragt nach, und Namen und Adressen der GerĂ€te lassen sich kopieren.
- Die iPhone-App hat ein Protokoll (teilbar), in dem steht, was Tunnel und App getan haben.
- Aus der App in die WeboberflĂ€che, und Dienste öffnen sich mit einem Tippen. Ein Wave sagt, was mit ihm nicht stimmt â vom Server entfernt (mit âErneut anmeldenâ), abgelehnte Netzkarte, nicht hochgekommen â statt nur ânicht verbundenâ; bei jedem GerĂ€t steht der letzte Handshake.
- Neben Tailscale: iOS lĂ€sst nur ein VPN zu. Die App nimmt beim ersten Ăffnen keinem anderen den Platz weg, fragt, bevor sie einen anderen VPN verdrĂ€ngt, und âAutomatisch verbindenâ lĂ€sst sich ausschalten.
- Die BestÀtigungsseite teilt die Anmeldung mit Safari: wer im Control-Server angemeldet ist, muss sich nicht jedes Mal neu anmelden.
- In der WeboberflÀche: Telefone erscheinen als iOS bzw. Android mit ihrer Version, GerÀte lassen sich umbenennen, und Mitglieder können einen Wave selbst verlassen.
- Die iPhone-App sagt pro Wave, ob ein Relay da ist: âRelay verbundenâ, âRelay nicht verbundenâ oder âDieser Server bietet kein Relay anâ â ohne Relay bleiben GerĂ€te, die das Telefon nicht direkt erreicht, etwa ein Connector in einem Cluster, unerreichbar. Ein GerĂ€t, das der Server online nennt, mit dem aber noch nie ein Handshake zustande kam, steht als âNoch nicht erreichtâ da.
- Das Protokoll der Telefon-Apps sagt, was mit DNS los ist: eine Zeile pro Wave mit Zone, eigener Adresse, Resolver und der Zahl der GerĂ€te und Dienste, und eine Zeile, wenn ein Name gefragt wurde, den die Netzkarte nicht kennt (âdns: grafana.⊠is not in the netmap of âŠ"), je Name höchstens einmal pro Minute.
- Mehrere Waves am selben Server, fĂŒr getrennte Projekte oder Firmen auf
einem Control-Server: auf dem Desktop mit
wave login <url> --new-wave, in der iPhone-App mit âWeiteren Wave an diesem Server hinzufĂŒgen". Jeder ist eine eigene Anmeldung mit eigenen SchlĂŒsseln und Adressen, heiĂt nach seiner DNS-Zone (wave down project-b.wave.internal) und lĂ€sst sich einzeln pausieren und verlassen; die GerĂ€te des einen sehen die des anderen nicht.
Fehlerbehebungen
- Die Telefon-Apps verbrauchen deutlich weniger Akku. Der Tunnel schickte stĂ€ndig Pakete, auch wenn gar nichts darĂŒber lief: alle drei Sekunden eine Messung an jedes GerĂ€t im Wave und alle 25 Sekunden ein Keepalive. Damit kam das Mobilfunkmodem nie zur Ruhe. Jetzt misst das Telefon nur noch GerĂ€te, mit denen es gerade spricht; die anderen stehen in der App als âruhtâ. Auch das Aufwachen des iPhones baut nicht mehr jedes Mal alle Verbindungen neu auf, sondern fragt nur nach, ob sie noch stehen.
- Das Protokoll der iPhone-App war nach lÀngerer Laufzeit schwarz, und
Teilen schickte nichts: es wurde als ein einziger Textblock gezeichnet, der
fĂŒr iOS zu groĂ war, und als Text geteilt, den Messenger wie Telegram ab
einer gewissen LĂ€nge nicht verschicken. Jetzt Zeile fĂŒr Zeile und als Datei
wave-mesh-log-<datum>.txt. - Die iPhone-App ist sparsamer und robuster geworden, nachdem sie sich bei einem Tester von selbst beendet hatte. Ein Netzwechsel, der vor dem fertigen Start des Tunnels ankam, konnte den Tunnel abstĂŒrzen lassen. Die App las bei jedem Neuzeichnen das ganze Protokoll und stapelte Statusabfragen, wenn der Tunnel langsam antwortete; beides passiert nicht mehr.
- Mit zwei Waves löste das iPhone nur die Namen des ersten auf, wenn der Server des anderen keine eigene Resolver-Adresse reserviert hatte. Dann stand eine Adresse des Telefons selbst in der DNS-Liste, und Anfragen dorthin kamen nie im Tunnel an. Sie wird nicht mehr angeboten; der Resolver an der reservierten Adresse beantwortet die Namen aller Waves.
- Liegt die DNS-Zone eines Waves innerhalb der eines anderen
(
team.ops.example.cominops.example.com), antwortet auf dem Telefon jetzt die nĂ€here Zone. Vorher meldete die Ă€uĂere fĂŒr jedes GerĂ€t der inneren âgibt es nicht". - Auf dem Telefon kam nach dem Anmelden nichts an. Beide Apps lasen die Routen aus dem Kern in einer Form, die es nicht mehr gab; iOS wendete deshalb weder Adressen noch Routen noch DNS an, Android ebenso wenig. Ein Test hĂ€lt die Form jetzt zwischen Kern und App fest.
- Anmelden auf dem iPhone tat nichts, solange der Tunnel aus war. Jetzt startet die App den Tunnel selbst, öffnet die BestĂ€tigungsseite direkt in der App und zeigt, wo die Anmeldung steht â und warum sie scheitert, statt die Eingabe still zu verwerfen. Ist schon ein Wave da, heiĂt der Bereich âWeiteren Wave hinzufĂŒgen".
- Eine abgebrochene Anmeldung legte den Tunnel lahm. Wer die BestÀtigungsseite schloss, hinterlieà einen nie bestÀtigten Wave, und an dem scheiterte danach jeder Start des Tunnels. Jetzt wird er vergessen, und ein Wave, der nicht hochkommt, hÀlt die anderen nicht mehr auf.
- Mit zwei Waves sprang die Liste in der App jede Sekunde; sie bleibt jetzt in der Reihenfolge, in der die Waves dazukamen.
- Auf dem Telefon rissen neue Netzkarten jedes Mal alle WireGuard-Sitzungen ab, und das Telefon meldete jede Minute seine Adressen neu â womit der Server dem ganzen Wave eine neue Netzkarte schickte. Beides passiert nur noch bei einer echten Ănderung; nach einem Netzwechsel verbindet es sofort neu, und ein vom Server entferntes GerĂ€t hĂ€ngt nicht mehr ohne Hinweis.
- Trennen konnte auf einem stillen Tunnel hÀngen, bis zufÀllig ein Paket kam.
- Die iOS-App lieĂ sich nicht bauen: die Tunnel-Extension nutzte Schnittstellen, die es nur unter macOS gibt, und den falschen Namen fĂŒr die RĂŒckrufe des Go-Kerns.
- Die Android-App lieà sich nicht bauen: das Symbol ihrer Benachrichtigung war keine öffentliche Ressource von Android.
đŹ Development v0.8.0-develop.1 (06.10.2026)
Neue Funktionen
svc:*in den Zugriffsregeln: gibt alle Dienste im Wave frei â auch die, die ein Connector erst spĂ€ter meldet â, aber kein einziges GerĂ€t. Damit lĂ€sst sich âalles aus dem Clusterâ freigeben, ohne dass die Policy bei jedem neuen Ingress angepasst werden muss. Wie jeder Dienst nur als Ziel einer Regel; im Zugriffsgraphen steht dafĂŒr immer eine eigene Karte.
Fehlerbehebungen
- Der Connector meldet in der GerÀteliste seine echte Version statt
v0.0.0-dev(ab dem ersten Image, das mit diesem Release gebaut wird).
đ§Ș Insiders v0.8.0-insiders.1 (05.10.2026)
Verbesserungen
- Apple-signierte und notarisierte macOS-Clients fĂŒr Intel und Apple Silicon.
Sowohl
waveals auch das beigelegtewireguard-gotragen eine Developer-ID- Signatur. Das bestehende Archivformat und der automatische Updateweg bleiben erhalten. Die Signaturen und Apple-Tickets werden vor der Veröffentlichung geprĂŒft. - Die macOS-Archive enthalten keine zusĂ€tzlichen Apple-Metadatendateien mehr.
Technische Ănderungen
- Release-Job auf macOS, isolierter temporĂ€rer SchlĂŒsselbund und eigener 1Password-Vault fĂŒr die Apple-Zugangsdaten; Bereinigung auch bei Fehlern.
- Finale PrĂŒfsummen und Ed25519-Manifest werden erst nach der Apple-Signierung erstellt. Ein zusĂ€tzlicher Signierungsnachweis enthĂ€lt Hashes und Submission-IDs.
- Automatisierte Tests fĂŒr SignaturprĂŒfung, abgelehnte Notarisierung, sichere Archivextraktion und Entfernung privater Dateien.
Bekannte EinschrÀnkungen
- Einzelne Binaries unterstĂŒtzen kein Stapling: Gatekeeper benötigt fĂŒr das Notarisierungsticket eine Online-Verbindung. Die unabhĂ€ngige Download-, Installations- und Auto-Update-Abnahme auf einem weiteren Mac steht noch aus.
â Stable v0.7.0 (05.10.2026)
EnthÀlt alles aus v0.7.0-develop.1 bis v0.7.0-develop.3.
Neue Funktionen (gegenĂŒber v0.6.0)
- Zwei-Faktor-Anmeldung mit einer Authenticator-App fĂŒr die Anmeldung mit
E-Mail und Passwort. Eingerichtet wird auf der Seite âDein Kontoâ (die eigene
Adresse oben rechts): QR-Code scannen, ersten Code bestÀtigen, zehn
Wiederherstellungscodes sichern. FĂŒr das verlorene Telefon gibt es einen
Wiederherstellungscode oder
wave-admin disable-2fa <email>. (seit develop.1) - Aus einem Cluster in den Wave. Pods in einem Cluster mit Connector
erreichen Dienste und GerĂ€te des Waves ĂŒber deren Namen, etwa
https://plausible.wave.example.comâ auch Dienste, die ein anderer Cluster in den Wave stellt. TLS bleibt Ende zu Ende; nur HTTP und HTTPS. Je Cluster einzuschalten mit der Komponentecomponents/egressund einem CoreDNS-Eintrag nach Vorlage. (seit develop.3)
Wer sich ĂŒber Google oder Pocket ID anmeldet, nutzt deren zweiten Faktor. Die Clients haben sich seit v0.6.0 nicht geĂ€ndert; GerĂ€te auf dem Kanal stable bekommen v0.7.0 trotzdem angeboten.
đŹ Development v0.7.0-develop.3 (05.10.2026)
Neue Funktionen
- Aus einem Cluster in den Wave. Pods in einem Cluster mit Connector
erreichen Dienste und GerĂ€te des Waves ĂŒber deren Namen, etwa
https://plausible.wave.example.comâ auch Dienste, die ein anderer Cluster in den Wave stellt. TLS bleibt dabei Ende zu Ende; nur HTTP und HTTPS. Eingeschaltet wird es je Cluster mit der Komponentecomponents/egressund einem CoreDNS-Eintrag, der als Vorlage beiliegt.
đŹ Development v0.7.0-develop.2 (04.10.2026)
Derselbe Inhalt wie develop.1. Dessen Build ist an einem Fehler im Testskript gescheitert und hat keine Images und kein Release hervorgebracht.
đŹ Development v0.7.0-develop.1 (04.10.2026)
Neue Funktionen
- Zwei-Faktor-Anmeldung mit einer Authenticator-App fĂŒr die Anmeldung mit E-Mail und Passwort. Eingerichtet wird auf der neuen Seite âDein Kontoâ (die eigene Adresse oben rechts): QR-Code scannen, ersten Code bestĂ€tigen, zehn Wiederherstellungscodes sichern. Danach fragt die Anmeldung nach dem Passwort noch nach dem Code aus der App.
- FĂŒr das verlorene Telefon: ein Wiederherstellungscode meldet einmal an,
und der Betreiber kann den zweiten Faktor mit
wave-admin disable-2fa <email>abschalten.
Wer sich ĂŒber Google oder Pocket ID anmeldet, nutzt deren zweiten Faktor; dort gibt es hier nichts einzurichten.
â Stable v0.6.0 (03.10.2026)
Neue Funktionen (gegenĂŒber v0.5.0)
- Anmeldung ĂŒber Pocket ID und jeden anderen OpenID-Connect-Provider (Authelia, Authentik, Keycloak âŠ). Der Betreiber trĂ€gt Issuer, Client-ID und einen Namen ein; auf der Anmelde- und der Einladungsseite steht dann etwa âWeiter mit Pocket ID". Mit Pocket ID meldet sich niemand mehr mit einem Passwort an, nur noch mit einem Passkey.
Einladungen annehmen kann nur, wessen Adresse der Provider als bestĂ€tigt meldet â in Pocket ID ist das die Einstellung âEmails Verified". An den Clients hat sich nichts geĂ€ndert; GerĂ€te auf dem Kanal stable bekommen v0.6.0 trotzdem angeboten, mit demselben Code wie v0.5.0.
â Stable v0.5.0 (02.10.2026)
EnthÀlt alles aus v0.5.0-develop.1.
Neue Funktionen (gegenĂŒber v0.4.0)
- Deutsch und Englisch ĂŒberall. WeboberflĂ€che, die Seiten des
Control-Servers,
wave, das Tray-Icon,wave-adminund die Apps gibt es in beiden Sprachen; ist die eigene keine davon, gilt Englisch. (seit develop.1) - Umschalter DE | EN in der Kopfzeile der WeboberflÀche, auch vor der Anmeldung. Ohne Wahl gilt die Sprache des Browsers. (seit develop.1)
waveund das Tray-Icon folgen der Systemsprache,WAVE_LANG=enoderWAVE_LANG=delegt sie fest. Meldungen des Dienstes erscheinen in der Sprache dessen, der sie liest. (seit develop.1)- Das Tray-MenĂŒ sagt jetzt, warum sich ein GerĂ€t nicht selbst aktualisiert. (seit develop.1)
Verbesserungen (gegenĂŒber v0.4.0)
- Ist eine GerÀtefreigabe abgelaufen oder ein Wave noch leer, nennt die Seite
den richtigen Befehl:
wave login <control-server-url>stattwave up. (seit develop.1)
GerÀte auf dem Kanal stable bekommen diese Version von selbst angeboten. Die Protokolle des Dienstes und des Servers bleiben englisch.
đŹ Development v0.5.0-develop.1 (02.10.2026)
Neue Funktionen
- Deutsch und Englisch ĂŒberall. WeboberflĂ€che, die Seiten des
Control-Servers,
wave, das Tray-Icon,wave-adminund die Apps gibt es in beiden Sprachen; ist die eigene keine davon, gilt Englisch. - Umschalter DE | EN in der Kopfzeile der WeboberflÀche, auch vor der Anmeldung. Ohne Wahl gilt die Sprache des Browsers.
waveund das Tray-Icon folgen der Systemsprache,WAVE_LANG=enoderWAVE_LANG=delegt sie fest. Meldungen des Dienstes erscheinen in der Sprache dessen, der sie liest.- Das Tray-MenĂŒ sagt jetzt, warum sich ein GerĂ€t nicht selbst aktualisiert.
Verbesserungen
- Ist eine GerÀtefreigabe abgelaufen oder ein Wave noch leer, nennt die Seite
den richtigen Befehl:
wave login <control-server-url>stattwave up.
Protokolle des Dienstes und des Servers bleiben englisch, damit man sie durchsuchen und vergleichen kann.
â Stable v0.4.0 (02.10.2026)
EnthÀlt alles aus v0.4.0-develop.1 und v0.4.0-develop.2.
Neue Funktionen (gegenĂŒber v0.3.0)
- Zugriffsregeln als Graph. Auf der Zugriffsseite eines Waves stehen Mitglieder, Gruppen, Rollen, Tags, Dienste und âalleâ als Karten; eine Regel ist ein Pfeil, den man von einer Karte zur anderen zieht, und die Ports hĂ€ngen an der Kante. Der erste Pfeil schaltet die Policy ein â ab dann gilt nur noch, was ein Pfeil erlaubt. (seit develop.1)
- Gruppen und Tags direkt auf der Seite. Gruppen werden angelegt und mit Mitgliedern gefĂŒllt, Tags angelegt und GerĂ€ten gegeben. Die Seite zeigt dabei sofort, welche GerĂ€te eine Karte trifft und wer danach wen erreicht â noch bevor gespeichert ist. Gespeichert wird alles auf einmal, mit âRĂŒckgĂ€ngigâ und âVerwerfenâ davor. (seit develop.1)
- Die Policy lÀsst sich weiterhin als JSON bearbeiten, aufklappbar unter dem Graphen. (seit develop.1)
Verbesserungen (gegenĂŒber v0.3.0)
- Die Leiste zum Bearbeiten steht rechts neben dem Graphen, die Zugriffsseite ist dafĂŒr so breit wie die Kopfzeile. (seit develop.2)
- Die Ăbersicht beginnt direkt mit den Wave-Karten. (seit develop.1)
An den Clients hat sich nichts geĂ€ndert. GerĂ€te auf dem Kanal stable bekommen v0.4.0 trotzdem angeboten und installieren sie â mit demselben Code wie v0.3.0.
đŹ Development v0.4.0-develop.2 (01.10.2026)
Verbesserungen
- Die Leiste zum Bearbeiten steht rechts neben dem Graphen, nicht mehr darunter: wer eine Karte oder einen Pfeil antippt, sieht sofort, was sich dort einstellen lĂ€sst. Die Zugriffsseite ist dafĂŒr so breit wie die Kopfzeile; auf schmaleren Bildschirmen rutscht die Leiste weiter unter den Graphen.
đŹ Development v0.4.0-develop.1 (01.10.2026)
Neue Funktionen
- Zugriffsregeln als Graph. Auf der Zugriffsseite eines Waves stehen Mitglieder, Gruppen, Rollen, Tags, Dienste und âalleâ als Karten; eine Regel ist ein Pfeil, den man von einer Karte zur anderen zieht, und die Ports hĂ€ngen an der Kante. Der erste Pfeil schaltet die Policy ein â ab dann gilt nur noch, was ein Pfeil erlaubt.
- Gruppen und Tags direkt auf der Seite. Gruppen werden angelegt und mit Mitgliedern gefĂŒllt, Tags angelegt und GerĂ€ten gegeben. Die Seite zeigt dabei sofort, welche GerĂ€te eine Karte trifft und wer danach wen erreicht â noch bevor gespeichert ist. Gespeichert wird alles auf einmal, mit âRĂŒckgĂ€ngigâ und âVerwerfenâ davor.
- Die Policy lÀsst sich weiterhin als JSON bearbeiten, aufklappbar unter dem Graphen.
Verbesserungen
- Die Ăbersicht beginnt direkt mit den Wave-Karten, ohne Einleitung darĂŒber.
â Stable v0.3.0 (01.10.2026)
EnthÀlt alles aus v0.3.0-develop.1.
Neue Funktionen (gegenĂŒber v0.2.0)
- Der Update-Dialog trĂ€gt das wave-Zeichen statt eines Systemsymbols â unter macOS im Dialog, unter Windows im Fenster und in seiner Titelleiste, unter Linux in der Benachrichtigung. Unter Windows ist der Dialog ein eigenes kleines Fenster mit âInstall now" und âLater" statt einer Ja/Nein-Abfrage. (seit develop.1)
GerĂ€te mit v0.2.0 bekommen diese Version von selbst angeboten â und sehen dabei den Update-Dialog zum ersten Mal, noch in seiner alten Form.
đŹ Development v0.3.0-develop.1 (01.10.2026)
Neue Funktionen
- Der Update-Dialog trĂ€gt das wave-Zeichen statt eines Systemsymbols â unter macOS im Dialog, unter Windows im Fenster und in seiner Titelleiste, unter Linux in der Benachrichtigung. Unter Windows ist der Dialog dafĂŒr ein eigenes kleines Fenster mit âInstall now" und âLater" statt einer Ja/Nein-Abfrage.
â Stable v0.2.0 (01.10.2026)
Clients halten sich ab dieser Version selbst aktuell. EnthÀlt alles aus v0.2.0-develop.1 bis v0.2.0-develop.4.
Neue Funktionen (gegenĂŒber v0.1.0)
- Clients aktualisieren sich selbst. Der Control-Server bietet neue Releases an, der Dienst installiert sie nach einer zufĂ€lligen Wartezeit von bis zu vier Stunden und kehrt von allein zur alten Version zurĂŒck, wenn die neue keinen Server erreicht. Installiert wird nur, was mit dem Release-SchlĂŒssel signiert ist, und nie eine Ă€ltere Version. (seit develop.1)
- Neue Befehle:
wave versionzeigt die installierte Fassung und ob eine neuere ansteht,wave updateinstalliert sie sofort,--channelund--auto-update on|offstellen Kanal und Automatik ein. (seit develop.1) - Update-Dialog: Eine neue Version meldet sich einmal mit einem Dialog, der mit einem Klick installiert; Tooltip und MenĂŒ des Tray-Icons nennen sie ebenfalls. (seit develop.1 und develop.4)
- Client-Versionen in der WeboberflÀche: Die GerÀteliste zeigt, welche Version und welcher Update-Kanal auf jedem GerÀt lÀuft, live aktualisiert. (seit develop.2)
FĂŒr Betreiber
WAVE_UPDATE_CHANNELSlegt fest, welche KanĂ€le ein Server anbietet (stable,insiders,develop; der erste ist die Vorgabe, ungesetztstable). OhneWAVE_GITHUB_TOKENâ Fine-grained, nur dieses Repository, âContents: read" â wird nichts angeboten.wave-admin deviceszeigt Version und Kanal jedes GerĂ€ts.- Eine Datenbankmigration lĂ€uft beim Rollout von selbst mit.
Clients von v0.1.0 und Àlter können sich noch nicht selbst aktualisieren: auf jedem GerÀt einmal von Hand
sudo ./wave installmit dieser Version, danach geht es von allein.
đŹ Development v0.2.0-develop.4 (01.10.2026)
Ein neues Update meldet sich jetzt mit einem Dialog.
âš Update-Dialog mit âInstall now"
Steht eine neue Version bereit, erscheint einmal ein Dialog, der beide Versionen nennt, sagt, wann sich das GerĂ€t sonst selbst aktualisiert, und mit einem Klick sofort installiert. Unter Linux ist das eine Desktop-Benachrichtigung mit dem Knopf âInstall now" â wo der Benachrichtigungsdienst keine Knöpfe kennt, genĂŒgt ein Klick auf die Meldung â, unter macOS ein Dialog mit âLater" und âInstall now", unter Windows eine Meldung mit Ja und Nein.
Nach âLater" kommt der Dialog fĂŒr diese Version nicht wieder; der Eintrag âInstall update now" im MenĂŒ des Tray-Icons bleibt.
Zu sehen ist der Dialog ab dem ersten Update nach dieser Version: er muss im Tray stecken, das das Angebot bekommt.
đŹ Development v0.2.0-develop.3 (01.10.2026)
Keine neuen Funktionen: ein Release, an dem sich die Selbst-Updates erproben
lassen. Ein GerÀt mit v0.2.0-develop.1 oder .2 auf dem Kanal develop sollte
sich von selbst auf diese Version heben.
đŹ Development v0.2.0-develop.2 (01.10.2026)
Die WeboberflÀche zeigt, welche Version auf jedem GerÀt lÀuft.
⚠Client-Version in der GerÀteliste
In der GerÀteliste steht jetzt unter dem Betriebssystem, welche Version des
Clients ein GerĂ€t fĂ€hrt und welchem Update-Kanal es folgt â etwa
v0.2.0-develop.1 · develop. So ist auf einen Blick zu sehen, wer zurĂŒckhĂ€ngt.
Die Anzeige folgt live: meldet sich ein GerÀt nach einem Update mit der neuen
Version, Àndert sie sich ohne Neuladen. GerÀte mit Clients von vor den
Selbst-Updates melden ihre Version nicht und stehen dort als âVersion
unbekannt".
đŹ Development v0.2.0-develop.1 (01.10.2026)
Installierte Clients halten sich ab jetzt selbst aktuell.
âš Clients aktualisieren sich selbst
Bisher blieb ein installiertes GerÀt auf seiner Version stehen, bis jemand ein
neues Archiv holte und wave install noch einmal ausfĂŒhrte. Jetzt bietet der
Control-Server seinen GerÀten neue Releases an, und der Dienst installiert sie
nach einer zufÀlligen Wartezeit von bis zu vier Stunden selbst. Erreicht die
neue Fassung danach binnen fĂŒnf Minuten keinen Server, kehrt das GerĂ€t von
allein zur alten zurĂŒck und nimmt diese Version nie wieder.
Installiert wird nur, was mit dem Release-SchlĂŒssel signiert ist, den das Programm mitbringt â der Control-Server reicht Releases nur weiter und kann nichts unterschieben. Ăltere Versionen werden nie installiert.
wave version # welche Fassung, und ob eine neuere ansteht
wave update # die neuere jetzt statt spÀter
wave update --channel insiders # ein anderer Kanal, sofern der Server ihn anbietet
wave update --auto-update off # nur noch anzeigen
Das Tray-Icon nennt ein anstehendes Update im Tooltip, im MenĂŒ (mit âInstall update now") und im Fenster.
FĂŒr Betreiber
- Welche KanÀle ein Server anbietet, legt
WAVE_UPDATE_CHANNELSfest:stable,insiders,develop, mehrere mit Komma, der erste ist die Vorgabe. Ungesetzt ist esstable. Ein GerĂ€t kann sich einen anderen aus der Liste wĂŒnschen, keinen darĂŒber hinaus. - Ohne
WAVE_GITHUB_TOKENwird nichts angeboten. Nötig ist ein Fine-grained Token nur fĂŒr dieses Repository mit âContents: read"; er bleibt auf dem Server. wave-admin deviceszeigt jetzt die Version jedes GerĂ€ts und seinen Kanal. GerĂ€te mit Ă€lteren Clients stehen dort als âversion unknown".- Eine neue Datenbankmigration lĂ€uft beim Rollout von selbst mit.
Der erste Client mit dieser Funktion muss noch einmal von Hand installiert werden; ab dann geht es von allein.
â Stable v0.1.0 (01.10.2026)
Die erste stabile Version: sie enthĂ€lt alles aus v0.1.0-insiders.1 bis v0.1.0-insiders.9 und dazu die Ănderung unten.
đŠ Neues Zuhause: moellenbeck-digital
wave-mesh liegt jetzt im Repository moellenbeck-digital/wave-mesh. Die Images
kommen ab dieser Version aus ghcr.io/moellenbeck-digital/wave-mesh/*; wer sie
bisher unter ghcr.io/pinguin45orga/wave-mesh/* bezogen hat, stellt die
Adresse um. An bestehenden Anmeldungen, GerÀten und Adressen Àndert sich
nichts.
Das Wichtigste aus den Vorschau-Versionen
- Zugriffsregeln: Eine Policy legt fest, wer wen erreicht â nach Personen, Gruppen, Rollen, Diensten oder Tags, mit Ports und Richtung. Ohne Policy erreicht weiterhin jedes GerĂ€t jedes andere. (seit insiders.5)
- Verlauf: Jede Ănderung an einem Wave wird mit Zeit und Person festgehalten. (seit insiders.5)
- Neuer Name und eigenes Icon: Aus wave-net wurde wave-mesh, mit eigenem Zeichen im Tray und im Browser-Tab. (seit insiders.7 und insiders.9)
- Neue Lizenz: Elastic License 2.0 statt MIT. (seit insiders.9)
- Schonender fĂŒrs Netz: Keine wachsenden Adresslisten mehr, die Heimrouter volllaufen lieĂen, und deutlich weniger Anfragen an Adressen, die nie antworten. (seit insiders.1 und insiders.6)
- Robuster nach Ruhezustand und WLAN-Aussetzern: Die Relay-Verbindung baut sich selbst neu auf, und der Verkehr kehrt auf den direkten Weg zurĂŒck. (seit insiders.2)
đ§Ș Insiders v0.1.0-insiders.9 (01.10.2026)
Neu gegenĂŒber v0.1.0-insiders.8.
âš Ein eigenes Icon
wave-mesh hat ein Zeichen: drei verbundene Knoten auf einer Scheibe, die Grundlinie eine Welle. Es steht im Tray unter Linux, Windows und macOS und als Symbol im Browser-Tab der OberflĂ€che. Der Tray zeigt den Zustand wie bisher an der Farbe â Petrol verbunden, Gelb verbindend, Grau getrennt. Unter macOS ersetzt es den farbigen Punkt in der MenĂŒleiste; dort ist es neu und noch nicht auf echter Hardware erprobt.
đ Neue Lizenz: Elastic License 2.0
wave-mesh steht ab dieser Version unter der Elastic License 2.0 statt MIT. Benutzen, verĂ€ndern und weitergeben bleibt erlaubt, auch im eigenen Unternehmen; nicht erlaubt ist, wave-mesh Dritten als gehosteten oder verwalteten Dienst anzubieten. FrĂŒhere Versionen bleiben unter MIT.
đ§Ș Insiders v0.1.0-insiders.8 (30.09.2026)
Neu gegenĂŒber v0.1.0-insiders.7.
đ Logo im Seitenkopf
Der Seitenkopf der OberflĂ€che zeigte noch âwavenetâ; jetzt steht dort âwavemeshâ.
đ§Ș Insiders v0.1.0-insiders.7 (30.09.2026)
Neu gegenĂŒber v0.1.0-insiders.6.
âš Neuer Name: wave-mesh
Das Projekt heiĂt jetzt wave-mesh statt wave-net â in der OberflĂ€che, in
der Beschreibung des Dienstes auf dem GerÀt und im Repository. Die Images
liegen ab dieser Version unter ghcr.io/pinguin45orga/wave-mesh/*. An
bestehenden Anmeldungen, GerÀten und Adressen Àndert sich nichts.
đ§Ș Insiders v0.1.0-insiders.6 (30.09.2026)
Neu gegenĂŒber v0.1.0-insiders.5.
đ Weniger Fehlversuche ins Leere
Ein GerĂ€t probiert jede Adresse, unter der ein anderes vielleicht erreichbar ist â auch solche, die von hier aus gar nicht erreichbar sind, etwa das Heimnetz eines anderen Standorts. Eine Adresse, die nie antwortete, bekam bisher viermal pro Sekunde eine Anfrage, und zwar dauerhaft. Das kostete VerbindungseintrĂ€ge im eigenen Router und fĂŒllte das Log mit Hunderten von Meldungen wie âsocket error(s) ignoredâ pro Minute. Nach den ersten fĂŒnf Sekunden wird eine solche Adresse jetzt nur noch alle drei Sekunden gefragt, so oft wie eine funktionierende. Verbindungen kommen genauso schnell zustande wie vorher, auch auf den Telefonen.
đ§Ș Insiders v0.1.0-insiders.5 (29.09.2026)
Neu gegenĂŒber v0.1.0-insiders.2. Die Tags v0.1.0-insiders.3 und .4 wurden nie veröffentlicht: der Test der Zugriffsregeln fand zuerst einen Fehler in sich selbst und dann einen echten â unter Ubuntu 24.04 hĂ€tten Linux-GerĂ€te die Ports nicht durchgesetzt. Beides ist hier behoben.
âš Zugriffsregeln: wer wen erreicht
Bisher erreichte in einem Wave jedes GerĂ€t jedes andere, auf allen Ports. Das bleibt so, solange niemand etwas anderes festlegt. Jetzt lĂ€sst sich fĂŒr einen Wave eine Policy setzen, und dann ist nur noch erlaubt, was eine Regel nennt: etwa âmeine GerĂ€te erreichen das NAS, aber nur fĂŒr Dateifreigabenâ, oder âder Kubernetes-Connector erreicht niemanden von sich ausâ.
- Regeln nennen Personen, Gruppen, Rollen, Dienste oder Tags. Ein Tag
kennzeichnet eine Maschine â
tag:nas,tag:serverâ und ein getaggtes GerĂ€t zĂ€hlt nicht mehr als GerĂ€t seines Besitzers. - Ein GerĂ€t, das eine Regel nicht erlaubt, ist fĂŒr die anderen gar nicht erst da. Das gilt sofort fĂŒr jedes GerĂ€t, auch fĂŒr eines mit Ă€lterer Version.
- Die erlaubten Ports und die Richtung setzt jedes GerĂ€t selbst durch: unter Linux und im Kern der Telefon-Apps geprĂŒft, unter macOS und Windows neu und dort noch nicht auf echter Hardware erprobt. Welches GerĂ€t die Ports hĂ€lt, zeigt die neue Zugriffsseite.
- Verwaltet wird auf der neuen Seite Zugriff in der Wave-Karte, fĂŒr
EigentĂŒmer und Admins, oder mit
wave-admin.
âš Verlauf
Jede Ănderung an einem Wave â Regeln, Tags, Mitglieder, Einladungen, GerĂ€te, Domain â wird mit Zeit und Person festgehalten und ist auf der Zugriffsseite zu sehen.
đ§Ș Insiders v0.1.0-insiders.2 (28.09.2026)
Neu gegenĂŒber v0.1.0-insiders.1.
đ Nach dem Ruhezustand wieder erreichbar
Wachte ein Laptop aus dem Ruhezustand auf, blieb seine Verbindung zum Relay still tot: die Anzeige sagte ârelay connectedâ, aber GerĂ€te, die nur ĂŒber das Relay erreichbar sind â etwa ein Connector in einem Kubernetes-Cluster â standen auf âconnectingâŠâ, bis wave neu gestartet wurde. Jetzt prĂŒft wave die Relay-Verbindung alle 15 Sekunden und baut sie neu auf, sobald sie nicht mehr antwortet. Das gilt ebenso fĂŒr den Kern der Telefon-Apps, wo Schlafen der Normalfall ist.
đ Der Verkehr findet ins lokale Netz zurĂŒck
Nach einem kurzen Aussetzer im WLAN konnte der Verkehr zwischen zwei GerĂ€ten im selben Netz auf dem Umweg ĂŒber den Router hĂ€ngen bleiben, obwohl der direkte Weg lĂ€ngst wieder da und mehr als doppelt so schnell war. Jetzt wechselt wave zurĂŒck, sobald der direkte Weg deutlich schneller ist.
đ§Ș Insiders v0.1.0-insiders.1 (28.09.2026)
Die erste Vorschau-Version: sie enthĂ€lt alles aus den Development-Builds bis v0.1.0-develop.28 und dazu die beiden Ănderungen unten.
đ wave legt keinen Router mehr lahm
Ein GerĂ€t hinter einem NAT, das jeder Verbindung einen neuen Port gibt â ein Kubernetes-Knoten, ein Handy-Hotspot â, meldete jede Minute eine neue eigene Adresse und vergaĂ nie eine alte. Nach zwei Tagen waren es beim Connector gut 2600, und jedes andere GerĂ€t im Wave versuchte sie alle mehrmals pro Sekunde. Jeder dieser Versuche belegt auf dem Router davor einen Eintrag, und ein Heimrouter ist damit irgendwann voll: das Internet wird fĂŒr alle im Haus langsam oder bricht ab.
Jetzt verfallen solche Adressen nach wenigen Minuten, GerĂ€te vergessen Adressen, die ein anderes GerĂ€t nicht mehr meldet, und der Server gibt je GerĂ€t nur noch eine kleine Zahl weiter â auch fĂŒr GerĂ€te, die noch eine Ă€ltere Version fahren. Das gilt ebenso fĂŒr den Kern der Telefon-Apps.
đ Die ganze Zeile klappt die Dienste auf
Im Tray-Fenster unter macOS reagierte nur das kleine Dreieck auf einen Klick, nicht der Name und die Adresse daneben. Jetzt klappt die ganze Zeile auf.
đŹ Development v0.1.0-develop.28 (26.09.2026)
Die Dienste eines Clusters stehen jetzt ĂŒberall dort, wo auch die GerĂ€te stehen â und ein Klick öffnet sie.
⚠Dienste auf Klick, unter ihrem GerÀt
Ein Connector bringt so viele Namen mit, wie der Cluster Ingresse hat. In der
WeboberflÀche standen sie bisher alle ausgeschrieben unter ihrem GerÀt und
schoben die GerĂ€teliste aus dem Blick; auf dem GerĂ€t selbst â im Tray-Fenster
und in wave status â gab es sie ĂŒberhaupt nicht zu sehen.
Jetzt klappt ein Klick auf ein GerĂ€t seine Dienste darunter auf, ein zweiter klappt sie wieder zu, und ein Klick auf einen Dienst öffnet ihn im Browser. Das gilt fĂŒr die WeboberflĂ€che und fĂŒr das Tray-Fenster auf allen drei Plattformen; welche GerĂ€te offen sind, ĂŒberlebt dabei die laufende Aktualisierung. GerĂ€te ohne Dienste bleiben, was sie waren.
wave status schreibt sie stattdessen eingerĂŒckt unter ihre Maschine â im
Terminal gibt es nichts anzuklicken. Es ist auch die einzige Ansicht, die die
Dienste des eigenen GerÀts zeigt: wer den Client selbst als Connector fÀhrt,
sah sie bislang nirgends.
đ Ein Link, ĂŒberall derselbe
Ob ein Dienst http oder https spricht, weiĂ nur der Cluster; unter welcher
Domain er hĂ€ngt, nur der Wave. Beides weiĂ der Server â und er schreibt die
Adresse jetzt einmal aus und schickt genau diese an alle: an den Browser, an
jedes GerÀt, an die Shell. Vorher setzte sie sich jede Ansicht selbst zusammen,
und vier Schreibweisen derselben Adresse sind vier Gelegenheiten,
auseinanderzulaufen. Ein Dienst, der nur Klartext spricht, wird damit nirgends
mehr als https-Link angeboten â ein Link, der ins Leere gefĂŒhrt hĂ€tte.
đŹ Development v0.1.0-develop.27 (26.09.2026)
Die GerÀteliste in der OberflÀche aktualisiert sich von selbst.
⚠GerÀte, Status und Dienste ohne Neuladen
Bisher zeigte die Ăbersicht den Stand vom Moment des Aufrufs: ein GerĂ€t, das sich gerade verband, eines, das dazukam oder entfernt wurde, ein Cluster, der andere Dienste meldete â nichts davon erreichte eine Seite, die schon offen war. Man hat neu geladen und nachgesehen.
Die Karte hĂ€ngt jetzt an einer laufenden Verbindung zum Control-Server und zeichnet neu, sobald sich etwas Ă€ndert: der Punkt neben einem GerĂ€t, die Zahl in â3 von 5 GerĂ€ten verbunden", die Liste selbst und die Dienste darunter.
Zu sehen bekommt man dabei nur die Waves, in denen man ist â wer aus einem Wave entfernt wird, sieht dessen GerĂ€te auch in einem offenen Tab nicht weiter. ReiĂt die Verbindung ab, sagt die Seite es und verbindet sich von selbst wieder; bis dahin steht dort der Stand vom Laden, statt still zu veralten.
đŹ Development v0.1.0-develop.26 (24.09.2026)
Das Tray-Fenster unter macOS geht wieder beim ersten Klick auf.
đ Die Karte unter macOS brauchte zwei Klicks
Wer das Fenster ĂŒber das Icon öffnete, danach woanders hin klickte und dann wieder aufs Icon, sah nichts passieren â erst der zweite Klick brachte die Karte zurĂŒck.
Dahinter steckte eine Karte, die sich nicht weggerĂ€umt hat. Sie sollte verschwinden, sobald man sich etwas anderem zuwendet, blieb aber stehen; der nĂ€chste Klick aufs Icon tat deshalb genau das, was ein Klick auf eine offene Karte tut â er hat sie geschlossen. Sie rĂ€umt sich jetzt selbst weg, sobald sie den Fokus verliert, und der Klick, der das ausgelöst hat, macht sie nicht im selben Atemzug wieder auf.
đŹ Development v0.1.0-develop.25 (23.09.2026)
Ein fremdes GerĂ€t kommt nicht mehr durch einen angeklickten Link in den Wave, und ein Telefon, das das Netz wechselt, bleibt ĂŒber das Relay erreichbar.
đ Ein GerĂ€t freizugeben ist ein Knopfdruck, nicht das Ăffnen eines Links
Bisher genĂŒgte es, den Anmeldelink zu öffnen â damit war das GerĂ€t im Wave.
Das reicht nicht: einen solchen Link bekommt jeder, der wave login gegen den
Server laufen lĂ€sst, und dafĂŒr braucht es weder Konto noch Einladung. Danach
genĂŒgte es, ein angemeldetes Mitglied auf den Link zu locken, und ein fremdes
GerĂ€t saĂ im Wave â nachgestellt, mit Adresse, in jeder Netzkarte und auf
jedem Interface.
Die Seite zeigt jetzt nur noch; aufgenommen wird das GerÀt erst mit dem Absenden des Formulars. Der eine eingesparte Klick war genau der, der den Schritt getragen hat. Gefragt wird dabei immer, auch wenn es nur einen Wave gibt.
đ Ein Telefon, das das Netz wechselt, bleibt ĂŒber das Relay erreichbar
Verband sich ein GerĂ€t neu â WLAN auf Mobilfunk, der Normalfall auf dem Telefon â, rĂ€umte die alte, zufallende Verbindung die gerade angelegte neue wieder weg. Zu sehen war davon nichts: das GerĂ€t galt weiter als verbunden, nur kam ĂŒber das Relay nichts mehr bei ihm an.
đ Weniger AngriffsflĂ€che in den Images
Ein AbhĂ€ngigkeits-Audit hat vier LĂŒcken aufgedeckt und alle sind zu: Release-Bau und Connector-Image stehen auf derselben, unterstĂŒtzten Go-Fassung wie der Rest des Repos; das Connector-Image schleppt keinen Compiler-Baum mehr mit, den nie jemand ausfĂŒhrt; und die Datenbankschicht ist auf eine Fassung ohne bekannte Schwachstelle gehoben.
đŹ Development v0.1.0-develop.24 (23.09.2026)
Einen Wave zu administrieren braucht im Container keinen Pfad in den Workspace mehr.
đ Die Operator-CLI liegt als Binary im Control-Image
wave-admin steht im Image auf dem PATH. Wer einen Wave administriert, tippt
also docker exec <container> wave-admin members <wave> statt den Pfad in den
Workspace â und kann das Binary aus dem Image herauskopieren und anderswo
benutzen, weil alles darin steckt.
Aus dem Repo heraus Àndert sich nichts: bun apps/control/src/admin.ts ist
weiterhin dasselbe Programm, und die Hilfe nennt von selbst den Weg, ĂŒber den
sie gerade aufgerufen wurde, statt auf ein Verzeichnis zu zeigen, das nicht da
ist.
đŹ Development v0.1.0-develop.23 (23.09.2026)
wave lĂ€uft jetzt auch auf dem Telefon â jedenfalls ĂŒberall dort, wo es sich ohne Telefon nachweisen lĂ€sst â, und wer seine Domain bei IONOS oder INWX hat, bekommt seine Zertifikate ab jetzt ohne Handarbeit.
v0.1.0-develop.22 gibt es gar nicht. Der Tag existiert, aber der Lauf kam nicht bis zu den Images: die End-to-End-Tests scheiterten daran, dass der Go-Kern in einem Netz-Namespace gebaut wird, in dem es kein Netz gibt â und die dort eingestellte Go-Version war eine Ă€ltere, als der Kern verlangt, also wollte Go sich erst eine nachladen. Derselbe Inhalt trĂ€gt jetzt die
.23.
đ± Mobile: ein Go-Kern fĂŒr iOS und Android (D10 / M10)
Vom bisherigen Client lĂ€uft auf einem Telefon nichts: kein Bun.spawn fĂŒr
wireguard-go, kein ip oder resolvectl, und die iOS-Tunnel-Extension ist bei
rund 50 MB gedeckelt. Portabel ist allein der Vertrag. Neu ist deshalb ein
gemeinsamer Kern in Go unter mobile/core, dazu die beiden Plattform-Hosts â
NEPacketTunnelProvider in Swift, VpnService in Kotlin â, die absichtlich
dĂŒnn bleiben: sie tun nur, was ausschlieĂlich die Plattform kann.
- Ein Tunnel, mehrere Waves. Beide Plattformen erlauben genau einen Tunnel je App. Also liegt unten ein GerĂ€t und darĂŒber je Wave ein eigenes WireGuard-Device, dazwischen ein Demultiplexer, der nach ZielprĂ€fix sortiert. Ein Telefon kann damit in zwei Waves gleichzeitig sein, mit getrennten SchlĂŒsseln â derselbe öffentliche SchlĂŒssel in jeder Netmap wĂŒrde sonst zwei Waves mit einem gemeinsamen Mitglied erlauben, das GerĂ€t wiederzuerkennen.
- Ein UDP-Port fĂŒr alles. Der Loopback-Socket je Peer entfĂ€llt: als
Bibliothek nimmt wireguard-go eine
conn.Bindentgegen, und jede Wave bekommt davon eine Sicht, die nur ihre Pakete liefert. Ein Pfadwechsel fasst die WireGuard-Konfiguration weiterhin nie an â dort steht jetzt der Peer statt einer Adresse. - Ein Resolver mit Suffix-Tabelle, ohne eigenen Socket. Die Anfrage kommt
als Paket auf dem Tunnel an und die Antwort geht genauso zurĂŒck, samt
PrĂŒfsummen. PTR inklusive, damit
ping <name>nicht acht Sekunden auf eine RĂŒckwĂ€rtsauflösung wartet, die niemand beantwortet. - Der Netzwechsel ist der Normalfall. WLAN â LTE löst sofort einen Rebind und neue Kandidaten aus, statt darauf zu warten, dass Peers unerreichbar werden. Das ist der Unterschied zwischen einer Pause, die niemand bemerkt, und zehn Sekunden ohne alles.
- Zwei Waves dĂŒrfen sich weder Adressen noch SchlĂŒssel teilen. Auf einem gemeinsamen Socket entscheidet der AbsenderschlĂŒssel im Klartext, welcher Peer ein Disco-Paket geschickt hat â ein bösartiger Control-Server könnte sich sonst in das Nachschlagen einer fremden Wave hĂ€ngen. Die zweite Wave wird abgelehnt, und beide werden genannt.
Der Kern lÀuft an einem echten TUN. Zwei E2E-Skripte setzen genau den Code,
der auf ein Telefon geht, auf ein echtes Tunnelinterface â die Gegenstelle ist
jeweils der gewöhnliche Client, also wird zugleich ĂŒber die
Implementierungsgrenze geprĂŒft. mobile-core.sh: ein Interface trĂ€gt zwei
Waves, ein UDP-Port fĂŒr beide, ein Peer in jeder erreichbar, der Resolver
antwortet ohne Socket fĂŒr beide Zonen, ein Neustart kommt mit denselben
Adressen und demselben Port zurĂŒck. mobile-nat.sh: derselbe Kern hinter einem
NAT puncht einen direkten Pfad, und hinter zwei symmetrischen NATs, wo Punching
nicht gelingen kann, lĂ€uft der Verkehr ĂŒber das Relay. Damit ist abgedeckt, was
M10 verlangt â zwei Waves gleichzeitig, direkter Pfad und Relay-Fallback.
Vier Fehler sind dabei aufgefallen, keiner an einem Unit-Test: ein Tunnel, der genau einmal hochkam und danach âbind is closed" meldete; ein Neustart, nach dem die Peers 15 Sekunden ins Leere sendeten; ein GerĂ€t mit zwei Waves, das die erste erreichte und die zweite nicht, bei bestĂ€tigten Pfaden zu beiden; und ein Absturz, sobald zum ersten Mal ein Relay im Spiel war.
đ Jeder Wave reserviert eine Adresse fĂŒr seinen Resolver
Die 53. seines Blocks. Der Allokator vergibt sie nie an ein GerĂ€t, und die Netmap schickt sie mit. Nötig ist das fĂŒr Clients, deren Resolver keinen eigenen Socket hat: erreicht wird er nur, wenn seine Adresse in den Tunnel geroutet und niemandem zugewiesen ist â eine Adresse, die das Interface hĂ€lt, beantwortet der Kernel lokal, wo nichts lauscht.
Das Feld ist dabei optional geworden statt vorbelegt: ein Wave, der vor der
Reservierung nummeriert wurde, kann die Adresse lÀngst an einen Knoten vergeben
haben, und dann bleibt sie weg, statt das DNS aller GerÀte auf ein GerÀt zu
zeigen. Nebenbei ist damit eine Regelverletzung raus, die eine einwandfreie
Netmap irgendwann als gefÀlscht hÀtte melden können: unterhalb von Netmap darf
nichts einen Default haben.
Auf einem Telefon gelaufen ist nichts davon. Es gibt hier weder einen Mac noch ein Android-GerĂ€t; fĂŒr iOS fehlt zusĂ€tzlich das Xcode-Projekt und ein bezahlter Developer-Account, und der iOS-Simulator kann Network Extensions ohnehin nicht ausfĂŒhren. Derselbe Stand wie beim Windows-Tray: benannt, nicht verschwiegen.
đ Zwei weitere DNS-Provider: IONOS und INWX
set-dns-provider kennt jetzt vier statt zwei. Wer seine Domain bei IONOS oder
INWX hat, bekommt damit unbeaufsichtigte Erneuerungen, statt fĂŒr jede einen
TXT-Record von Hand anzulegen.
Die beiden Neuen sind nicht dieselbe Sorte Zugangsdaten wie die beiden Alten, und das ist beim Einrichten zu wissen:
- IONOS meint hier Hosting DNS â die gewöhnliche Domain bei ionos.de â
und nicht IONOS Cloud DNS. Getrennte Produkte mit getrennten APIs; der Key
des einen ergibt beim anderen 401. Der Zugang ist ein API-Key der Form
<public prefix>.<secret>. - INWX hat keinen Token, der sich auf eine Zone einschrĂ€nken lieĂe: es
meldet sich mit Benutzername und Passwort an, bei aktiver Zwei-Faktor-Auth
zusĂ€tzlich mit einem TOTP-Code, fĂŒr den das Shared Secret hinterlegt wird.
Diese Zugangsdaten können alles, was das Konto kann â ein Sub-Account nur fĂŒr
diese Domain ist die einzige Art, das einzugrenzen, und
set-dns-providersagt das beim Abfragen. Abgelegt wird die Angabe als JSON in derselben versiegelten Spalte wie ein Token.
WAVE_DNS_SECRET gilt unverĂ€ndert fĂŒr beide: ohne den Wert wird nichts
gespeichert. Und set-dns-provider probiert die Zugangsdaten weiterhin sofort
gegen die echte Zone â was nicht schreiben kann, wird nicht behalten.
GeprĂŒft ist das gegen nachgebaute APIs, nicht gegen die echten: die Sitzung von INWX samt Ablauf und zweitem Faktor, die AnfĂŒhrungszeichen, in denen IONOS seine TXT-Werte zurĂŒckgibt, und fĂŒr beide der Fall, auf den es ankommt â ein Wildcard-Auftrag und sein Apex schreiben denselben Recordnamen mit verschiedenen Werten, und keiner darf den anderen wegrĂ€umen.
đŹ Development v0.1.0-develop.21 (22.09.2026)
Das Tray-Icon ist unter Windows nach dem Install sofort da, und der Link zu einem Dienst fĂŒhrt endlich dorthin, wo er hinfĂŒhren soll.
v0.1.0-develop.20 gibt es nicht zum Herunterladen. Der Tag existiert, und control und relay liegen unter dieser Nummer auf der Registry, aber der Lauf kam nicht bis zum Release: der Speicher der Organisation war voll, und damit schlug das Hochladen der Client-Archive fehl. Was dort hineingehört hÀtte, steht hier. Wer
developfĂ€hrt, holt sich.21â dort stimmen alle vier Images wieder ĂŒberein.
Neue Funktionen
- Unter Windows steht das Tray-Icon direkt nach
wave installda. Bisher wurde dort nur ein Anmelde-Task registriert â das Icon kam also erst beim nĂ€chsten Ab- und Anmelden, oder man startetewave trayvon Hand, und der Schlusshinweis musste genau das zugeben. Jetzt startet es sofort, so wie es launchd und systemd auf den anderen beiden ohnehin tun. Es bleibt ein optionaler Schritt: ein Eingabeaufforderungs-Fenster als Administrator eines anderen Kontos kann keine fremde Sitzung bespielen, und ein Icon, das nicht startet, ist kein Tunnel, der gescheitert ist. - Das Icon verschwindet nicht mehr nach drei Tagen. Der Aufgabenplaner beendet eine Aufgabe ohne ausdrĂŒckliche Zeitangabe nach drei Tagen, und auf einem Laptop lieĂ er sie im Akkubetrieb meist gar nicht erst starten â beides Voreinstellungen, die sich nur ĂŒber eine Definitionsdatei abschalten lassen, und beides Fehlerbilder, die man morgens ohne Anhaltspunkt vorfindet. Ein Absturz fĂŒhrt jetzt auĂerdem zu einem Neustart statt zum Ende.
- Der Link zu einem Dienst spricht das Protokoll seines Ingress. Die
OberflÀche baute jede Dienstadresse als
https, und bei einem Cluster, der einen davon im Klartext ausliefert, ging der Link ins Leere. Ob TLS beendet wird, weiĂ nur der Cluster â es hĂ€ngt am Ingress beziehungsweise am Listener des Gateways â, und er sagt es jetzt: OberflĂ€che undadmin.ts servicesbauen den Link daraus. Wird ein Name ĂŒber beide Wege bedient, gewinnthttps.
Wichtig zu wissen
- Eine Version entsteht erst, wenn der Tunnel im Test wirklich hochkommt. Die End-to-End-Tests â zwei Knoten im Tunnel, ein GerĂ€t in zwei Waves, Hole Punching durch zwei NATs, RĂŒckfall aufs Relay â laufen jetzt im Release-Lauf und halten Images und Binaries auf. Vorher liefen sie neben dem Release auf Pull Requests, konnten also rot sein, wĂ€hrend eine Version herausging. Der Preis dafĂŒr steht in derselben Zeile: auf einen Push oder Pull Request reagiert nichts mehr, PrĂŒfungen vor dem Commit sind damit Handarbeit.
đź Development v0.1.0-develop.19 (21.09.2026)
Ein GerÀt bekam die Adresse eines Dienstes -- und unter Windows kam daraufhin gar kein Tunnel mehr hoch.
Fehlerbehebungen
- Ein neues GerĂ€t konnte die Adresse eines Dienstes bekommen. GerĂ€te und Dienste teilen sich in einem Wave eine Nummerierung, aber nur die Dienste wurden mit Blick auf beide Seiten vergeben. Ein GerĂ€t, das nach einem Dienst dazukam, landete deshalb womöglich auf dessen Adresse -- und das fiel nicht dort auf, sondern auf ebendiesem GerĂ€t, als etwas, das nach Netz aussieht: Der Tunnel kam nicht hoch, weil die Route fĂŒr diese Adresse mit der eigenen Adresse kollidierte. Neue GerĂ€te bekommen jetzt Adresse und Namen, die noch niemand hĂ€lt; ein GerĂ€t kann sich damit auch nicht mehr so nennen wie ein Dienst.
- Unter Windows scheiterte der Start an einer Route, die schon da war. Windows legt zu jeder Adresse eines Adapters selbst eine Route an. Der Client zÀhlte die nicht mit, legte sie ein zweites Mal an, und die Absage darauf brach den ganzen Start ab. Angelegt wird jetzt nur, was fehlt.
- Ein gescheiterter Start rÀumt hinter sich auf. Vorher blieben Interface, Port, Adressen und Routen liegen; der nÀchste Versuch scheiterte dann an den Resten des vorigen statt an dem, was wirklich schiefging -- unter Windows dauerhaft, weil eine liegengebliebene Route dort jeden weiteren Versuch abweist.
đŹ Development v0.1.0-develop.18 (21.09.2026)
Windows holt beim Tray auf.
Neue Funktionen
-
Das Tray-Fenster gibt es jetzt auch unter Windows. Ein Linksklick aufs Icon öffnet dieselbe Karte, die Linux und macOS schon zeigen: oben der GerĂ€tename, darunter jeder Wave mit einem eigenen Schalter zum Verbinden und Trennen, darunter die Maschinen mit Adresse, Namen und dem Weg, ĂŒber den sie gerade erreicht werden â samt Knopf, der den Namen in die Zwischenablage legt. Vorher fiel der Linksklick dort ins Leere und alles hing am MenĂŒ der rechten Maustaste; das gibt es unverĂ€ndert weiter. Das Fenster verschwindet, sobald man sich etwas anderem zuwendet, und auf Escape.
UngeprĂŒft auf echter Hardware â hier steht keine Windows-Maschine. GeprĂŒft ist, wo jedes Element landet und was ein Klick darauf auslöst.
đŹ Development v0.1.0-develop.17 (21.09.2026)
Fehlerbehebungen
- Die Ereignisliste des Clients ist wieder brauchbar. Sie bestand zuletzt
fast nur aus
socket error (ignored): unknownâ einer Meldung ohne Inhalt, die im Sekundentakt kam und die acht Zeilen verdrĂ€ngte, fĂŒr die die Liste da ist. Ursache sind ICMP-Ablehnungen von Adressen, die ein Peer angeboten hat und die von hier aus nicht erreichbar sind; das ist normal. Sie werden jetzt gezĂ€hlt, und höchstens einmal pro Minute steht dort, wie viele es waren.
đŹ Development v0.1.0-develop.16 (21.09.2026)
Zwei kleine Dinge in der OberflÀche, die vorher fehlten.
Neue Funktionen
- Ein Dienst ist jetzt anklickbar. Unter dem Connector steht seine Adresse als vollstĂ€ndige URL und fĂŒhrt direkt dorthin â erreichbar fĂŒr jeden im Wave und fĂŒr sonst niemanden, denn auĂerhalb löst der Name nicht einmal auf.
- Der Name eines Waves lĂ€sst sich Ă€ndern, von EigentĂŒmer und Administratoren, in der Wave-Karte ĂŒber der Domain. Das ist der billige Schritt: kein GerĂ€t kennt den Namen, es muss also auch keines etwas ĂŒbernehmen. Anders als beim Wechsel der Domain, bei dem jedes GerĂ€t eine neue Netzkarte braucht.
đŹ Development v0.1.0-develop.15 (21.09.2026)
Die Dienste eines Clusters sind jetzt auch zu sehen â und der Weg dorthin funktioniert im echten Cluster.
Neue Funktionen
- Die OberflĂ€che zeigt die Dienste eines Connectors. Unter dem GerĂ€t stehen die Namen, die es beantwortet, mit ihrer Adresse im Wave; am GerĂ€tenamen sagt ein Abzeichen, wie viele es sind. Vorher sah ein Connector aus wie eine Maschine, die beigetreten ist und seitdem nichts tut â die Dienste waren in der Netzkarte, in den Routen und im Resolver, nur nirgends zu sehen.
Fehlerbehebungen
- Der interne Ingress-Controller antwortete auf alles mit 404. Ihm fehlte ein Leserecht, ohne das er seine Konfiguration nie veröffentlicht â und das stand nirgends im Log, sondern nur als wiederholter Rechte-Fehler zu einer Ressource, die mit Ingresses nichts zu tun hat.
đŹ Development v0.1.0-develop.14 (21.09.2026)
Das erste Mal, dass ein Cluster wirklich einen Dienst in einen Wave gestellt hat â und die Fehler, die dabei sichtbar wurden.
Fehlerbehebungen
- Ein Dienst aus dem Cluster war nicht erreichbar. Name und Adresse kamen an, jedes GerĂ€t hatte die Route, und trotzdem antwortete nichts: Der Connector hielt die Adressen seiner Dienste fĂŒr seine eigenen und leitete sie deshalb nicht weiter â das Paket blieb bei ihm liegen. Aufgefallen ist das erst im echten Cluster, weil es den Fehler ohne Dienste gar nicht gibt.
Neue Funktionen
- Die Clusterseite bringt ihren eigenen Ingress-Controller mit (Traefik,
Klasse
wave, nur ClusterIP), und davor eine Regel, die nur den Connector durchlĂ€sst. Erst das macht ânur aus dem Wave erreichbar" wahr: wave kann einen Dienst erreichbar machen, unerreichbar machen muss der Cluster. Wer schon einen internen Controller hat, nimmt diesen heraus. - Der Connector behĂ€lt seine Anmeldung. Er lĂ€uft als StatefulSet mit einem
Volume, heiĂt dauerhaft
wave-connector-0und hinterlĂ€sst nicht mehr bei jedem Rollout ein weiteres GerĂ€t in der Wave, um das sich jemand kĂŒmmern muss.
đŹ Development v0.1.0-develop.13 (21.09.2026)
Das Kustomize-Setup ist einmal auf einem echten Cluster gelaufen â und das hat es verĂ€ndert.
Neue Funktionen
- Die Datenbank gehört zum Setup.
deployment/serverbringt Postgres mit, statt es als Zusatz anzubieten: ein Wave braucht eine Datenbank, und eine optionale hieĂ, dass jedes Overlay daran denken muss. Was ein einzelner Pod mit einem Volume nicht kann â Backup, Failover, Point-in-Time-Restore â, steht dort, wo er definiert ist; der Patch, der ihn fĂŒr einen verwalteten Dienst wieder herausnimmt, liegt im Prod-Overlay bereit. - Zugang zu den privaten Images. Jeder Pod nennt ein Image-Pull-Secret, und
jedes Overlay erzeugt es aus einer
dockerconfig.jsonneben seinerkustomization.yamlâ bisher konnte nur ziehen, wer die Images öffentlich hatte. - STUN ohne Load Balancer. Wo die Plattform kein UDP ĂŒber ihren Load
Balancer trĂ€gt â bei Hetzner etwa â, geht STUN im Prod-Overlay direkt ĂŒber
einen
hostPortauf den Knoten. Das ist sogar der bessere Weg: ohne kube-proxy im Pfad kann nichts die reflexive Adresse verfÀlschen. Der Preis steht daneben: der Pod ist damit an den Knoten gebunden, dessen Adresse die GerÀte kennen.
Fehlerbehebungen
- Der Relay startete in Kubernetes gar nicht. Ein Service namens
wave-relaylĂ€sst Kubernetes die alte Docker-Link-VariableWAVE_RELAY_PORT=tcp://âŠsetzen â und genau daraus liest der Relay seinen Port. Er endete mit âoptions.port ⊠Received NaN", bevor er lauschte. Diese Variablen sind jetzt in allen Pods abgeschaltet; gefunden wird hier alles ĂŒber DNS. - Das dokumentierte
kubectl execzum Anlegen eines Kontos brauchte-it.admin.ts set-passwordfragt das Passwort auf stdin ab; ohne Terminal bekam es eine leere Pipe und schob es auf die PasswortlÀnge.
đŹ Development v0.1.0-develop.12 (21.09.2026)
Ein Wave stellt jetzt Zertifikate auf seine GerĂ€tenamen aus, nimmt die Dienste eines Kubernetes-Clusters auf â und lĂ€sst sich selbst auf Kubernetes betreiben.
Neue Funktionen
- GĂŒltige Let's-Encrypt-Zertifikate auf GerĂ€tenamen.
wave certholt fĂŒr ein GerĂ€t ein Zertifikat auf seinen Namen im Wave; der Dienst erneuert es von da an unbeaufsichtigt, in dem Fenster, das die CA vorschlĂ€gt (ARI), sonst bei zwei Dritteln der Laufzeit.--hook 'systemctl reload caddy'sagt, was danach neu geladen werden soll,wave certszeigt, was das GerĂ€t hĂ€lt. - Der Control-Server schreibt in die Zone des Waves. Ein auf die Zone
beschrĂ€nkter API-Token â Cloudflare oder Hetzner â wird einmal je Wave
hinterlegt (
admin.ts set-dns-provider) und beim Hinterlegen sofort ausprobiert; genau dieser Schreibtest ist zugleich die Domain-Verifikation. Gespeichert wird der Token nur verschlĂŒsselt (WAVE_DNS_SECRET). - Oder von Hand, bei jedem Hoster (
set-dns-provider <wave> manual).wave certdruckt dann den TXT-Record, den es braucht, und wartet darauf; sobald er in der Zone steht, lĂ€uft die Ausstellung weiter. Nachgesehen wird bei den autoritativen Nameservern der Zone, damit ein Resolver, der die Abwesenheit des Records gecacht hat, nicht eine Stunde lang blockiert. Ctrl-C ist dabei ungefĂ€hrlich: derselbe Auftrag wird beim nĂ€chstenwave certweitergefĂŒhrt. - Ein Kubernetes-Cluster kann Dienste in den Wave stellen (D11). Ein
IngressmitingressClassName: wavebekommt einen Namen und eine eigene Adresse im Wave; erreichbar ist er dann genau ĂŒber den Wave und sonst nirgends. DafĂŒr gibt esapps/connector(hĂ€lt den Tunnel, leitet weiter) undapps/operator(liest die Ingresses) samt Manifesten indeployment/cluster/. Im Cluster gefahren wurde das noch nicht. - Kustomize-Setup fĂŒr den ganzen Stapel (
deployment/): Control-Server, Frontend und Relay indeployment/server, Connector und Operator indeployment/clusterâ zwei BĂ€ume, weil sie in verschiedenen Clustern laufen. Dazu veröffentlicht ein Release jetzt auch die Imageswebundconnector, nicht mehr nurcontrolundrelay. - Pre-Auth-Keys (
admin.ts auth-key <wave>,wave login --auth-key): Enrolment ohne Browser, fĂŒr Maschinen, an denen niemand sitzt. Einmalig, ablaufend und widerrufbar, auf Wunsch wiederverwendbar. - Ein Wave lĂ€sst sich löschen â vom EigentĂŒmer, und nur mit getipptem
Namen. Jeder andere Schnitt ist umkehrbar, dieser nicht: jedes GerÀt verliert
seine Anmeldung, die Adressen fallen zurĂŒck und die Domain wird wieder frei.
Auf der Shell heiĂt es
admin.ts delete-wave <wave>und nennt vorher, wie viele GerÀte und Mitglieder daran hÀngen.
Wichtig zu wissen
- Ein Dienst ist eine Adresse, kein Knoten. Er hat keine SchlĂŒssel und ist
kein WireGuard-Peer: seine Adresse steht in den
allowedIpsdes Connectors, und damit routet ihn jedes GerĂ€t, ohne etwas Neues zu lernen. - Der private SchlĂŒssel entsteht auf dem GerĂ€t und bleibt dort. Zum Server
geht nur der Zertifikatsantrag, zurĂŒck kommt die öffentliche Kette â und kein
GerÀt bekommt je ein DNS-Token, denn wer
_acme-challengeschreiben darf, darf die ganze Zone schreiben. - Ausgestellt wird auf den eigenen GerÀtenamen. Ein Wave unter dem
Platzhalter
.internalbekommt prinzipiell keines â dafĂŒr muss erst eine eigene Domain eingetragen sein. - Ein Wildcard braucht die Freigabe des Betreibers
(
admin.ts allow-wildcard <wave> <gerĂ€t>), dann holt ihnwave cert --wildcardsamt dem Namen der Zone selbst. Der Grund fĂŒr die Freigabe:*.wave.example.comgehört keinem GerĂ€t, sondern allen â wer den SchlĂŒssel hĂ€lt, kann jeder Name im Wave sein. Gedacht ist er fĂŒr eine Maschine mit mehreren Diensten; auf mehrere verteilt wĂ€re er das Gegenteil von dem, wofĂŒr der Rest gebaut ist. ZurĂŒcknehmen geht mitdeny-wildcard. - Von Hand heiĂt auch: Erneuerung von Hand. Der Dienst meldet dann, welcher Record fehlt, und versucht es spĂ€ter wieder â unbeaufsichtigt erneuert nur, wer einen Provider-Token hinterlegt hat.
- Vorgabe ist das Staging-Verzeichnis von Let's Encrypt. Auf die echte
Ausstellung schaltet
WAVE_ACME_DIRECTORYum; deren Rate Limits verbrennt ein Fehlversuch fĂŒr eine Woche. - Jeder ausgestellte Name landet dauerhaft in den öffentlichen CT-Logs. Deshalb wird nur auf Zuruf ausgestellt und nicht fĂŒr jedes GerĂ€t automatisch.
đŹ Development v0.1.0-develop.6 (17.09.2026)
Die Domain eines Waves gehört jetzt seinem EigentĂŒmer â sie wird beim Anlegen angegeben statt vergeben.
Neue Funktionen
- Beim Anlegen eines Waves wird nach Name und Domain gefragt. Der erste
Login legt kein Netz mehr ungefragt an: er fĂŒhrt auf ein Formular, und erst
das Absenden erzeugt den Wave. Vorbelegt ist
<name>.wave.internalâ wer keine eigene Domain hat, behĂ€lt das einfach und Ă€ndert nichts an seinem Vorgehen. - Eine eigene Domain benennt die GerĂ€te. TrĂ€gt man dort
wave.example.comein, heiĂt der Laptoplaptop.wave.example.com. Das ist der Schritt, ohne den es spĂ€ter kein öffentliches HTTPS-Zertifikat auf einen GerĂ€tenamen geben kann: fĂŒr die Platzhalter-Domain*.wave.internalist das grundsĂ€tzlich nicht möglich, weil sie niemandem gehört. Die Zertifikate selbst gibt es weiterhin nicht â nur die Voraussetzung dafĂŒr. - Die Domain lĂ€sst sich spĂ€ter wechseln, in der Wave-Karte der OberflĂ€che
fĂŒr EigentĂŒmer und Administratoren, auf der Shell des Servers mit
admin.ts set-domain <wave> <domain>. Verbundene GerĂ€te ĂŒbernehmen die neuen Namen mit der nĂ€chsten Netzkarte. Zu wissen ist dabei: der Wechsel benennt jedes GerĂ€t im Wave um. wave statusbleibt offen und zeichnet mit. Pfad, Laufzeit und das Alter des letzten Handshakes aktualisieren sich im Sekundentakt, bis Strg-C â diese Werte sagen erst etwas, wenn man sie sich bewegen sieht. FĂŒr Skripte und die einzelne Momentaufnahme gibt es weiterhinwave status --once, und am Rohr verhĂ€lt sich das Kommando unverĂ€ndert.
Fehlerbehebungen
- Es entsteht kein Wave mehr, den niemand bestellt hat. Weil die Anmeldung selbst keinen anlegt, kann auch keiner nebenbei entstehen â etwa wenn man sich anmeldet, bevor man eine Einladung in ein fremdes Netz öffnet. Vorher entschied die Reihenfolge zweier Klicks, ob man hinterher einen Wave zu viel hatte.
- Eine schon belegte Domain wird benannt, nicht mit einem Serverfehler quittiert. Zwei Waves können nicht dieselbe Zone beantworten; der Versuch scheiterte bisher unverstÀndlich, jetzt sagt die Seite, was los ist.
- Das erste GerÀt eines frischen Kontos lÀuft nicht mehr ins Leere.
wave loginfĂŒhrt durch Anmeldung, Wave-Formular und GerĂ€tefreigabe hindurch; vorher endete die Freigabe mit einer Fehlermeldung, weil es noch kein Netz gab, in das das GerĂ€t gehört hĂ€tte.
đŹ Development v0.1.0-develop.5 (17.09.2026)
Neue Funktionen
- Ein einzelnes GerÀt lÀsst sich entfernen, ohne das Mitglied mit
hinauszuwerfen â fĂŒr die Maschine, die verloren, verkauft oder irgendwo
stehen geblieben ist, also gerade die, auf der
wave logoutniemand mehr ausfĂŒhren kann. In der GerĂ€teliste steht dafĂŒr ein Knopf, sichtbar fĂŒr EigentĂŒmer und Admins; auf der Shell des Servers gibt esadmin.ts devices <wave>undadmin.ts remove-device <wave> <name|id>. Das entfernte GerĂ€t wird dabei getrennt, nicht bloĂ vergessen.
Fehlerbehebungen
- Die Verbindung zu einem Peer wechselt nicht mehr stĂ€ndig zwischen direkt und Relay. Ăber WLAN schwankt die gemessene Laufzeit desselben Pfades leicht zwischen 14 und 110 ms; entschieden wurde bisher auf der letzten Messung, und damit wechselte der Pfad bei fast jeder Sondierung. Jetzt zĂ€hlt ein gleitender Mittelwert, und der Pfad, der den Verkehr schon trĂ€gt, gibt ihn nur an einen deutlich besseren ab. Von einem Pfad, der nicht mehr antwortet, fĂ€llt der Verkehr weiterhin sofort herunter.
đŹ Development v0.1.0-develop.4 (17.09.2026)
Behebt, dass wave login den Freigabe-Link nicht mehr anzeigte.
Fehlerbehebungen
wave loginzeigt den Freigabe-Link wieder an. Lief ein Dienst, gab das Kommando gar nichts aus und wartete bis zu 15 Minuten stumm â ausgerechnet auf das Ăffnen des Links, den es hĂ€tte anzeigen sollen. Unter Windows fiel das ab v0.1.0-develop.3 auf, weil es dort erstmals einen laufenden Dienst gibt; unter Linux und macOS betraf es jeden, der den Dienst installiert hatte.wave upsagt jetzt, wenn es etwas ablehnt. Wurde ein Wave nicht eindeutig benannt oder war die Adresse keine, entschied der Dienst das fĂŒr sich und die Ausgabe schwieg dazu.
đŹ Development v0.1.0-develop.3 (17.09.2026)
Macht den Windows-Client einrichtbar â bisher lieĂ er sich ĂŒberhaupt nicht in Betrieb nehmen â und legt jedem Archiv bei, was der Tunnel braucht.
Nichts mehr nachinstallieren
- wireguard-go liegt jetzt in jedem Archiv bei, fĂŒr Linux, macOS und
Windows in der jeweils passenden Architektur; unter Windows zusÀtzlich
wintun.dll.wave installlegt beides neben das Binary â der Dienst lĂ€uft als root beziehungsweise LocalSystem und findet nichts, was nur im PATH des Benutzers steht. Dasgo install golang.zx2c4.com/wireguard@latestaus der Einrichtung entfĂ€llt damit. - Fehlt eine der beiden Dateien, sagt
wave installes und endet mit einem Fehler, statt eine Einrichtung zu melden, aus der kein Tunnel werden kann.
Windows
- Der Client lÀsst sich einrichten und trÀgt einen Tunnel. Bisher scheiterte
wave loginmit âDiese Sicherheitskennung kann nicht als Besitzer des Objekts zugeordnet werden", undwave installlegte einen Dienst an, der nie startete. Beides hatte dieselbe Ursache: der Tunnel muss als LocalSystem laufen, und ein Prompt âals Administrator" genĂŒgt dafĂŒr nicht. - Eingerichtet wird jetzt eine geplante Aufgabe statt eines Dienstes. Sie
lÀuft als LocalSystem beim Systemstart und kommt nach einem Absturz von selbst
wieder. Nachsehen lÀsst sie sich mit
schtasks /query /tn "wave daemon", nicht inservices.msc. Beim Beenden werden die Waves erst ordentlich abgebaut, damit keine DNS-Regeln in der Registry zurĂŒckbleiben. wave installsagt jetzt, wenn etwas schiefgegangen ist. Zuvor meldete es âinstalled and running" und endete erfolgreich, auch wenn jeder einzelne Schritt gescheitert war â und die Fehlermeldungen der Windows-Werkzeuge kamen als nackte Zahlen heraus.
Was weiterhin fehlt
Die Liste aus v0.1.0-develop.1 gilt unverÀndert, bis auf den ersten Punkt:
wireguard-go und wintun.dll liegen jetzt bei. Der Windows-Client ist
weiterhin nie auf echter Hardware gelaufen â auch das hier Beschriebene ist
geprĂŒft, soweit sich das ohne Windows-Maschine prĂŒfen lĂ€sst.
đŹ Development v0.1.0-develop.1 (17.09.2026)
Die erste Version ĂŒberhaupt. Sie ist zum Ausprobieren gedacht, nicht fĂŒr den Dauerbetrieb â siehe âWas noch fehlt" am Ende dieses Abschnitts.
Das Netz
- GerĂ€te finden sich selbst und verbinden sich direkt. Jedes GerĂ€t meldet sich bei einem Control-Server an und bekommt eine signierte Netzkarte; den Tunnel bauen die GerĂ€te danach untereinander auf, ohne dass Verkehr ĂŒber den Server lĂ€uft.
- Auch hinter NAT, ohne Portfreigabe. Zwei GerÀte hinter getrennten Routern stanzen sich gegenseitig einen Weg; keine Konfiguration am Router nötig.
- Relay als RĂŒckfallebene. Wo ein direkter Weg unmöglich ist â etwa hinter symmetrischem NAT â lĂ€uft die Verbindung ĂŒber ein Relay, verschlĂŒsselt wie jede andere. Taucht spĂ€ter doch ein direkter Weg auf, wird ohne Abriss umgeschaltet.
- Namen statt Adressen.
ping laptopfindet das GerĂ€t im eigenen Wave. RĂŒckwĂ€rtsauflösung inklusive, damit nichts mehr auf Namensabfragen wartet, die niemand beantwortet. Nur die Namen des Waves werden umgeleitet, die ĂŒbrige Namensauflösung des Rechners bleibt unangetastet.
Anmelden und verwalten
- Anmeldung im Browser, per Passwort oder ĂŒber einen OIDC-Anbieter.
- Mehrere Menschen in einem Wave. Rollen (EigentĂŒmer, Admin, Mitglied), Einladungen per einmaligem Link, und das Entfernen eines Mitglieds nimmt dessen GerĂ€te mit.
- WeboberflĂ€che fĂŒr GerĂ€te, Waves, Mitglieder und Einladungen.
- Ein GerĂ€t kann in mehreren Waves gleichzeitig sein â etwa einem privaten und einem beruflichen, auf verschiedenen Servern, mit getrennten SchlĂŒsseln.
Auf dem eigenen Rechner
- Ein einziges Binary fĂŒr alles:
wave up,wave status,wave login,wave profiles, dazu Dienst und Tray-Icon.wave installrichtet die Maschine ein, beigetreten wird danach mitwave login <server-url>. - Tray-Icon unter Linux und macOS, mit einem Fenster, in dem sich jeder Wave einzeln schalten lÀsst.
- Windows ist neu dazugekommen: Tunnel, Adressen, Routen, Split-DNS, Windows-Dienst und Tray-Icon.
- Fertige Binaries hĂ€ngen an diesem Release â Linux, macOS und Windows, jeweils fĂŒr amd64 und arm64, mit PrĂŒfsummen.
- Server als Container-Images fĂŒr Control und Relay, fĂŒr amd64 und arm64.
Was noch fehlt
- wireguard-go wird nicht mitgeliefert und muss vorhanden sein
(
go install golang.zx2c4.com/wireguard@latestoder das Paket der Distribution). Unter Windows zusĂ€tzlichwintun.dll. - Der Windows-Client ist nie auf echter Hardware gelaufen. Er ist gebaut und geprĂŒft, soweit sich das ohne Windows-Maschine prĂŒfen lĂ€sst â mehr nicht. Unter Windows fehlt auĂerdem das Fenster hinter dem Tray-Icon; dort trĂ€gt das MenĂŒ alles.
- Keine Zugriffsregeln. Alle GerÀte aller Mitglieder eines Waves sehen sich gegenseitig.
- Keine Zertifikate und keine automatische Domain-Einrichtung. Namen funktionieren im Wave, öffentliche Zertifikate dafĂŒr gibt es noch nicht.
- Keine Clients fĂŒr iOS und Android. Wie sie gebaut wĂŒrden, ist entschieden und dokumentiert, gebaut sind sie nicht.
Release-Prozess
Features durchlaufen die Phasen sequentiell, bevor sie alle Nutzer erreichen:
đŹ Development â đ§Ș Insiders â â
Stable
(Vorabbau) (Early Adopter) (Alle Nutzer)
| Phase | Zielgruppe | Beschreibung |
|---|---|---|
| đŹ Development | Entwickler | Vorabbau zum Ausprobieren. Kann kaputt sein. |
| đ§Ș Insiders | Early Adopter | Vorschau-Version zum Testen vor dem Stable-Release. |
| â Stable | Alle Nutzer | Produktionsreife Version. |
Hinweis: Jeder Abschnitt listet nur die Ănderungen, die neu in dieser Phase sind.