mirror of https://github.com/jetkvm/kvm.git
5.1 KiB
5.1 KiB
JetKVM Copilot Instructions
Architecture Overview
JetKVM is a high-performance KVM-over-IP solution with bidirectional architecture: a Go backend running on ARM hardware and a React/TypeScript frontend served by the device. The system provides real-time video streaming, HID input, virtual media mounting, and 2-way audio support via WebRTC.
Core Components
- Backend: Go application (
main.go,web.go,webrtc.go) handling WebRTC, HTTP APIs, hardware interfaces - Frontend: React/TypeScript SPA (
ui/src/) with Vite build system, served as embedded static files - Hardware Layer: CGO bridge (
internal/native/) to ARM SoC for video capture, USB gadget, display control - Audio System: In-process CGO implementation (
internal/audio/) with ALSA/Opus for USB Audio Gadget streaming - USB Gadget: Configurable emulation (
internal/usbgadget/) - keyboard, mouse, mass storage, audio device
Development Workflows
Quick Development Commands
# Full development deployment (most common)
./dev_deploy.sh -r <DEVICE_IP>
# UI-only changes (faster iteration)
cd ui && ./dev_device.sh <DEVICE_IP>
# Backend-only changes (skip UI build)
./dev_deploy.sh -r <DEVICE_IP> --skip-ui-build
# Build for release
make build_release
Critical Build Dependencies
- Audio libraries:
make build_audio_depsbuilds ALSA and Opus static libs for ARM - Native CGO:
make build_nativecompiles hardware interface layer - Cross-compilation: ARM7 with buildkit toolchain at
/opt/jetkvm-native-buildkit
Testing
# Run Go tests on device
./dev_deploy.sh -r <DEVICE_IP> --run-go-tests
# UI linting
cd ui && npm run lint
Project-Specific Patterns
Configuration Management
- Single config file:
/userdata/kvm_config.jsonpersisted across updates - Config struct:
config.gowith JSON tags, atomic operations for thread safety - Migration pattern: Use
ensureConfigLoaded()before config access
WebRTC Architecture
- Session management:
webrtc.gohandles peer connections with connection pooling - Media tracks: Separate video and stereo audio tracks in independent MediaStreams
- Data channels: RPC (ordered), HID (unordered), upload, terminal, serial channels
- SDP munging: Frontend modifies SDP for Opus stereo parameters (
OPUS_STEREO_PARAMS)
Audio Implementation Details
- USB Audio Gadget: UAC1 device presenting as stereo speakers + microphone
- Bidirectional streaming: Output (device→browser) and input (browser→device)
- CGO integration:
internal/audio/cgo_source.gobridges Go↔C for ALSA operations - Frame-based processing: 20ms Opus frames (960 samples @ 48kHz) for low latency
Frontend State Management
- Zustand stores:
hooks/stores.ts- RTC, UI, Settings, Video state with persistence - JSON-RPC communication:
useJsonRpchook for backend API calls - Localization: Paraglide.js with compile-time validation - all UI strings use
m.key()pattern
USB Gadget Configuration
- Configfs-based: Dynamic reconfiguration via
/sys/kernel/config/usb_gadget/ - Transaction pattern:
WithTransaction()ensures atomic gadget changes - Device composition: Keyboard + mouse + mass storage + audio with individual toggle support
Integration Patterns
Backend API Structure
- JSON-RPC over WebSocket: Primary communication via data channels
- HTTP endpoints:
/api/*for REST operations,/static/*for UI assets - Configuration endpoints:
rpc*functions injsonrpc.gowith parameter validation
Cross-Component Communication
- Video pipeline:
native.go→ WebRTC track → browser via H.264 streaming - HID input: Browser → WebRTC data channel →
internal/usbgadget/hid_*.go→ Linux gadget - Audio pipeline: ALSA capture → Opus encode → WebRTC → browser speakers (and reverse for mic)
- Virtual media: HTTP upload → storage → NBD server → USB mass storage gadget
Error Handling Patterns
- Graceful degradation: Audio/video failures don't crash core functionality
- Session isolation: Per-connection logging with
connectionIDcontext - Recovery mechanisms: USB gadget timeouts, audio restart on device changes
Key Files for Common Tasks
Adding new RPC endpoints
- Add handler function in
jsonrpc.go - Register in
rpcHandlersmap - Add frontend hook in
useJsonRpc
USB device modifications
internal/usbgadget/config.go- gadget composition and attributesinternal/usbgadget/hid_*.go- HID device implementations
Audio feature development
audio.go- high-level audio management and session integrationinternal/audio/- CGO sources, relays, and C audio processing
Frontend feature development
ui/src/routes/- page componentsui/src/components/- reusable UI componentsui/localization/messages/en.json- localizable strings
This codebase uses advanced patterns like CGO, USB gadgets, and real-time media streaming. Focus on understanding the session lifecycle and cross-compilation requirements for effective development.