- Rust 71.8%
- Slint 22.1%
- Shell 4.4%
- Python 0.9%
- PowerShell 0.8%
- StrokeLayer's Path used the default `fit: contain`, so the square viewbox was scaled uniformly and centred: strokes were squeezed toward the middle on the longer axis (window and whole-screen shares, viewer and macOS overlay alike). Now `fit: fill`. - When a shared window is resized, visible strokes stay put relative to its top-left corner: the sharer sends the frame size (DrawMsg::Resize; 0.5.1 peers ignore it) and both sides rescale their strokes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .cargo | ||
| apps/desktop | ||
| crates | ||
| deploy/server | ||
| packaging | ||
| server/signal | ||
| spikes/m0-webrtc | ||
| vendor | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
MyRemoteCall
Audio-Anrufe übers Internet zwischen gekoppelten Geräten – mit Bildschirmfreigabe, die jede Seite im laufenden Gespräch an- und ausschalten kann. Native Desktop-App für macOS, Linux und Windows (Rust + Slint, Medien über Googles libwebrtc), dazu ein kleiner Signaling-Server, den du selbst betreibst.
Funktionen
- Anrufe per Kontakt (nach einmaliger Kopplung) oder als Gast per Raum-Code
- Ende-zu-Ende verifiziert: jedes Gerät hat ein Ed25519-Schlüsselpaar; Kopplung per Code plus Sicherheitsnummer; die SDP wird signiert und pinnt den DTLS-Fingerprint
- Bildschirmfreigabe an/aus auf beiden Seiten, ohne Neustart des Gesprächs
- Zeichnen auf dem geteilten Bildschirm: der Betrachter darf – wenn erlaubt – Linien zeichnen, die nach einstellbarer Zeit verblassen (macOS/Windows, ganzer Bildschirm)
- Toolbar beim Teilen (Teilen beenden, Zeichnen an/aus), für die Gegenseite unsichtbar
- Klang: Mikrofon-Automatik (AGC), Voice Mode (Rauschunterdrückung), Kompressor mit Maximalpegel für die Wiedergabe, Pegelanzeigen, Stummschalten
- Klingelton für eingehende Anrufe (mehrere Töne, Lautstärke einstellbar)
- Geräteauswahl, Verbindungsqualität (direkt/Relay, Verlust, Bitrate)
Peer-to-Peer über ICE; wo das nicht geht, über TURN (coturn). Audio, Bild und Zeichnungen gehen direkt und verschlüsselt (DTLS-SRTP) zwischen den Geräten, nie über den Signaling-Server.
Aufbau
crates/signal-proto/ JSON-Protokoll App <-> Server, Geräte-Identität (Ed25519)
crates/rtc-core/ Call-Engine: Signaling-Client, PeerConnection, Audio, Bildschirm, Zeichnen
apps/desktop/ Slint-App (Binary `myremotecall`)
server/signal/ Signaling-Server (axum, Binary `signal-server`)
deploy/server/ Vorlagen: systemd-Unit, nginx-Site, coturn-Konfiguration, certbot-Hook
packaging/ macOS .app, Debian .deb, Arch PKGBUILD, Windows-Zip, Icon
vendor/ gepatchte Abhängigkeiten (siehe unten)
spikes/m0-webrtc/ erster Machbarkeitstest
Server-Adresse
Weder Quellcode noch Binärdateien enthalten einen Server. Die App nimmt die Adresse aus
Einstellungen → Server (z. B. call.example.com); zum Testen überschreibt die
Umgebungsvariable MRC_SERVER sie. Ohne Adresse startet die App offline und weist darauf
hin. call.example.com wird zu wss://call.example.com/ws; volle URLs (wss://…, ws://…)
gehen auch.
Bauen
Voraussetzung überall: Rust (rustup, stable). libwebrtc wird beim Bauen als fertige Bibliothek heruntergeladen.
cargo run -p myremotecall
| System | Paket | Befehl |
|---|---|---|
| macOS (arm64) | .app + Zip, signiert (Developer ID, optional notarisiert) |
packaging/macos/build-app.sh |
| Debian/Ubuntu | .deb |
packaging/linux/build-deb.sh |
| Arch Linux | Paket | cd packaging/linux && makepkg -si |
| Windows | portables Zip | packaging\windows\build-zip.ps1 |
Die Skripte lesen optional private/build.env (Zeilen KEY=value, nicht versioniert), z. B.
MRC_MAINTAINER, MRC_SIGN_ID, MRC_NOTARY_PROFILE. Details und
Abhängigkeiten stehen jeweils im Kopf des Skripts.
- Linux:
build-deb.shbaut gegen das System oder – für ältere glibc – gegen einen Debian-Sysroot (make-sysroot.sh,cross-env.sh, auch für x86_64 von arm64 aus). Bildschirmfreigabe läuft über PipeWire und das xdg-desktop-portal des Desktops. - Windows: Visual Studio 2022 Build Tools mit C++ und „C++ Clang tools“; x64 lässt sich
mit
-Target x86_64-pc-windows-msvcauch auf ARM64 bauen.
Eigener Server
Ein kleiner Linux-Server mit öffentlicher Adresse reicht. Er braucht:
- Signaling-Server (
cargo build --release -p signal-server, für arm64 statisch:--target aarch64-unknown-linux-musl), als systemd-Dienst auf127.0.0.1:8890. Umgebung:TURN_HOST(öffentlicher Hostname),TURN_SECRET(gemeinsam mit coturn), optionalSIGNAL_BIND,TURN_TTL. - nginx mit TLS (certbot) als WSS-Proxy für
/ws. - coturn mit
use-auth-secret(STUN/TURN 3478 UDP/TCP, TURNS 5349, Relay-Ports 49160–49250 UDP – in der Firewall freigeben).
Vorlagen dafür liegen in deploy/server/; call.example.com und die Beispiel-IPs ersetzen,
@TURN_SECRET@ mit einem zufälligen Geheimnis füllen (dasselbe in
/etc/myremotecall/signal.env als TURN_SECRET=…).
Releases
packaging/forgejo-release.sh <version> <ordner> legt auf Forgejo/Gitea ein Release mit allen
Paketen aus dem Ordner an und behält nur die neuesten drei. Vorher entpackt es jedes Paket und
bricht ab, wenn darin eine der Zeichenketten aus MRC_FORBIDDEN steht (z. B. die eigene
Server-Adresse). Einstellungen im Kopf des Skripts.
Entwicklung
Umgebungsvariablen und Test-Hooks (unbeaufsichtigte Läufe, z. B. MRC_DATA_DIR,
MRC_AUTOJOIN, MRC_TEST_OVERLAY) sind am Anfang von apps/desktop/src/main.rs beschrieben.
cargo test
Lizenz
MIT, siehe LICENSE.
Abhängigkeiten haben eigene Lizenzen. Insbesondere Slint steht unter GPLv3, einer
lizenzfreien Royalty-free-Lizenz (mit Namensnennung) oder einer kommerziellen Lizenz – wer
Binärdateien weitergibt, muss eine davon erfüllen. In vendor/ liegen mit kleinen Änderungen
(markiert mit „MyRemoteCall“) die Crates libwebrtc und webrtc-sys von LiveKit
(Apache-2.0) sowie zip 0.6.6 (MIT), das auf crates.io zurückgezogen wurde.