Self-hosted SSH + SFTP + RDP in a browser — MobaXterm replacement
Three bugs fixed: 1. TCP stream fragmentation — guacd→browser data pipe treated each TCP chunk as a complete instruction. TCP is a stream protocol; instructions WILL be split across chunks (especially display/image data). Added instruction buffer that accumulates data and only forwards complete instructions (terminated by ';'). 2. Missing client.onerror — when guacd fails the RDP connection (NLA, auth, TLS), it sends a Guacamole error instruction. No handler was registered, so errors were silently swallowed. User saw blank canvas with no feedback. Now surfaces errors via console and gateway callback. 3. Missing client.onstatechange — no connection state tracking. Added state transition logging for diagnostics. Also improved CONNECT handshake logging to surface connection parameters (host, port, user, domain, security mode) without exposing passwords. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| backend | ||
| docs/superpowers | ||
| frontend | ||
| images | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| Remote-Spec.md | ||
Wraith
Self-hosted MobaXterm replacement — SSH + SFTP + RDP in a browser.
Stack
- Backend: NestJS 10, Prisma 6, PostgreSQL 16, ssh2, guacd
- Frontend: Nuxt 3 (SPA), PrimeVue 4, Tailwind CSS, xterm.js 5
Quick Start
cp .env.example .env
# Edit .env with real secrets
docker compose up -d
Default credentials: admin@wraith.local / wraith
Development
# Backend
cd backend && npm install && npm run dev
# Frontend
cd frontend && npm install && npm run dev