A virtual space where distance disappears — spatial audio and shared canvas for gatherings of any kind.
Features
- 🎙️ Spatial audio — volume and panning change with distance between avatars
- 🖥️ Screen sharing — drag, resize, and position streams on the canvas
- 📝 Collaborative notes — real-time markdown editing with live sync
- 🔄 Conflict-free sync — powered by Yjs CRDTs
- 📦 One-command deploy —
nix run github:srid/openspatial
Quick Start
Run instantly with Nix:
# Set environment variable HTTPS=0 to disable https.
nix run github:srid/openspatialOpen https://<your-ip>:<port> and accept the self-signed certificate.
We also provide a NixOS module. See Deployment.
Or develop locally:
npm install npm run dev # Development server npm run build # Type check + production build npm run typecheck # Type check only
Open https://localhost:5173 and accept the self-signed certificate.
Architecture
See ARCHITECTURE.md for the full technical architecture including state sync, CRDT schema, and component design.
Quick overview:
- Frontend: SolidJS with centralized SpaceContext
- Sync: Socket.io for signaling + Yjs CRDT for state
- Media: WebRTC peer-to-peer mesh with spatial audio
Deployment
For production deployment to Hetzner Cloud with NixOS, TURN server, and Let's Encrypt SSL, see deploy/README.md.
Configuration
Slack notifications — get live presence alerts in Slack when spaces become active. See docs/slack-notifications.md for setup.
NixOS module — deploy as a systemd service with nginx and optional TURN relay:
services.openspatial = { enable = true; domain = "spatial.example.com"; };
