# Netrunner VPN Клиентское приложение VPN с stealth-протоколом (маскировка `ClientHello` под decoy-домен через SNI). Гибридный стек: React-фронтенд + Rust-бэкенд на Tauri 2, нативный VPN-движок подключается как приватный крейт по FFI (UniFFI). ## Структура репозитория | Путь | Что внутри | Документация | |---|---|---| | [`src/`](src/README.md) | React/TypeScript UI (Vite) | [src/README.md](src/README.md) | | [`src-tauri/`](src-tauri/README.md) | Rust-оболочка Tauri + нативный VPN-плагин | [src-tauri/README.md](src-tauri/README.md) | Каждая поддиректория с самостоятельной логикой имеет свой `README.md` — смотри дерево докам по ссылкам выше, дальше они ведут друг к другу. ## Технологии - **Frontend**: React 19, TypeScript, Vite, Zustand (стейт), react-i18next (RU/EN), Tailwind + shadcn/radix-ui, framer-motion. - **Backend**: Rust, Tauri 2 (десктоп: Windows/Linux/macOS, мобильный: Android/iOS). - **VPN-движок**: приватный крейт `netrunner_client` (репозиторий `netrunner-core`, отдельно от этого проекта) — подключается через UniFFI: напрямую из Rust на десктопе, через сгенерированные Kotlin-биндинги на Android. ## Сборка Команды из [`Makefile`](Makefile): ```bash make dev-linux # dev-сборка + запуск с cap_net_admin make dev-android # gradle clean + tauri android dev make build-windows # инсталлятор под Windows (NSIS/MSI, с wintun.dll) make build-android-arm64 make install # adb install собранного APK ``` Фронтенд отдельно: `pnpm dev` / `pnpm build` (см. `package.json`). ## Важные нюансы - **Windows**: `wintun.dll` бандлится в инсталлятор через `src-tauri/tauri.windows.conf.json` (`bundle.resources`) — см. [src-tauri/README.md](src-tauri/README.md#windows-tun-драйвер). - **Android**: UniFFI-биндинги и `.so`-библиотеки VPN-движка — это **гитигнорённые build-артефакты**, которые нужно вручную регенерировать при изменении UDL в `netrunner-core`. Забытая регенерация — частая причина падения мобильной сборки. Подробности: [src-tauri/src/plugins/vpn-plugin/android/README.md](src-tauri/src/plugins/vpn-plugin/android/README.md#обязательно-прочитать-до-правок). - **Список серверов** пока захардкожен на фронте (см. [src/store/README.md](src/store/README.md)), потому что бэкенд `/api/v1/nodes` ещё не отдаёт поле `sni` (decoy-хост) — логика подключения к реальному API уже написана и просто выключена флагом.