# E5 SingBox Client Form Matrix (UI-first, VLESS baseline) Дата: 2026-03-09 Статус: active Владелец: Engineering ## 1) Что берём из твоего примера - Берём структуру "блоками", как на скрине: - базовый блок, - transport, - security, - sniffing, - advanced toggles. - Не копируем серверные поля биллинга/лимитов/истечения, потому что это не клиентский outbound. ## 2) Что исключаем (server-only) - `Email`, `Subscription`, `Total used`, `Traffic reset`, `Expire date`, `Fallbacks` (как серверный inbound list), и прочие учёт/статистика-поля. ## 3) Клиентская форма (VLESS + Reality) — целевая MVP ### 3.1 Block A: Profile | UI field | JSON path | Required | Notes | |---|---|---|---| | Profile name | `profile.name` | yes | имя карточки | | Enabled | `profile.enabled` | yes | локальный toggle | | Protocol | `outbound.type` | yes | для этого шаблона фикс `vless` | ### 3.2 Block B: Server/Auth | UI field | JSON path | Required | Notes | |---|---|---|---| | Address | `outbound.server` | yes | домен/IP | | Port | `outbound.server_port` | yes | `1..65535` | | UUID | `outbound.uuid` | yes | vless user id | | Flow | `outbound.flow` | no | напр. `xtls-rprx-vision` | | Packet encoding | `outbound.packet_encoding` | no | default `none` | ### 3.3 Block C: Transport | UI field | JSON path | Required | Notes | |---|---|---|---| | Transport type | `outbound.transport.type` | no | `tcp|ws|grpc|http|httpupgrade|quic` | | Path | `outbound.transport.path` | depends | для `ws/http/httpupgrade` | | Host/Headers | `outbound.transport.headers` | no | advanced | | Service name | `outbound.transport.service_name` | depends | для `grpc` | ### 3.4 Block D: Security | UI field | JSON path | Required | Notes | |---|---|---|---| | Security mode | `outbound.tls.enabled` + `outbound.tls.reality.enabled` | yes | `none|tls|reality` (segmented control) | | SNI | `outbound.tls.server_name` | depends | для `tls/reality` | | uTLS fingerprint | `outbound.tls.utls.fingerprint` | no | `chrome|firefox|safari|...` | | Reality public key | `outbound.tls.reality.public_key` | depends | must для reality | | Reality short id | `outbound.tls.reality.short_id` | no | обычно короткий hex | | Insecure | `outbound.tls.insecure` | no | advanced toggle | ### 3.5 Block E: Sniffing/Local inbound (опционально) | UI field | JSON path | Required | Notes | |---|---|---|---| | Sniffing enabled | `inbounds[*].sniff` | no | если используем локальный socks inbound в generated config | | Sniff override destination | `inbounds[*].sniff_override_destination` | no | advanced | ### 3.6 Block F: Advanced Dial | UI field | JSON path | Required | Notes | |---|---|---|---| | Network | `outbound.network` | no | `tcp|udp` | | Connect timeout | `outbound.connect_timeout` | no | duration | | Bind interface | `outbound.bind_interface` | no | advanced | | Routing mark | `outbound.routing_mark` | no | advanced | | Multiplex | `outbound.multiplex` | no | advanced group | | UDP over TCP | `outbound.udp_over_tcp` | no | advanced group | ## 4) Guardrails (обязательные) - `CV-001`: при `security=reality` автоматически `tls.enabled=true`, `tls.reality.enabled=true`. - `CV-002`: при `security=reality` поле `reality.public_key` обязательно. - `CV-003`: при `transport=grpc` поле `service_name` обязательно. - `CV-004`: при `transport=ws|http|httpupgrade` поле `path` обязательно. - `CV-005`: `address/port/uuid` обязательны всегда. ## 5) UI-компоновка (desktop) - Compact panel: - `Profile`, - `Server/Auth`, - `Transport`, - `Security`, - collapsed `Advanced`. - Actions: - `Preview render`, - `Validate profile`, - `Apply profile`, - `History`, - `Rollback profile`. ## 6) Расширение на другие протоколы - Сохраняем те же блоки UI, меняются только поля блока `Server/Auth` + часть `Security/Transport`. - То есть форма будет модульной, а не отдельное "окно под каждый протокол".