# 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
  уже написана и просто выключена флагом.
