Releases: Leadaxe/LxBox
LxBox v1.5.0
L×Box v1.5.0
Reliability + UX + introspection iteration. Critical fix for Android 9-11 startup. Two new user-facing protocols / shortcuts. Full crash diagnostics.
Quick links:
✨ Highlights ·
🐞 Fixes ·
⚠ Breaking ·
🇷🇺 На русском
✨ Highlights
Protocols & connectivity
- NaïveProxy (§037, #2) — parser for
naive+https://URIs (DuckSoft format), generator for sing-boxtype: "naive"outbound, share-URI round-trip. 10th typed protocol in Parser v2. Cronet (with_naive_outbound) is already bundled in ourlibbox.aar, no APK-size impact. - Quick Connect: QS tile + home-screen shortcut (§032, #1) — toggle VPN without opening the app. Tile in the notification shade syncs with
BoxVpnService.currentStatus; long-press on the launcher icon → Toggle VPN. First tap briefly opens the app for the system VPN consent dialog (Android API requirement); subsequent taps go straight to the service.
Diagnostics
- Crash diagnostics (§038) — four independent post-mortem channels available through one
Share dumpbutton (⤴ in Debug AppBar) orGET /diag/dump:- A. stderr-redirect — Go panic stacktrace from libbox/sing-box; written to
filesDir/stderr.logbefore SIGABRT, survives the process. New conditionalstderrtab in Debug screen. - B. ApplicationExitInfo (Android 11+) —
getHistoricalProcessExitReasonslazy-read in DumpBuilder. Reason + tombstone for NATIVE_CRASH or Java stacktrace for CRASH. - C. Persistent AppLog —
warning+errorlevels written tofilesDir/applog.txt(ring-buffer, 200 entries / 64 KB cap). Loaded onmain()withfromPreviousSession=true, visually marked in UI; survives process restart. - D. Logcat tail —
Runtime.exec("logcat", "-d", "-t", 1000, "*:E")viaProcessBuilder(noREAD_LOGSpermission needed; logd UID-filters automatically). CatchesAndroidRuntime FATAL EXCEPTION,libc/DEBUG/tombstoned,art/linker. Especially useful when AEI didn't attach trace (Samsung One UI quirk on REASON_CRASH).
- A. stderr-redirect — Go panic stacktrace from libbox/sing-box; written to
- Debug API
/diag/*group (§031):/diag/dump,/diag/exit-info,/diag/logcat,/diag/stderr,/diag/applog. Everything available via UI is also accessible over HTTP for adb-driven flows. - Debug API
/backup/*group —GET /backup/export+POST /backup/importдля бэкапа/восстановления{config, vars, server_lists}. Без диагностического шума и без кешей; совместим с форматом/diag/dump. Опции?merge=и?rebuild=для гибкости restore. POST /action/preview-empty-state?on=true|false— UI-only override empty-state без потери данных, для скриншотов/regression-теста UX.
Home screen polish
- First-run empty-state guide (task 024) — на первом запуске (нет конфига) главный экран показывает «Add a server» с крупной круглой
+-кнопкой →SubscriptionsScreen. Никаких disabled-кнопок и догадок куда нажимать. - Tap-to-connect zone — когда серверы есть но VPN не запущен, центр экрана показывает крупную кликабельную зону «Tap to connect» (play-icon 64dp). Тап стартует VPN — равноценно нажатию Start в верхней панели.
UX & reliability (carryover from earlier dev cycles)
- Tunnel sleep mode (3-way) — Settings → Background → «Tunnel sleep mode»:
never(default; pushes/SIP stay alive at the cost of ~1–3% battery overnight),lazy(pause on deep Doze only — old default),always(pause on every screen-off, max battery). - Tabbed App Settings — three tabs: General (appearance/behaviour/subscriptions/updates), Background (battery/notifications/OEM/sleep mode), Diagnostics (permissions summary, Debug API).
- Update check on launch (§036) — daily ping to GitHub Releases; SnackBar on a newer tag with View / Not now. Manual
Check nowfrom About / Settings bypasses the cap. - Battery-optimization prompt at startup if not whitelisted (rate-limited to once per 24h).
- Notifications status indicator in Settings → Background (matters for
POST_NOTIFICATIONSon Android 13+).
🐞 Fixes
CHANGE_NETWORK_STATEpermission for Android 9-11 (task 023) —DefaultNetworkListeneron API 28-30 callsConnectivityManager.requestNetwork(...), which requiresCHANGE_NETWORK_STATE. Without it:SecurityException→REASON_CRASHimmediately after VPN consent OK on A50/A10/Y9. On API 31+ a different code path is used (registerBestMatchingNetworkCallback) which is why the regression only appeared on Android 9-11 while Android 12+ kept working. Permission isnormal-level, no runtime prompt, silent migration.- VLESS
packetEncodingallow-list (task 012) — xray-style subscriptions encodepacketEncoding=nonein their URIs, which produced"packet_encoding": "none"in outbound JSON; sing-boxvless.NewOutboundonly acceptsxudp/packetaddr/omitted and calledE.New("unknown packet encoding: …"), which crashed libbox via an upstreamformat.ToStringbug. Parser now normalises on input:xudp/XUDP→xudp,PacketAddr→packetaddr,nonesilently dropped, anything else → warning + drop. - Race:
Libbox.newServicebeforeLibbox.setupfinishes (task 027) —BoxApplication.libboxReady: CompletableDeferred<Unit>barrier;BoxVpnServiceserviceScope.launchwaits for it before any libbox call. Bonus: libboxworkingDirmoved from external (getExternalFilesDir(null)) to internal (context.filesDir) — same place whereSettingsStorageand subscriptions already live; eliminates Knox/SELinux edge cases on Samsung One UI 3.x and EMUI. - Quick Connect class-verification on Android 9-11 (task 015) —
Tile.subtitle(API 29+) extracted into a@RequiresApi(Q)helper;LxBoxTileService.refreshTileandQuickShortcuts.refreshgated on API 30+ with outertry { Throwable }; all callsites insetStatus/onDestroy/initializewrapped inrunCatching.FOREGROUND_SERVICE_SPECIAL_USEpermission gated tominSdkVersion="34"; typedstartForegroundon API 34+.
Reliability internals
Libbox.newService/svc.start/serviceScope.launchcatchThrowable(task 016) — not justException;Errorsubclasses (OOM, NoClassDefFoundError, VerifyError) now surface throughstopAndAlert(...)instead of vanishing the process./files/localDebug API alias for/files/external(legacy). Internal app-scoped storage.
⚠ Breaking
- Tunnel sleep mode default flipped:
lazy→never. Old default paused the tunnel on deep Doze, which broke long-lived TCP sockets and push notifications. New default keeps the tunnel always active (+1–3% battery overnight). Want the old behaviour — Settings → Background → Tunnel sleep mode → Lazy sleep.
📦 Install
APK is signed with the upload keystore; install over previous L×Box versions in place.
🇷🇺 L×Box v1.5.0 на русском
Релиз с критическим фиксом запуска на Android 9-11, новым 10-м протоколом (NaïveProxy), Quick Connect (плитка в шторке + ярлык на иконке), и встроенной диагностикой крашей через 4 канала + HTTP API.
Основные фиксы
- Android 9-11 / VPN не запускался (Samsung A50/A10, Huawei Y9 2018) — в манифесте не хватало
CHANGE_NETWORK_STATE, который требуетConnectivityManager.requestNetwork(...)на API 28-30. На Android 12+ используется другой код-путь, поэтому регрессия проявлялась только на 9-11. Permissionnormal-уровня, без runtime-промпта, миграция silent. - Crash при VLESS-подписке с
packetEncoding=none— парсер теперь нормализует на входе по allow-list:noneтихо дропается, неизвестные значения → warning + дроп. - Race в init libbox — добавлен барьер
libboxReady: CompletableDeferred<Unit>, VPN не стартует до готовности sing-box. Заодно libbox перенесён из external в internal storage — там же где подписки и настройки. - Quick Connect class-verification на Android 9-11 —
Tile.subtitleв@RequiresApi-helper, всё gated на API 30+; FGS_SPECIAL_USE permission гейтнутminSdkVersion="34".
Новые фичи
- NaïveProxy (§037) — Cronet TLS fingerprint,
naive+https://-URIs парсятся в подписках в типизированный outbound. Полезно когда DPI ловит uTLS-имитации. - Quick Connect (§032) — плитка в шторке + ярлык на лаунчер-иконке. Toggle VPN без открытия app'а.
- Crash diagnostics (§038) — четыре канала (stderr-redirect / ApplicationExitInfo / persistent AppLog / logcat tail) собираются ...
LxBox v1.4.2
L×Box v1.4.2
Patch-release поверх 1.4.1 — новая иконка приложения.
🎨 Design
- Новая иконка приложения — W1 "routing cross" вместо generic Flutter-иконки. Концепт — пересечение двух путей под прямым углом, формирующее стилизованную «L»; метафора маршрутизации по правилам (direct / via proxy). Читаемо в 48×48 launcher size.
- Все платформы обновлены: Android (adaptive foreground/background + themed mono для Android 13+), iOS, macOS, web favicon, Windows.
- Источники SVG хранятся в
docs/design/icon/W1_pack/для будущих ревизий. - Детали: spec 034.
🧹 Cleanup
- Удалён
docs/design/icon-exploration/— прочие отклонённые концепты (W2 Lx-monogram, W3 iso-cube + 10 черновых SVG). История в git, winner перемещён вdocs/design/icon/W1_pack/.
Всё остальное содержимое — см. RELEASE_NOTES для v1.4.1.
LxBox v1.4.1
L×Box v1.4.1
Iterative release on top of 1.4.0. Two major internal changes + reworked templated routing rules.
✨ Highlights
- Preset bundles (spec 033) —
CustomRule(kind: preset)is now a thin reference to a template preset; content is expanded fromwizard_template.jsonon every build. Template updates automatically propagate to every user without data migrations. Example:Russian domains directis parametric — pick Outbound + DNS Transport (DoH/DoT/UDP) + UDP server IP (Safe/Base/Family). CustomRulesealed split (spec 030 §v1.4.1, task 011) — the single class is split intoCustomRuleInline/CustomRuleSrs/CustomRulePreset. Exhaustive pattern-match in builder/UI, compile-time checks instead of runtime ifs. Legacy JSON reads without migrations.- SRS cache for preset bundles — bundles with a remote
rule_set(Block Ads, Russia-only services) now go through the localRuleSetDownloadercache instead of sing-box auto-download. Spec 011 invariant restored. (UI ☁ buttons are in 1.4.2.) - Rename
target → outbound,out → outbound— everywhere, matching the sing-box JSON schema and the UI label. - Universal outbound override for presets —
OutboundPickerв tile работает для любого bundle'а, даже если его template использует shorthandrule.action: "reject"(Block Ads) или hardcodedrule.outbound: "<tag>"(Russia-only services). Override пишется вvarsValues['outbound']и применяется вpreset_expandнезависимо от формы template'а. Shorthandaction: "reject"теперь означает "default", не "lock": юзер может сменить Block Ads с reject на vpn-1 и обратно. См. spec 033 §Expansion §5. - Initial insertion sort для Custom Rules — при добавлении reject-правила оно ложится в самый верх списка, direct — сразу за начальным блоком reject'ов. Proxy-правила (vpn-1, auto, прочие) — в хвост. First-match-wins sing-box-семантика соблюдается из коробки. Drag-handle остаётся свободным: юзер может переставить как хочет, автосортировка — только на вставке. См. spec 030 §Initial insertion sort.
- Debug API refresh —
/state/rulesserializer переписан на sealed-dispatch: inline/srs/preset правила отдают только релевантные поля. Preset-правила теперь экспозятpreset_id,vars_values, nestedpreset.remote_rule_sets[]с per-rule_set SRS-cache статусом (cached,path,mtime), флагready. Debug API честно отражает sealed-иерархию task 011. - SRS cache prune —
RuleSetDownloader.pruneOrphans()при каждом_refreshSrsCacheсметает.srs-файлы без живого референса. Orphan'ы после миграций схемы (pre-bundle → bundle) больше не копятся. .онлайн(xn--80asehdb) в Russian domains direct — добавлен в inline rule_setru-domainsи в DNS-правило черезyandex_doh.
🛡 Reliability & Safety
- Retry + exponential backoff для subscription fetch и rule_set download — 3 попытки (1s → 3s).
4xx— permanent (без ретраев),5xx/ timeout /SocketException— retry. Снимает львиную долю жалоб "подписка не обновляется" у юзеров с нестабильной сетью. - Top-level error boundary (
FlutterError.onError) — uncaught Flutter-ошибки попадают вAppLogи видны на Debug → Logs. Красный экран заменён на компактныйErrorBoundaryfallback-widget. - Auto-updater coverage — §027 spam-gate покрыт тестами (
consecutiveFails,minRetryInterval,maxFailsPerSession,inProgresscrash-safe reset на старте). Никаких скрытых background-refresh не добавлено.
🔐 Security
- URL masking audit — subscription URL больше не течёт в
AppLogцеликом. Везде используетсяmaskSubscriptionUrl(scheme://host/***). Полный URL доступен только в Debug API сreveal=trueпараметром. Закрыты 4 leak-сайта (hydrate-fail, inProgress-skip, shortUrl truncation,addFromInput).
🎨 UX
- Human-readable errors (
humanizeError) — все user-visible сообщения приведены к человеческому виду. Было:Exception: HTTP 503 for https://…. Стало:Server error (503) — provider is down, try later. Timeout сообщает длительность. Покрыто топ-5 сценариев: subscription fetch, rule-set download, parse, config build, VPN start. - Parse hints — когда подписка загружена, но распарсилась в 0 нод, показываем причину: HTML-страница провайдера, Clash YAML, full sing-box config, plain-text error. Юзер понимает "что именно не так", а не "unknown parse error".
- Pull-to-refresh на Subscriptions screen — стандартный Android-gesture запускает
updateAll. - Getting Started card — при пустом списке подписок показывается пояснительная карточка: как добавить URL / paste clipboard / file pick.
- Unsaved-input guard — на Add Subscription, введённый в поле текст без сохранения → back → диалог "Discard input?".
- Relative time —
2h ago / yesterday / 3d ago / 2w ago / 2mo ago / 2y agoвместо абсолютных timestamp'ов в узких местах. - Debug log search —
/logsподдерживаетq=substring search иlevel=multi-filter (level=error,warn). - Reset fail-count & retry (long-press на подписке) — ручной reset
consecutiveFailscounter'а, размораживает подписку из session-cap и сразу пытается обновить. - Share URL (masked / full) — long-press → "Share URL…" → диалог с выбором: замаскированный или полный URL (для приватной передачи).
🧪 Testing
- +97 tests (262 → 359). Новые модули покрыты полностью:
error_humanize,url_mask,parse_hints,relative_time,input_helpers,http_cache,rule_set_downloader,auto_updater,body_decoder, validator edge cases, preset-expand.
🧹 Cleanup
flutter analyze: 20 info/warning → 0.@overrideаннотации на subclass fields, удалены избыточные!.- Dispose / dead-code audit — чисто, без правок.
🔖 Preset bundles (spec 033)
Before 1.4.1, a preset was copied into CustomRule at "Add to Rules" time; template updates never reached existing rules.
Now CustomRule(kind: preset) stores only {presetId, varsValues}:
{
"id": "...", "name": "Russian domains direct",
"kind": "preset", "presetId": "ru-direct",
"varsValues": {"outbound": "direct-out", "dns_server": "yandex_doh", "dns_ip": "77.88.8.88"}
}On every build buildConfig expands via expandPreset(rule, preset):
- substitute
@var→ user values or template defaults. - rule_set / dns_rule / routing_rule / dns_servers get injected into the sing-box config.
Preset-local var types: outbound (outbound-group picker), dns_servers (picker of preset.dns_servers[].tag). WizardOption {title, value} syntax — dropdowns show human-readable titles (e.g. "77.88.8.88 · Safe").
Russian domains direct exposes 3 vars:
- Outbound (default
direct-out). - Transport (DoH/DoT/UDP, default
yandex_doh). - UDP server IP — 10 Safe/Base/Family × IPv4/IPv6 primary/alt options, used only when Transport = UDP. DoH/DoT are hardcoded to
77.88.8.88+ SNIsafe.dot.dns.yandex.net.
Existing user rules (created via + Add rule with match fields) stay as CustomRuleInline / CustomRuleSrs — spec 033 does not touch them.
🧬 Sealed CustomRule (task 011)
Previously a single class with enum discriminator, unused fields per kind, runtime ifs.
Now:
sealed class CustomRule { id, name, enabled, kind, toJson, fromJson-dispatch }
├── CustomRuleInline { domains/suffixes/keywords/cidrs/ports/packages/protocols/ipIsPrivate + outbound }
├── CustomRuleSrs { srsUrl + routing-level extra filters + outbound }
└── CustomRulePreset { presetId, varsValues } // outbound lives in varsValues['outbound']
switch (cr)in builder / UI is exhaustive-checked by the compiler.- Type-preserving
withEnabled/withName/withOutboundmutators on the base class — UI can writerule.withEnabled(v)without manual pattern-matching. - Convenience read-only getters (
domains/srsUrl/presetId/ …) for code that doesn't care about the concrete subclass. CustomRule.fromJsondispatches onkind; legacytargetfield is accepted as fallback foroutbound.
🗄️ SRS cache for preset
Spec 011 requires "sing-box never downloads — always type: local, path: <cache>". In 1.4.0-beta preset bundles with type: remote broke this — sing-box fetched rule_set files on its own at startup.
1.4.1 restores the invariant:
RuleSetDownloadergets apreset__<presetId>__<tag>namespace for preset-owned cache.expandPresetcheckssrsPaths[tag]for remote rule_sets — hit → replace with{type: "local", path: "..."}; miss → skip rule_set + warning.buildConfigpre-resolves cache paths beforeapplyPresetBundles.
UI side is in 1.4.1: preset-rules with remote rule_set'ы show the same ☁ button as srs rules in the Rules list. Tap downloads every remote rule_set of the preset into the cache. Long-press → Refresh / Clear menu. The Switch auto-downloads on toggle-on if the cache is missing and enables the rule on success. "Cached" means every remote rule_set of the preset has a local .srs file.
🛠️ Fixes (task 011 polish)
Failed to start service: rule-set not found—expandPresetnow drops arouting_rulewhoserule_setreferences a tag that was skipped (missing cache), instead of leaving a dangling reference that crashed sing-box at startup.- Preset
☁icon now reacts to tap — the oldGestureDetectorwithHitTestBehavior.opaquewas swallowing taps beforeIconButton.onPressed. Replaced withInkWell(onTap+onLongPress). - Adding a preset with remote rule_set'ами via "Add to Rules" creates it disabled (same policy as
CustomRuleSrs). Users tap ☁ to download, then flip the switch — or toggle-on triggers auto-download + enable. - On load, any rule whose SRS cache is missing is auto-disabled (
_refreshSrsCachenow runs after_templateis assigned, so preset lookup actually resolves).
🏷 Rename target → outbound, out → outbound
CustomRule.target is renamed ...
LxBox v1.4.0
L×Box v1.4.0
Android VPN client powered by sing-box.
Major release: unified routing rules model, local-only SRS, Stats tabs + Top apps, Debug API, VPN reliability overhaul, per-server detour toggles, performance pass, correctness fixes.
✨ Highlights
- Unified routing rules —
AppRule+SelectableRuletoggles +CustomRuleслиты в одинCustomRule(spec 030). Один редактор, все поля (domain/IP/port/package/protocol/private-IP/srs) в одной форме. - SRS — только локально — sing-box больше ничего не качает сам. Ручной download через ☁ в UI, никаких скрытых auto-update (spec 011).
- Presets = каталог — вкладка Presets превратилась в read-only каталог пресетов, кнопка "Copy to Rules" клонирует пресет в твой реестр.
- Reorder / context menus — правила перетаскиваются за drag-handle, long-press → Delete с подтверждением, long-press на ☁ в редакторе → Refresh SRS / Clear cached file.
- JSON preview — в редакторе правила вкладка View показывает готовый sing-box фрагмент конфига (rule_set + routing rule) + warnings.
- Stats redesign — Statistics-экран получил табы
Overview/Connections(больше не нужен отдельный navigate), карточка Top apps с иконкой + display name + packageName + byte counters, карточка By routing rule, чип sing-box memory. - Template vars UX — формы в Settings / Routing перерисованы: label сверху, описание во всю ширину, поле — тоже.
Test URL/Test interval/Tolerance (ms)получили preset-дропдауны. URLTest interval default поднят с1mдо5mпод invariant spam-avoidance. - Debug API — локальный HTTP-сервер для dev-introspection/control (spec 031):
/state,/clash/*(proxy с auto-auth),/action/*(триггеры пинга/urltest/rebuild'а),/logs,/config,/files/*,/device. Включается runtime-toggle'ом в App Settings → Developer. - Status sync on reattach — при возврате в приложение со свёрнутого/кильнутого процесса (keep-on-exit + VPN активен) UI больше не застревает в Disconnected.
BoxVpnClient.getVpnStatuspull'ит текущее состояние у native-сервиса вHomeController.init. - Auto-update subscriptions toggle — глобальный выключатель в App Settings → Subscriptions + дубль в
SubscriptionsScreenPopupMenu (три точки). Default ON. Off → автоматические триггеры (appStart / vpnConnected / periodic / vpnStopped) скипаются; ручное ⟳ работает всегда (spec 027). - Clash API reference — docs/api/clash-api-reference.md — полный разбор эндпоинтов, полей connections[].metadata, выключенных/недокументированных возможностей sing-box 1.12.12.
- Background / Battery — App Settings → Battery optimization whitelist status + App info (OEM toggles) с hint-диалогом (spec 022).
- Auto-ping after connect — через 5s после подключения VPN пингуем ноды активной группы автоматом (по умолчанию ON).
- ✨auto rename —
auto-proxy-outтег переименован в✨autoс Icons.speed в UI (единая константаkAutoOutboundTag).
🔧 Unified CustomRule model
Три параллельных механизма слиты в один. До v1.4.0:
AppRule— только per-package.SelectableRule— template пресеты, toggle'ятся в Routing → Presets.CustomRule(v1.3.x) — enum type per rule, один matcher.
Теперь один CustomRule имеет все match-поля сразу:
class CustomRule {
CustomRuleKind kind; // inline | srs
List<String> domains, domainSuffixes, domainKeywords, ipCidrs;
List<String> ports, portRanges;
List<String> packages; // package_name (AND с headless match)
List<String> protocols; // routing-rule level (tls/quic/bittorrent/…)
bool ipIsPrivate; // routing-rule level (ORed with rule_set)
String srsUrl; // kind=srs only
String target; // outbound tag OR "reject"
}Semantics per sing-box default rule formula — OR within category (domain-family, port-family), AND between categories. protocol и ip_is_private эмитятся на routing-rule level (headless rule их не поддерживает).
Один редактор с табами Params / View. Params сгруппирован: APPS (над Source) → Source (inline/srs) → MATCH / RULE-SET URL → PORT → PROTOCOL → Delete. Dirty-aware save (подсветка), unsaved back → "Discard changes?" диалог.
🔧 SRS local-only
Убран type:"remote" + update_interval:"24h" из генерации конфига. Все .srs rule_set'ы хранятся локально в $documents/rule_sets/<rule.id>.srs, эмитятся как type:"local", path:…. Скачивание — только ручное:
- Tile cloud icon — ☁ (not cached) / ✅ (cached, green) / ❌ (failed) / spinner. Tap = download/retry.
- Enable gate — switch правила disabled пока нет cached файла.
- Cleanup — Delete rule удаляет cached файл, URL change на save стирает старый кэш.
- Long-press на ☁ в editor → menu: Refresh SRS / Clear cached file.
Причина: провайдеры банят за бездумные авто-запросы, юзер должен контролировать когда что обновляется (см. invariant feedback_no_unplanned_autoupdates).
🔧 Migration (one-shot)
- AppRule → CustomRule.packages —
SettingsStorage._absorbLegacyAppRulesподхватываетapp_rulesключ при первомgetCustomRules, конвертит, удаляет legacy key. - enabled_rules + rule_outbounds → CustomRule —
RoutingScreen._migrateLegacyPresetsпри первой load'е (флагpresets_migrated) конвертит enabled SelectableRule'ы черезselectableRuleToCustom. Fresh installs получают seed изtemplate.selectableRules.where(r => r.defaultEnabled).
Конвертер поддерживает все формы preset'ов:
rule_set:[remote SRS]→kind=srsrule.rule_set:"<tag>"— разворачивает template inline rule_set в match-поля- inline поля прямо в
rule(включаяip_is_private,protocol) — копируются as-is
✨ Routing UI overhaul
3 табы вместо 4
Routing → Channels | Presets | Rules
- Channels — proxy groups +
route.finalselector (без изменений). - Presets — read-only каталог пресетов с кнопкой "Copy to Rules". Для srs-пресетов копия создаётся в disabled-состоянии (юзер должен скачать файл сначала).
- Rules — реестр
CustomRule. ReorderableListView с drag-handle слева, tile edge-to-edge, long-press → Delete, OutboundPicker inline.
Tile дизайн
┌────────────────────────────────────────────────┐
│ ║ ⬤─ Firefox RU domains ☁ ⌄ direct │
│ ║ 2 suffix · 1 app │
└────────────────────────────────────────────────┘
║— drag handle (reorder).- Switch — включатель (disabled для srs без кэша).
- Имя + summary (2 строки) — tap = edit.
- ☁ — для srs only (download status + tap = refresh).
- OutboundPicker справа — inline смена target'а без открытия editor'а.
Editor — Params / View tabs
Params — все match-поля сразу, грамматически OR/AND per sing-box формуле.
View — готовый JSON preview (rule_set + routing rule) через тот же applyCustomRules, что реально применяется при build'е конфига. Copy button + warnings (например "SRS rule X skipped: no cached file").
🔧 Background / Battery
Новая секция в App Settings:
- Battery optimization — status tile (зелёный/красный), tap открывает системную страницу battery-optimization. Fallback на direct-prompt
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSесли OEM не поддерживает primary. - App info (OEM power settings) — hint-dialog перечисляет что искать (Autostart, Background activity, Battery, Saver exceptions), потом открывает
ACTION_APPLICATION_DETAILS_SETTINGSс package URI. - Permission
REQUEST_IGNORE_BATTERY_OPTIMIZATIONSдобавлен в AndroidManifest.
🔧 Auto-ping after connect
Через 5s после перехода в connected, HomeController пингует ноды активной группы однократно. Дефолт ON. Отменяется pending timer при disconnect/revoked чтобы не стрельнуть в уже отключённом состоянии. Toggle в App Settings → Feedback.
✨ Stats redesign
StatsScreenтеперьDefaultTabController(length: 2)с вкладкамиOverview/Connections. Вкладка Connections —ConnectionsView, тот же самый компонент что раньше был отдельным экраном, теперь embeddable (без Scaffold/AppBar).- Top apps card — топ-10 приложений по суммарному трафику с иконкой + display name + packageName (монospace subtitle) +
N conns ↑↑ ↓↓. Lazy-cacheAppInfoCacheдёргает nativegetAppInfoper-package,AnimatedBuilderперерисовывает строку когда ответ пришёл. - By routing rule card — распределение активных соединений по rule+rulePayload с процентной полоской.
- Memory chip —
sing-boxрасход RAM в 4-чиповом топ-карде (из/connections.memoryполя Clash API). - Удалена dead навигация: Connections-чип больше не кликабельный (вместо этого — вкладка).
✨ Template vars UX
Формы шаблонных переменных (routing screen Auto Proxy, settings_screen core vars) перерисованы:
- Label сверху — больше нет
ListTileс label/subtitle слева и узким input'ом справа. На узких экранахTest URLраньше ломался наTest/URL(две строки), описание сжималось до 13 символов в строку. - Поле на всю ширину —
Column(crossAxisAlignment: stretch), field растягивается, suffix ▾ прижат справа. EnumDropdownButtonполучилisExpanded: true. - Presets для URLTest —
urltest_intervalдропдаун:30s / 1m / 3m / 5m / 10m / 30m.urltest_tolerance:10 / 30 / 50 / 100 / 200. - Interval default
1m→5m— согласуется с invariantfeedback_subscription_no_spam/feedback_no_unplanned_autoupdates. Юзеры без ручного override получают 5m (меньше фонового трафика).
✨ Debug API (spec 031)
Локальный HTTP-сервер, bind'ится на 127.0.0.1:9269, авторизация Bearer-токеном из App Settings → Developer. Позволяет с хоста по adb forward tcp:9269 tcp:9269 читать state и триг...
LxBox v1.3.1
L×Box v1.3.1
Android VPN client powered by sing-box.
Патч-релиз: UX полировка + критические фиксы.
🐛 Critical fixes
UserServerпосле рестарта показывал спиннер навсегда —toJsonхранил толькоrawBody,fromJsonне парсил его обратно,NodeSettingsScreen._load()видел пустойnodes→_originalTagне сетился → спиннер. ТеперьfromJsonреконструирует nodes черезparseAll(decode(rawBody)).rawBody— источник истины, nodes derivable.- Detour dropdown в Node Settings не сохранялся — писал
detourв JSON ноды, ноparseSingboxEntryэто поле не восстанавливает → на save → reparse detour терялся. Теперь persist черезentry.detourPolicy.overrideDetour(которое builder уже умеет применять), сразу при выборе в dropdown'е. - XHTTP warning перекрывался TLS-insecure —
node.warnings.firstбралось безусловно,InsecureTlsWarning(parse-time) затмевалUnsupportedTransportWarning('xhttp')(emit-time). Теперь_NodeWarningRowсортирует по severity (error → warning → info). - TLS-insecure severity → info (grey) — провайдеры часто намеренно ставят флаг (REALITY, IP-литералы, self-signed), не должен кричать. Banner вверху detail-экрана теперь считает только actionable warning'и.
✨ UI polish
NodeRow новый layout
┌────────────────────────────────────────────────────┐
│ Tag │
│ [ACTIVE✓] PROTOCOL 50MS │
└────────────────────────────────────────────────────┘
^right-aligned
- ACTIVE — зелёный pill (раньше текстовое "ACTIVE · 50MS")
- Протокол — серым:
VLESS,Hy2,WG,TUIC,SS. Дляauto-proxy-out(urltest) показывает proto выбранной ноды:→ BL: Frankfurt VLESS. TLS-суффикс убран — у большинства протоколов дефолт, метить = шум. - Ping — right-aligned, цвет по latency (
<200msзелёный,<500оранжевый,>500/err красный)
Long-press → Copy URI
Новый пункт в popup-меню — оригинальный vless:// / wireguard:// / etc через node.toUri() (round-trip parser v2). Copy server переименован в Copy server (JSON) для ясности. Для control-узлов — snackbar No source URI for this node.
NodeSettingsScreen
- Editable Tag field — отдельный TextField под Server (раньше тег правился через JSON-редактор). AppBar title обновляется live.
- Mark as detour server switch — добавляет/убирает префикс
⚙к tag'у. Хранится прямо вtag(никаких отдельных флагов в JSON), визуально выделяет detour-серверы в node list и в Override-detour picker'е.
Smart add flow
- Empty input + tap
+= paste from clipboard — если поле ввода пустое,+открывает поток paste (анализ типа + диалог подтверждения). Один тап вместо двух. - Auto-regenerate config после addFromInput — после paste/QR/file автоматом
generateConfig+saveParsedConfig+ snackbar. Раньше нужно было жать ⟳ вручную.
Subscription row subtitle
- Единообразный формат для UserServer:
<PROTOCOL> server(напримерWIREGUARD server,VLESS server). Раньше был разный текст в зависимости от формы импорта (WireGuard config/Direct link/JSON outbound) — описывало форму копипасты, не суть. После рестарта (когдаentry.statusтерялся) показывало бессмысленное "1 node" для single-node entries.
♻️ Rename: UserServers → UserServer
Исторически во множественном, но всегда ровно 1 node (paste/QR/file/manual). Переименовано в singular для ясности. Затронуто 10 файлов (1 модель, 2 контроллера, 4 экрана, 4 теста, 1 миграция). JSON discriminator 'type': 'user' сохранён — миграции не нужны.
📝 Docs
Обновлены спеки 003 (§4.1 NodeRow layout, §5 Copy URI), 006 (§2.1 subtitle, §6 paste-on-empty-+), 017 (editable Tag, Mark as detour, detour persistence через overrideDetour), 026 (§1 UserServer rename + rehydrate invariant).
📦 Install
Скачай APK ниже, установи на Android (8.0+). 128/128 тестов проходят. Release APK ~71 MB.
LxBox v1.3.0
L×Box v1.3.0
Android VPN client powered by sing-box.
Большой релиз: parser v2 переписан с нуля, автообновление подписок, AntiDPI mixed-case SNI, haptic feedback.
✨ Highlights
- Parser v2 — полностью переписан под sealed
NodeSpec, 3-слойный pipeline, 9 протоколов включая новый TUIC v5. - Автообновление подписок — 4 триггера (app start, VPN connected +2мин, каждый час, VPN stopped) с жёсткими гейтами против спама.
- Mixed-case SNI — новый AntiDPI трюк для обхода наивного exact-match DPI.
- Haptic feedback — вибро-отклик на VPN события (default on).
- Restart warning теперь sticky — не пропадает при отмене Stop-диалога.
🔧 Parser v2 (spec 026, 5 фаз)
Полная переработка внутреннего pipeline:
- Типизированная sealed-иерархия
NodeSpec— 9 протоколов: VLESS, VMess, Trojan, Shadowsocks, Hysteria2, TUIC v5 (новый), SSH, SOCKS, WireGuard. - Полиморфный
emit(vars)— WireGuard эмитится в Endpoint, остальные в Outbound, без runtime-проверок типа. Компилятор гарантирует exhaustive switch. - Round-trip invariant —
parseUri(spec.toUri()) ≈ specпротестирован для каждого варианта. - XHTTP fallback через sealed
TransportSpec— компилятор не даёт забыть fallback. ServerList(sealed) —SubscriptionServers(fetch по URL) vsUserServers(paste/file/qr/manual). Одноразовая миграцияproxy_sources→server_listsпри первом чтении.- Функциональный pipeline —
parseFromSource(source) → buildConfig(lists, settings) → BuildResult(config, validation, warnings). ValidationResultс типизированнымиValidationIssue: dangling outbound refs, empty urltest, invalid selector default.- Удалено ~2700 LOC v1 —
node_parser,config_builder,source_loader,subscription_decoder/fetcher,xray_json_parser,parsed_node,proxy_source. - 116 тестов покрывают модели, парсер, round-trip, builder, validator, migration, subscription pipeline, e2e.
🔄 Subscription auto-update (spec 027)
- 4 триггера автообновления: app start · через 2 мин после VPN connected · раз в час · сразу по VPN disconnected. Manual refresh (⟳) — пятый, force.
- Жёсткие gates против спама:
minRetryInterval=15min(persisted черезlastUpdateAttempt),maxFailsPerSession=5(in-memory, размораживается на рестарт app),perSubscriptionDelay=10s ± 2sмежду подписками,_running/_inFlightdedup-флаги,inProgressguard от двойных кликов. - Crash-safe init sweep — зависший
inProgressна диске (kill -9) сбрасывается вfailed, fetch возможен после 15-min cooldown. - UI в строках подписок —
124 nodes · 🔄 24h · 🕐 3h ago · (2 fails)с interval/ago/failcount. - Subscription block в detail screen — URL (tap=copy), Update interval picker (1/3/6/12/24/48/72/168h), Status row, Refresh now кнопка.
- Rebuild config НЕ триггерит HTTP — только локальная сборка из уже-загруженных nodes.
🛡️ AntiDPI: Mixed-case SNI (spec 028)
Новый toggle в Settings → DPI Bypass. Рандомизирует регистр букв в server_name (WwW.gOoGle.CoM). По RFC 6066 SNI case-insensitive — сервер обязан принять любой регистр; трюк ломает наивный exact-match DPI у региональных провайдеров.
- First-hop only, per-outbound независимая рандомизация, punycode-метки (
xn--…) не трогаем. - Default off. Honest help-text:
Bypasses simple exact-match DPI; ineffective against GFW-class filtering.
📳 Haptic feedback (spec 029)
Toggle в App Settings → Feedback, default on. Респектит системную настройку Android Touch feedback.
| Событие | Интенсивность |
|---|---|
| Tap Start/Stop | Лёгкий tick |
| VPN connected | Средний impact |
| User disconnect | Лёгкий impact |
| Revoked / heartbeat fail (первый только) | Тяжёлый impact |
| Manual subscription fetch success/fail | Лёгкий / средний |
Auto-триггеры (periodic update, ping, scroll) — не вибрируют. Throttle 100мс защищает от спама.
🔔 Restart warning — sticky flag
Розовая плашка «Config changed — restart VPN to apply» под Stop теперь показывается надёжно после любого сценария (Routing Apply, settings change, Debug import, manual rebuild) и не пропадает при отмене Stop-диалога.
Реализовано через derived getter _needsRestart поверх sticky-флага state.configStaleSinceStart в HomeState — сбрасывается только на реальном tunnel up↔down.
📝 Прочее
- Subscription title fallback — если нет
profile-titleheader, имя берётся изContent-Disposition: filename=...(RFC 5987 support, стрип.txt/.yaml/.json/.conf). - User-Agent для HTTP к подпискам →
LxBox Android subscription client(былSubscriptionParserClient). - DNS rules — inline
domain_suffix: [ru, xn--p1ai, su]для Yandex DoH, без промежуточного ruleset reference. - Local build marker —
scripts/build-local-apk.shсобирает APK с git describe; About screen показывает розовую плашку «🧪 LOCAL BUILD · N commits since vX.Y.Z». CI builds чистые.
📦 Install
Скачай APK ниже, установи на Android (8.0+). При первом запуске разреши VPN-permission.
128/128 тестов · debug + release APK собираются чисто (71.3 MB).
LxBox v1.2.0
L×Box v1.2.0
Android VPN client powered by sing-box.
What's New in v1.2.0
Outbound Groups Overhaul
- Renamed proxy-out → vpn-1, added vpn-3 (now VPN ①/②/③ all available)
- VPN ① is always generated — toggle is locked (required base group)
- auto-proxy-out is now controlled by an Include Auto toggle — when on, it's generated as urltest and added to
vpn-*groups; when off, no auto section is produced at all
Node List UX
- direct-out and auto-proxy-out are pinned at the top of the node list in every sort mode (direct first, then auto), with a subtle highlight so they stand out
- Long-press context menu cleaned up:
- No Copy actions for
direct-out/auto-proxy-out(they're not real servers) - Copy detour and Copy server + detour hidden when a node has no detour
- No Copy actions for
Defaults
urltest_tolerancedefault changed from 100 → 30 ms (switches faster when latency improves)
Prior highlights (v1.1.x)
- Detour server management (⚙ prefix), per-subscription register/use/override, multi-hop chains
- Smart Paste dialog (subscription URL / proxy link / WireGuard INI / JSON)
- Node Settings JSON editor
- TLS Fragment / Record Fragment DPI bypass
- WireGuard endpoint (sing-box 1.12+) with IPv6 support
- Speed Test with 10 global servers
- Animated status chip, config-dirty banner, restart-VPN banner, auto-rebuild
- SRS rule-set cloud status (green = cached, red = download error)
- Subscription HTTP headers:
subscription-userinfo,profile-title,profile-web-page-url,profile-update-interval
Install
Download app-release.apk from this release, enable "Install unknown apps" for your browser, tap the APK to install.
LxBox v1.1.2
L×Box v1.1.2
Android VPN client powered by sing-box.
What's New
Detour Server Management
- ⚙ prefix for intermediate/detour servers — clear visual distinction
- Per-subscription control: Register (show in node list), Use (enable routing), Override (replace with your server)
- Detour dropdown in node settings for building multi-hop chains
JSON Outbound Import
- Paste raw sing-box JSON outbound from clipboard
- Smart paste dialog auto-detects format (subscription URL, proxy link, WireGuard config, JSON)
- Each server as separate entry with full JSON editor
Node Settings
- Edit any server as JSON — tag, detour, all parameters
- Save button + copy button in JSON editor
- Works for both URI-parsed and JSON-imported servers
TLS Fragment (DPI Bypass)
- Fragment and Record Fragment toggles
- Applied only to first-hop outbounds
- Configurable fallback delay
WireGuard Endpoint
- Correct sing-box 1.12+ endpoint structure (not deprecated outbound)
- Auto-detect WireGuard INI config from clipboard
- IPv6 endpoint support
Speed Test
- 10 servers worldwide (Cloudflare, Hostkey 5 cities, Selectel, Tele2, OVH, ThinkBroadband)
- Per-server ping URL for accurate latency measurement
- Upload test with configurable method (PUT/POST)
UI Improvements
- Animated VPN status chip (spinning on connect)
- Config dirty indicator — rebuild button highlights when changes pending
- Auto-rebuild config option in App Settings
- Subscription detail: Nodes / Settings / Source tabs
- Source tab shows HTTP headers and raw subscription data
- Connections screen: process/app name, expanded layout
- Copy menu: server / detour / both (detour stripped from copies)
- Compact + button for adding servers
- Sections in VPN Settings
Other
- Renamed from BoxVPN to L×Box
- Free VPN dialog with checkboxes and credits
- Donate dialog (USDT ERC20/TRC20, Boosty)
- Ping concurrency reduced to 10, timeout increased to 10s
- 25 restructured feature specs
- Comprehensive protocol documentation
Install
Download LxBox-v1.1.2.apk and install on Android device.
BoxVPN v1.1.1
BoxVPN v1.1.1 — First Public Release
Date: 2026-04-16
Tag: v1.1.1
APK: BoxVPN-v1.1.1.apk
VPN Core
- sing-box native library (libbox 1.12.12) — high-performance VPN kernel
- TUN-only inbound — no SOCKS5/HTTP proxy on localhost (protects against IP leak via local port scanning)
- Start/Stop VPN with one tap
- Auto-start VPN on device boot
- Keep VPN active when app is swiped away
- Clash API on random port (49152-65535) with mandatory secret for real-time proxy management
Subscriptions
- Add subscriptions by URL or direct proxy link
- 8 protocols: VLESS, VMess, Trojan, Shadowsocks, Hysteria2, SSH, SOCKS, WireGuard
- Transport: TCP, WebSocket, gRPC, H2, REALITY, QUIC
- Formats: Base64, Xray JSON Array (with chained proxy/jump), plain text
- Enable/disable individual subscriptions without deleting them
- Auto-refresh subscriptions on VPN start (configurable interval)
- Profile title and traffic stats from HTTP headers (subscription-userinfo)
- Subscription detail: node list, traffic quota bar, expiry date, support/web links
- Offline caching: subscriptions cached on disk, work without internet
- Quick Start: built-in free VPN preset
- Telegram support links open natively
Home Screen
- Proxy group selector (proxy-out, auto-proxy-out, vpn-1, vpn-2)
- Node list sorted by Ping, A-Z, or Default order
- Active node highlighted with checkmark
- Traffic bar: upload/download speed, connection count, uptime
- Tap traffic bar to open Statistics
- Mass Ping: parallel ping all nodes (20 concurrent)
- Long press ping button for Ping Settings with URL presets (Google, Cloudflare, Apple, Firefox, Yandex)
Node Filter (auto-proxy-out)
- Full node list from proxy-out with checkboxes
- Checked nodes included in auto-proxy-out (urltest)
- Unchecked nodes excluded from auto selection but remain in manual selector
- Search, Select All / Deselect All
- Reads from config (offline, instant)
Routing
- Proxy Groups: enable/disable preset groups (Auto Proxy, Proxy, VPN 1, VPN 2)
- Routing Rules: Block Ads, Russian domains direct, Russia-only services, BitTorrent direct, Private IPs direct
- Per-rule outbound selection (direct/proxy/auto/vpn-X)
- App Groups: named groups of apps routed through chosen outbound
- App picker with icons, search, select all/invert, clipboard import/export
- Default traffic (route.final): fallback outbound for unmatched traffic
- All changes autosaved (no Apply button)
DNS Settings
- 16 DNS server presets: Cloudflare (UDP/DoT/DoH), Google (UDP/DoT/DoH), Yandex (UDP/Safe/Family/DoT/DoH), Quad9, AdGuard, via-VPN variants
- Enable/disable servers with switches
- Add custom servers via JSON editor
- DNS Strategy: prefer_ipv4 / prefer_ipv6 / ipv4_only / ipv6_only
- Independent cache toggle
- DNS Rules editor (JSON)
- DNS Final and Default Domain Resolver dropdowns from enabled servers
VPN Settings
- Log level (warn/info/debug/trace)
- Clash API address and secret (auto-generated)
- Resolve strategy, auto-detect interface, packet sniffing
- URLTest URL — endpoint for auto-proxy latency testing
- URLTest interval — how often to test (e.g. 5m)
- URLTest tolerance — minimum latency difference to switch (ms)
- TUN address, MTU, strict route, TUN stack
- All changes autosaved
Speed Test
- 4 parallel download streams (configurable: 1/4/10)
- Real-time speed updates every 500ms
- Ping: 5 measurements, trimmed mean
- 10 servers: Cloudflare, Hostkey (Moscow, Frankfurt, Amsterdam, Helsinki, New York), Selectel (RU), Tele2 (EU), OVH (France), ThinkBroadband (UK)
- Upload test with configurable method (PUT/POST) per server
- Shows current proxy or "Direct" indicator
- Session history with server name (last 10 tests)
Statistics
- Total upload/download and connection count
- Traffic by Outbound: expandable cards per proxy node
- Each connection: host:port, protocol (TCP/UDP), rule, traffic, duration, chain
- Tap Connections counter to open full connection list with close buttons
App Settings
- Theme: System / Light / Dark
- Auto-start on boot: VPN starts when device boots
- Keep VPN on exit: VPN stays active when app is swiped away
Config Editor
- View and edit raw sing-box JSON config
- Pretty-printed display
- Save, paste from clipboard, load from file
Security
- TUN-only inbound — no SOCKS5/HTTP proxy on localhost (IP leak protection)
- Clash API on random port (49152-65535) with mandatory secret
- VPN Service not exported (
android:exported="false"+BIND_VPN_SERVICE) - Geo-routing: Russian domains routed direct (not through proxy)
- Secret generated with cryptographically secure PRNG (
Random.secure()) - Config Editor accessible only from drawer (not exposed)
Architecture
- wizard_template.json — single source of truth for all defaults (DNS, ping, speed test, groups, routing rules, config skeleton)
- Autosave with 500ms debounce — no Apply buttons anywhere
- Offline-first: subscription disk cache, config generation from cache on network failure
- Flutter (Dart 3.11+), Material 3
- sing-box native library (libbox 1.12.12 via JitPack)
- Clash API for real-time proxy management
- Gradle Kotlin DSL, AGP 8.11.1, Kotlin 2.2.20, Java 17
Supported Protocols
| Protocol | URI scheme | Transport |
|---|---|---|
| VLESS | vless:// |
TCP, WebSocket, gRPC, H2, REALITY |
| VMess | vmess:// (v2rayN base64) |
TCP, WebSocket, gRPC, H2 |
| Trojan | trojan:// |
TCP, WebSocket, gRPC |
| Shadowsocks | ss:// (SIP002 + legacy) |
TCP, UDP |
| Hysteria2 | hy2:// / hysteria2:// |
QUIC |
| SSH | ssh:// |
TCP |
| SOCKS | socks:// / socks5:// |
TCP |
| WireGuard | wireguard:// |
UDP |
Install
- Download
BoxVPN-v1.1.1.apk - Install on Android device
- Allow installation from unknown sources if prompted
BoxVPN v1.1.1 — Первый публичный релиз
Дата: 16.04.2026
Тег: v1.1.1
APK: BoxVPN-v1.1.1.apk
Ядро VPN
- sing-box нативная библиотека (libbox 1.12.12) — высокопроизводительное ядро VPN
- Только TUN inbound — нет SOCKS5/HTTP прокси на localhost (защита от утечки IP через сканирование портов)
- Запуск/остановка VPN одним нажатием
- Автозапуск VPN при загрузке устройства
- VPN остаётся активным при свайпе приложения
- Clash API на рандомном порту (49152-65535) с обязательным секретом
Подписки
- Добавление подписок по URL или прямой ссылке на прокси
- 8 протоколов: VLESS, VMess, Trojan, Shadowsocks, Hysteria2, SSH, SOCKS, WireGuard
- Транспорт: TCP, WebSocket, gRPC, H2, REALITY, QUIC
- Форматы: Base64, Xray JSON Array (с поддержкой chained proxy/jump), plain text
- Включение/отключение отдельных подписок без удаления
- Автообновление подписок при запуске VPN (настраиваемый интервал)
- Имя профиля и статистика трафика из HTTP-заголовков (subscription-userinfo)
- Детальный экран: список нод, полоса квоты трафика, срок действия, ссылки на поддержку
- Офлайн-кэширование: подписки кэшируются на диск, работают без интернета
- Быстрый старт: встроенный пресет бесплатного VPN
- Ссылки на Telegram-поддержку открываются нативно
Главный экран
- Выбор группы прокси (proxy-out, auto-proxy-out, vpn-1, vpn-2)
- Список нод с сортировкой по Пингу, A-Z или по умолчанию
- Активная нода выделена галочкой
- Панель трафика: скорость загрузки/отдачи, количество соединений, аптайм
- Тап по панели трафика открывает Статистику
- Массовый пинг: параллельный пинг всех нод (20 одновременно)
- Долгое нажатие на кнопку пинга — Настройки пинга с пресетами URL (Google, Cloudflare, Apple, Firefox, Yandex)
Фильтр нод (auto-proxy-out)
- Полный список нод из proxy-out с чекбоксами
- Отмеченные ноды включены в auto-proxy-out (urltest)
- Неотмеченные ноды исключены из автовыбора, но остаются в ручном селекторе
- Поиск, Выбрать все / Снять все
- Читает из конфига (офлайн, мгновенно)
Маршрутизация
- Группы прокси: включение/отключение предустановленных групп (Auto Proxy, Proxy, VPN 1, VPN 2)
- Правила маршрутизации: Блокировка рекламы, Российские домены напрямую, Сервисы только для России, BitTorrent напрямую, Приватные IP напрямую
- Выбор outbound для каждого правила (direct/proxy/auto/vpn-X)
- Группы приложений: именованные группы приложений с маршрутизацией через выбранный outbound
- Выбор приложений с иконками, поиск, выбрать все/инвертировать, импорт/экспорт через буфер обмена
- Трафик по умолчанию (route.final): fallback outbound для нераспознанного трафика
- Все изменения сохраняются автоматически