Skip to content

v0.9.0 — NexusCanvas : Table Collaborative P2P

Choose a tag to compare

@Pokled Pokled released this 04 Mar 01:50
· 1686 commits to main since this release

Nexus v0.9.0 — La Stack Rust Complète

Trois mois de travail. Une stack P2P Rust entièrement maison. Et un tableau blanc collaboratif par-dessus.


🦀 nexus-relay — Rust P2P Relay (Phase 3.0-A)

Un serveur relay Rust qui permet à n'importe qui d'héberger Nexus depuis chez soi, sans ouvrir un seul port.

Avant : impossible d'héberger Nexus derrière une box FAI (CGNAT, NAT strict, pas de port-forwarding).
Après : un binaire Rust de 9MB, un tunnel TCP persistant, et votre instance tourne depuis un Raspberry Pi sous le bureau.

nexus-relay server  → écoute TCP:7443 + HTTP:7001
nexus-relay client  → tunnel TCP vers le serveur, expose le port 80 local
  • Tokio async runtime, gestion concurrente des requêtes par task
  • Reconnexion automatique avec backoff exponentiel (1s → 30s max)
  • Authentification par token JWT d'instance
  • Routing par slug : monio.nexusnode.app → proxy vers le Pi derrière la box
  • Binary amd64 + arm64, service systemd inclus
  • Validé en conditions réelles : Raspberry Pi 4, aucun port ouvert, aucun domaine ✅

🔁 WebRTC DataChannels P2P (Phase 3.0-B)

Messages directs peer-to-peer, sans passer par le serveur, même sur les messages ordinaires.

  • Indicateurs de frappe instantanés (< 5ms latence locale vs 80-200ms via serveur)
  • Réactions emoji optimistes (affichage immédiat, confirmation serveur en arrière-plan)
  • Transfert d'assets P2P (images, fichiers partagés directement entre pairs)
  • Fallback gracieux sur Socket.IO si DataChannel indisponible (NAT strict, etc.)
  • Architecture mesh : chaque pair maintient un DataChannel ouvert avec tous les autres

🔐 nexus-turn — STUN/TURN Rust Natif (Phase 3.0-C)

Remplacement complet de coturn par une implémentation Rust maison.

coturn est un serveur C mature avec 15 ans d'histoire, des milliers de lignes de configuration, une surface d'attaque non triviale.
nexus-turn est un binaire Rust de 2.9MB qui fait exactement ce dont Nexus a besoin — rien de plus.

Protocole STUN/TURN (RFC 5389 + RFC 5766)
Credentials HMAC-SHA1 time-based (username={expires}:{userId})
UDP:3478 — tokio async, zero-copy où possible
  • Allocation TURN avec quotas et rate limiting
  • Ban map pour les clients abusifs
  • Validation stricte des credentials (timestamp d'expiration, HMAC-SHA1)
  • Binary amd64 + arm64, service systemd, config via env vars
  • Testé : STUN Binding Request → 0x0101 Binding Success ✅
  • Zéro dépendance coturn sur le VPS de production

🎨 NexusCanvas — Table Collaborative P2P (Canvas v1.0)

Un tableau blanc collaboratif, embarqué dans les salons vocaux, synchronisé en P2P.

  • CRDT Last-Write-Wins par élément (UUID + timestamp) — implémentation maison ~100 lignes TypeScript
  • Dessin, post-its, formes, effaceur — synchronisés via DataChannels existants
  • Curseurs distants temps réel avec halo vocal (pulse violet quand le pair parle)
  • Export PNG natif (browser API, zéro serveur) + résumé dans le salon chat
  • Session éphémère par défaut — aucune donnée ne touche le serveur

📊 Ce que représente v0.9.0

Composant Technologie Lignes de code
nexus-relay Rust + Tokio ~2 000
nexus-turn Rust + Tokio ~1 500
P2P DataChannels TypeScript + WebRTC ~400
NexusCanvas Svelte 5 + Canvas API ~978

4 composants. ~5 000 lignes. Zéro service tiers.


🏗 Infrastructure v0.9.0

[Browser A] ──DataChannel──── [Browser B]
     │                              │
     └──── nexus-relay (Rust) ─────┘  ← home servers sans port ouvert
     │                              │
     └──── nexus-turn  (Rust) ─────┘  ← STUN/TURN pour NAT traversal
     │                              │
     └──── nexus-core  (Fastify) ──┘  ← signaling WebRTC + Socket.IO

Pile complète 100% maison. Aucune dépendance à AWS, GCP, Twilio, Agora ou autre.


🔖 Releases P2P associées

  • v0.1.2-p2p — nexus-relay + nexus-turn (binaires amd64/arm64)

Nexus v0.9.0. La plateforme communautaire décentralisée qui tourne entièrement sur du code qu'on a écrit.