Self-hosted SSH + SFTP + RDP in a browser — MobaXterm replacement
Go to file
Vantz Stockwell 9e30e5915f fix: SFTP sidebar empty on load — list sent before WebSocket open
The list('/') call fired immediately after connect(), but the
WebSocket was still in CONNECTING state so send() silently dropped
the message. Now buffers the initial list request and sends it
in the onopen callback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 01:56:59 -04:00
backend fix: seed script checks for any existing user, not just admin@wraith.local 2026-03-14 01:48:19 -04:00
docs/superpowers fix: plan — async host key verification via ssh2 verify callback 2026-03-12 17:02:20 -04:00
frontend fix: SFTP sidebar empty on load — list sent before WebSocket open 2026-03-14 01:56:59 -04:00
images feat: convert Settings to right sidebar panel, remove light mode 2026-03-13 10:25:24 -04:00
.env.example feat: project scaffold — Docker, NestJS, Nuxt 3, Prisma config 2026-03-12 17:05:37 -04:00
.gitignore fix: inline modals in index.vue, proper DTO for profile update 2026-03-13 09:09:05 -04:00
docker-compose.yml chore: expose postgres on port 4211 for external access 2026-03-14 00:55:35 -04:00
Dockerfile fix: correct dist path (dist/src/main.js), static path, explicit schema for migrate 2026-03-13 08:23:52 -04:00
README.md feat: project scaffold — Docker, NestJS, Nuxt 3, Prisma config 2026-03-12 17:05:37 -04:00
Remote-Spec.md docs: Wraith spec + implementation plan 2026-03-12 16:59:34 -04:00

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