ВиртМашУправ ВиртМашУправVPS Manager
Expo / React Native + NestJS

Manage virtual machines
and servers right from your phone

A cross-platform app for creating and managing VirtualBox VMs and external SSH servers: SFTP file transfer, app installation, scripts, monitoring — all with SSH passwords encrypted on-device before they ever reach the server.

Virtual machine control panel in the app
1

Features

The full infrastructure-management cycle from a single app — from creating a virtual machine to streaming output from custom scripts.

VirtualBox VM
Create, start, stop and delete virtual machines (Linux/Windows) right from your phone, including cloning from golden VDI images.
External SSH servers
Connect any third-party server over SSH with auto-detection of OS, sudo and systemd — no dependency on VirtualBox.
File manager (SFTP)
Browse, download and upload files with a chunked protocol: up to 2 GB per file, 3 parallel transfers, resume after a dropped connection.
App store
Install software in one tap via apt (Linux) or Chocolatey (Windows) from a curated SystemApp catalog.
Custom scripts
Scripts with typed parameters, real-time streaming output over WebSocket.
Docker / Podman
Manage containers through the same ephemeral SSH token as scripts — the engine is auto-detected.
Cloud providers
Import and manage Timeweb and Yandex Cloud servers through a unified ManagedVmService interface.
Monitoring
CPU/RAM/disk statistics, background VM status polling every 30 seconds, metrics history.
2

Architecture

The Expo/React Native mobile app talks to a NestJS monolith backend over REST and WebSocket. All SSH operations run through one-time tokens — the server never holds decrypted passwords for longer than a single request. Full architecture breakdown →

flowchart LR
    subgraph client["Mobile client (Expo / React Native)"]
        UI["Screens (expo-router)"]
        RQ["React Query"]
        CR["Crypto Layer (Argon2id, AES-256-GCM)"]
    end

    subgraph backend["Backend (NestJS)"]
        API["REST API"]
        WS["WebSocket Gateway"]
        MODS["auth / vps / server-connection /
cloud-provider / custom-scripts"]
    end

    DB[("MySQL")]
    CACHE[("Redis / Valkey")]
    VBOX["VirtualBox"]
    SSHSRV["External SSH servers"]
    CLOUD["Timeweb / Yandex Cloud API"]

    UI --> RQ --> API
    UI --> WS
    CR -. credential encryption .-> API
    API --> MODS
    WS --> MODS
    MODS --> DB
    MODS --> CACHE
    MODS -- SSH --> VBOX
    MODS -- SSH --> SSHSRV
    MODS -- REST --> CLOUD

Overall architecture: client, NestJS API, MySQL, Redis/Valkey, SSH servers and VirtualBox

3

Security

SSH credentials never leave the device in plaintext, and every operation is confirmed with a one-time signed token. All defense layers →

On-device encryptionAES-256-GCM with an Argon2id-derived key — the server only ever sees ciphertext.
One-time SSH tokensHKDF + HMAC signature, 60-second TTL, single use.
Forward secrecyThe credentialSalt is set once at registration and never rotates.
Injection protectionA whitelist of script parameters and an SSRF filter for URL downloads.
4

Tech Stack

Mobile App
PlatformExpo SDK 54, React Native 0.81
Routingexpo-router 6 (file-based routing)
StateZustand + TanStack React Query 5
Cryptographyreact-native-quick-crypto, react-native-argon2
Storageexpo-secure-store, AsyncStorage
Backend
FrameworkNestJS 11, TypeScript
DatabaseMySQL + Prisma 6
Cache / queuesRedis (Valkey) via ioredis
SSH / SFTPssh2, ssh2-sftp-client
AuthenticationPassport JWT, Google/Yandex OAuth, MAX Bot