# Butterfly Desktop Environment — Progress ## Overview A remote desktop environment with a Rust (Actix) backend and Angular 21 frontend. The system mimics a traditional Windows-like desktop in the browser, receiving display/audio from VM agents with minimal lag. ## Architecture ``` ┌─────────────┐ WebSocket ┌──────────────────┐ WebSocket ┌─────────────┐ │ Angular 21 │◄──────────────────►│ Rust Actix Server│◄──────────────────►│ VM Agent exe │ │ (Browser) │ display/audio │ (REST + WS) │ display/audio │ (Rust) │ │ │ HUD commands │ │ HUD commands │ │ └─────────────┘ └──────────────────┘ └─────────────┘ ``` ## Checklist ### Phase 1: Rust Backend ✅ (builds & runs) - [x] `server/Cargo.toml` — Dependencies: actix-web 4, actix-ws 0.4, actix-cors, dashmap, parking_lot, serde, uuid, chrono - [x] `server/src/main.rs` — Actix HTTP server with CORS, compression, static file serving, SPA fallback - [x] `server/src/config.rs` — Env-based config (BUTTERFLY_HOST, BUTTERFLY_PORT, etc.) - [x] `server/src/models.rs` — Session, AgentConnection, WsMessage enum (serde-tagged), ApiResponse, HealthInfo - [x] `server/src/state.rs` — AppState with DashMap sessions/agents, FrameBuffer ring buffer for late-joiners - [x] `server/src/api/` — REST endpoints: GET/POST/DELETE /api/sessions, GET /api/health, POST /api/sessions/{id}/hud - [x] `server/src/ws/` — WebSocket handler: agent/viewer connect, display/audio frame relay, HUD forwarding, heartbeat timeout - [x] `server/src/stream/` — StreamStats tracker (frame count, byte relay, uptime) - [x] `server/static/index.html` — Placeholder loading page - [x] `cargo build` succeeds, `cargo check` clean (only dead_code warnings for future-use types) ### Phase 2: Angular 21 Frontend ✅ (builds & serves) - [x] Project scaffold with Angular CLI 21 - [x] Windows-like desktop shell (taskbar, start menu, window manager) - [x] Remote display component (WebSocket canvas frame rendering, FPS counter) - [x] HUD overlay (mouse click/move/wheel, keyboard down/up forwarding) - [x] Window Manager service (open, close, focus, minimize, maximize, drag, resize) - [x] WebSocket service (typed message streams, heartbeat, auto-reconnect) - [x] API service (health, sessions CRUD, HUD command forwarding) - [x] Built-in apps: File Explorer, Terminal, Text Editor, Settings, Web Browser - [x] Session picker dialog (create/connect to remote sessions) - [x] Production build: 328KB total (85KB gzipped), output to `dist/browser/` - [x] Dark theme with animated gradient desktop background ### Phase 3: VM Agent Executable 🔲 (next) - [ ] Rust desktop agent that captures display and audio - [ ] Streams display frames (JPEG/PNG) and audio (Opus/PCM) via WebSocket - [ ] Receives HUD commands (mouse, keyboard, resize) - [ ] Low-latency design for LAN usage ### Phase 4: Integration & Polish 🔲 - [ ] End-to-end testing (agent → server → browser) - [ ] Session management UI - [ ] Multi-session support - [ ] Authentication (JWT) - [ ] Performance optimization ## Recent Commits - `dcfaceb` desktop: production build works (328KB, 85KB gzip) - `f4b7e25` desktop: fix build errors (FormsModule, nativeWindow, provideHttpClient) - `8a9429c` desktop: components/desktop — main shell - `eea8197` desktop: components/apps/browser - `6beb93b` desktop: components/apps/settings - `0048eab` desktop: components/apps/file-explorer - `283e53d` desktop: components/apps/text-editor - `7496fbe` desktop: components/apps/terminal - `6b4c641` desktop: components/remote-display - `8ad129e` desktop: components/start-menu - `490317b` desktop: components/taskbar - `b5e23e1` desktop: components/window - `9d8aaa5` desktop: services/window-manager.service - `4041625` desktop: services/api.service - `710560d` desktop: services/websocket.service - `7991237` desktop: app root component - `2b05373` desktop: scaffold Angular 21 project - `bae17ae` server: fix pong bytes — backend compiles