AI Generated Remote Call App with private Endpoint for Communication Init
  • Rust 71.8%
  • Slint 22.1%
  • Shell 4.4%
  • Python 0.9%
  • PowerShell 0.8%
Find a file
ohauser c1ce8b76e9 Release 0.5.2: strokes land where they are drawn
- 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>
2026-10-17 22:55:52 +02:00
.cargo Release 0.5.1: share a single window, no server address in binaries 2026-10-17 22:07:30 +02:00
apps/desktop Release 0.5.2: strokes land where they are drawn 2026-10-17 22:55:52 +02:00
crates Release 0.5.2: strokes land where they are drawn 2026-10-17 22:55:52 +02:00
deploy/server MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
packaging Release 0.5.2: strokes land where they are drawn 2026-10-17 22:55:52 +02:00
server/signal MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
spikes/m0-webrtc MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
vendor MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
.gitignore MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
Cargo.lock Release 0.5.2: strokes land where they are drawn 2026-10-17 22:55:52 +02:00
Cargo.toml MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
LICENSE MyRemoteCall 0.5.0 2026-10-17 21:16:35 +02:00
README.md Release 0.5.1: share a single window, no server address in binaries 2026-10-17 22:07:30 +02:00

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.sh baut 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-msvc auch 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 auf 127.0.0.1:8890. Umgebung: TURN_HOST (öffentlicher Hostname), TURN_SECRET (gemeinsam mit coturn), optional SIGNAL_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.