Skip to content

Releases: Leadaxe/LxBox

LxBox v1.5.0

29 Apr 22:37

Choose a tag to compare

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-box type: "naive" outbound, share-URI round-trip. 10th typed protocol in Parser v2. Cronet (with_naive_outbound) is already bundled in our libbox.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 dump button (⤴ in Debug AppBar) or GET /diag/dump:
    • A. stderr-redirect — Go panic stacktrace from libbox/sing-box; written to filesDir/stderr.log before SIGABRT, survives the process. New conditional stderr tab in Debug screen.
    • B. ApplicationExitInfo (Android 11+) — getHistoricalProcessExitReasons lazy-read in DumpBuilder. Reason + tombstone for NATIVE_CRASH or Java stacktrace for CRASH.
    • C. Persistent AppLogwarning + error levels written to filesDir/applog.txt (ring-buffer, 200 entries / 64 KB cap). Loaded on main() with fromPreviousSession=true, visually marked in UI; survives process restart.
    • D. Logcat tailRuntime.exec("logcat", "-d", "-t", 1000, "*:E") via ProcessBuilder (no READ_LOGS permission needed; logd UID-filters automatically). Catches AndroidRuntime FATAL EXCEPTION, libc/DEBUG/tombstoned, art/linker. Especially useful when AEI didn't attach trace (Samsung One UI quirk on REASON_CRASH).
  • 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/* groupGET /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 now from 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_NOTIFICATIONS on Android 13+).

🐞 Fixes

  • CHANGE_NETWORK_STATE permission for Android 9-11 (task 023) — DefaultNetworkListener on API 28-30 calls ConnectivityManager.requestNetwork(...), which requires CHANGE_NETWORK_STATE. Without it: SecurityExceptionREASON_CRASH immediately 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 is normal-level, no runtime prompt, silent migration.
  • VLESS packetEncoding allow-list (task 012) — xray-style subscriptions encode packetEncoding=none in their URIs, which produced "packet_encoding": "none" in outbound JSON; sing-box vless.NewOutbound only accepts xudp/packetaddr/omitted and called E.New("unknown packet encoding: …"), which crashed libbox via an upstream format.ToString bug. Parser now normalises on input: xudp/XUDPxudp, PacketAddrpacketaddr, none silently dropped, anything else → warning + drop.
  • Race: Libbox.newService before Libbox.setup finishes (task 027) — BoxApplication.libboxReady: CompletableDeferred<Unit> barrier; BoxVpnService serviceScope.launch waits for it before any libbox call. Bonus: libbox workingDir moved from external (getExternalFilesDir(null)) to internal (context.filesDir) — same place where SettingsStorage and 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.refreshTile and QuickShortcuts.refresh gated on API 30+ with outer try { Throwable }; all callsites in setStatus/onDestroy/initialize wrapped in runCatching. FOREGROUND_SERVICE_SPECIAL_USE permission gated to minSdkVersion="34"; typed startForeground on API 34+.

Reliability internals

  • Libbox.newService / svc.start / serviceScope.launch catch Throwable (task 016) — not just Exception; Error subclasses (OOM, NoClassDefFoundError, VerifyError) now surface through stopAndAlert(...) instead of vanishing the process.
  • /files/local Debug API alias for /files/external (legacy). Internal app-scoped storage.

⚠ Breaking

  • Tunnel sleep mode default flipped: lazynever. 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

Latest release on GitHub →

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. Permission normal-уровня, без 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-11Tile.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) собираются ...
Read more

LxBox v1.4.2

22 Apr 20:54

Choose a tag to compare

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

22 Apr 18:53

Choose a tag to compare

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 from wizard_template.json on every build. Template updates automatically propagate to every user without data migrations. Example: Russian domains direct is parametric — pick Outbound + DNS Transport (DoH/DoT/UDP) + UDP server IP (Safe/Base/Family).
  • CustomRule sealed split (spec 030 §v1.4.1, task 011) — the single class is split into CustomRuleInline / 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 local RuleSetDownloader cache 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 presetsOutboundPicker в tile работает для любого bundle'а, даже если его template использует shorthand rule.action: "reject" (Block Ads) или hardcoded rule.outbound: "<tag>" (Russia-only services). Override пишется в varsValues['outbound'] и применяется в preset_expand независимо от формы template'а. Shorthand action: "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/rules serializer переписан на sealed-dispatch: inline/srs/preset правила отдают только релевантные поля. Preset-правила теперь экспозят preset_id, vars_values, nested preset.remote_rule_sets[] с per-rule_set SRS-cache статусом (cached, path, mtime), флаг ready. Debug API честно отражает sealed-иерархию task 011.
  • SRS cache pruneRuleSetDownloader.pruneOrphans() при каждом _refreshSrsCache сметает .srs-файлы без живого референса. Orphan'ы после миграций схемы (pre-bundle → bundle) больше не копятся.
  • .онлайн (xn--80asehdb) в Russian domains direct — добавлен в inline rule_set ru-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. Красный экран заменён на компактный ErrorBoundary fallback-widget.
  • Auto-updater coverage — §027 spam-gate покрыт тестами (consecutiveFails, minRetryInterval, maxFailsPerSession, inProgress crash-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 time2h 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 consecutiveFails counter'а, размораживает подписку из 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 + SNI safe.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 / withOutbound mutators on the base class — UI can write rule.withEnabled(v) without manual pattern-matching.
  • Convenience read-only getters (domains / srsUrl / presetId / …) for code that doesn't care about the concrete subclass.
  • CustomRule.fromJson dispatches on kind; legacy target field is accepted as fallback for outbound.

🗄️ 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:

  • RuleSetDownloader gets a preset__<presetId>__<tag> namespace for preset-owned cache.
  • expandPreset checks srsPaths[tag] for remote rule_sets — hit → replace with {type: "local", path: "..."}; miss → skip rule_set + warning.
  • buildConfig pre-resolves cache paths before applyPresetBundles.

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 foundexpandPreset now drops a routing_rule whose rule_set references 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 old GestureDetector with HitTestBehavior.opaque was swallowing taps before IconButton.onPressed. Replaced with InkWell(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 (_refreshSrsCache now runs after _template is assigned, so preset lookup actually resolves).

🏷 Rename target → outbound, out → outbound

CustomRule.target is renamed ...

Read more

LxBox v1.4.0

20 Apr 21:29

Choose a tag to compare

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 rulesAppRule + SelectableRule toggles + 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.getVpnStatus pull'ит текущее состояние у native-сервиса в HomeController.init.
  • Auto-update subscriptions toggle — глобальный выключатель в App Settings → Subscriptions + дубль в SubscriptionsScreen PopupMenu (три точки). Default ON. Off → автоматические триггеры (appStart / vpnConnected / periodic / vpnStopped) скипаются; ручное ⟳ работает всегда (spec 027).
  • Clash API referencedocs/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 renameauto-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.packagesSettingsStorage._absorbLegacyAppRules подхватывает app_rules ключ при первом getCustomRules, конвертит, удаляет legacy key.
  • enabled_rules + rule_outbounds → CustomRuleRoutingScreen._migrateLegacyPresets при первой load'е (флаг presets_migrated) конвертит enabled SelectableRule'ы через selectableRuleToCustom. Fresh installs получают seed из template.selectableRules.where(r => r.defaultEnabled).

Конвертер поддерживает все формы preset'ов:

  1. rule_set:[remote SRS]kind=srs
  2. rule.rule_set:"<tag>" — разворачивает template inline rule_set в match-поля
  3. inline поля прямо в rule (включая ip_is_private, protocol) — копируются as-is

✨ Routing UI overhaul

3 табы вместо 4

Routing → Channels | Presets | Rules
  • Channels — proxy groups + route.final selector (без изменений).
  • 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-cache AppInfoCache дёргает native getAppInfo per-package, AnimatedBuilder перерисовывает строку когда ответ пришёл.
  • By routing rule card — распределение активных соединений по rule+rulePayload с процентной полоской.
  • Memory chipsing-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 ▾ прижат справа. Enum DropdownButton получил isExpanded: true.
  • Presets для URLTesturltest_interval дропдаун: 30s / 1m / 3m / 5m / 10m / 30m. urltest_tolerance: 10 / 30 / 50 / 100 / 200.
  • Interval default 1m5m — согласуется с invariant feedback_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 и триг...

Read more

LxBox v1.3.1

19 Apr 01:37

Choose a tag to compare

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-insecurenode.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: UserServersUserServer

Исторически во множественном, но всегда ровно 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

19 Apr 00:21

Choose a tag to compare

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 invariantparseUri(spec.toUri()) ≈ spec протестирован для каждого варианта.
  • XHTTP fallback через sealed TransportSpec — компилятор не даёт забыть fallback.
  • ServerList (sealed)SubscriptionServers (fetch по URL) vs UserServers (paste/file/qr/manual). Одноразовая миграция proxy_sourcesserver_lists при первом чтении.
  • Функциональный pipelineparseFromSource(source) → buildConfig(lists, settings) → BuildResult(config, validation, warnings).
  • ValidationResult с типизированными ValidationIssue: dangling outbound refs, empty urltest, invalid selector default.
  • Удалено ~2700 LOC v1node_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/_inFlight dedup-флаги, inProgress guard от двойных кликов.
  • 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-title header, имя берётся из 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 markerscripts/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

17 Apr 23:57

Choose a tag to compare

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

Defaults

  • urltest_tolerance default 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

17 Apr 18:44

Choose a tag to compare

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

16 Apr 21:35

Choose a tag to compare

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

  1. Download BoxVPN-v1.1.1.apk
  2. Install on Android device
  3. 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 для нераспознанного трафика
  • Все изменения сохраняются автоматически
Нас...
Read more