L×Box v2.24.1
Firefox and Safari fingerprints work with REALITY again, and a second form of
the AmneziaWG link stops losing the node. REALITY servers on Xray v26.9.8 and
later accept only a handshake carrying a post-quantum key share, and the
fingerprint library shipped it in Chrome profiles alone — nodes handed out with
fp=firefox or fp=safari were silently forwarded to the camouflage site while
the same link worked in other clients. The core in this release brings the
Firefox 148 and Safari 26.3 profiles, both fingerprints pass on new and old
servers alike, and the warning for them is gone. Separately, panels hand out
AmneziaWG 3.1 as a link whose body is a whole configuration file rather than the
usual key@host:port; such a link used to leave an empty source. It is now
recognised and read like a pasted file. The rest of the release is the findings
from checking 2.24.0 on a device.
Отпечатки Firefox и Safari снова работают с REALITY, а вторая форма ссылки
AmneziaWG перестала терять узел. Серверы REALITY на Xray 26.9.8 и новее
принимают только рукопожатие с постквантовым ключом обмена, а библиотека
отпечатков несла его лишь в профилях Chrome — узлы, которые панели раздают с
fp=firefox и fp=safari, молча уходили на камуфляжный сайт, хотя та же ссылка
работала в других клиентах. Ядро в этом релизе принесло профили Firefox 148 и
Safari 26.3, оба отпечатка проходят и на новых, и на старых серверах,
предупреждение для них снято. Отдельно: панели раздают AmneziaWG 3.1 ссылкой, в
теле которой лежит целый файл конфигурации, а не привычное ключ@хост:порт —
такая ссылка оставляла пустой источник. Теперь она распознаётся и читается как
вставленный файл. Остальное в релизе — находки проверки 2.24.0 на устройстве.
🇬🇧 English
🦊 REALITY: the firefox and safari fingerprints pass again (docs/spec/tasks/451, core SPEC 086 and 087)
- Was: an XTLS/REALITY server from Xray v26.9.8 onwards accepts only a
ClientHello that carries the hybridX25519MLKEM768key share before X25519.
In the fingerprint library only the Chrome presets carried it —firefoxthere
meant Firefox 120. A node whose subscription hands outfp=firefoxwas
silently forwarded to the camouflage site: no error, no traffic, while the
same node worked in Xray-based clients. The app could only warn and suggest
switching tochrome. - Now: the core carries a fork of the fingerprint library with the Firefox 148
and Safari 26.3 presets. Both fingerprints send the hybrid share and pass
against new and old servers alike; the warning for them is gone. - Unchanged: the fingerprint from the subscription still goes into the config as
it is — the app does not rewrite the source's choice. Theedge,ios,
android,360andqqfingerprints have no preset with the hybrid share
anywhere, so new Xray still rejects them and the warning for them stays. - The set is tied to the core version: on a core older than
v1.14.1-lx.3
Firefox and Safari are rejected as before.
🔗 awg:// links that carry a whole configuration file (docs/spec/tasks/450)
- Was: panels hand out AmneziaWG 3.1 as a link whose body is an encoded
wg-quickfile rather thankey@host:port. Parsing looked for a host in that
text, found no private key and dropped the node without a word — a subscription
made of one such link produced an empty source. - Now: the form is recognised and read by the same converter as a pasted
configuration file, with the AmneziaWG 2 and 3 fields, the MTU limit and key
validation. The node name comes from the part after#, and without it from
the server address. One link is one node.
🛰 Core v1.14.1-lx.3 (docs/KERNEL.md)
- The base moves to sing-box
v1.14.1, and a fourth fork submodule appears: the
fingerprint library with the Firefox 148 and Safari 26.3 presets. - A VLESS
encryptionhandshake no longer hangs forever against a node that
accepts the connection and then goes silent. - Configuration, the wire format and the Java surface are unchanged.
🐛 Fixes from checking 2.24.0 on a device (docs/spec/tasks/447)
- Workspaces: loading a slot rebuilds the config. Was: after switching slots
the VPN started with the previous slot's config — the "config is stale" mark
rested on file timestamps alone and was cleared by the first settings write
(2.23.2 behaved the same). Now: loading a slot marks the config stale
explicitly, and the home screen rebuilds it from the new slot's settings
before the VPN starts. - Rule editor: Save in the top bar validates the JSON. Was: Save in the top
bar and Save from the unsaved-changes dialog accepted an array (one rule split
into "Rule 2" and "Rule 2 #2") and invalid JSON (a rule with no body, the typed
text lost). Now: both buttons are blocked by the same check as the form
button, the text stays in the field, and the error message wraps onto several
lines instead of being cut off. - Routing: a JSON rule in the list has no outbound picker. Was: the tile
showeddirecteven for a body withaction: reject, and choosing anything
changed nothing. Now: the action is visible in the subtitle together with the
rule body, as in the editor. - Restoring a backup with Replace no longer brings back the startup
questions. Was: after Replace and a restart, "Add tile" and "Check for
updates?" appeared again. Now: the "already asked" marks stay on the device.
🪢 Tailscale
- The state directory belongs to the node (docs/spec/tasks/445).
Was: the directory was named after the node's final tag, so renaming the node
or changing the folder prefix made it enter the tailnet as a new device — with
a single-use key already spent; a deleted node left keys on disk; Workspaces
slots shared one set of directories. Now: the name is issued to the node once
and survives renaming and moving; deleting a node, a folder or a subscription
removes the directory while the core is stopped; each slot keeps its own set. - The hostname defaults to the device name (docs/spec/tasks/449).
Was: the Hostname field opened empty and Tailscale picked the name itself,
taking the system host name — the device showed up in the admin console as
node, and with several nodes asnode-1,node-2. Now: the field is
pre-filled withLxBox-<device model>; it can be edited or cleared, and an
empty field still leaves the choice to Tailscale.
🧪 Tests
- 4782 tests,
flutter analyzeclean, all five pre-flight checkers pass. - The contract corpus is in sync with the desktop launcher: the cases for the
new link form pass with no local overrides, and the REALITY fingerprint cases
follow the new norm.
🇷🇺 Русский
🦊 REALITY: отпечатки firefox и safari снова проходят (docs/spec/tasks/451, SPEC 086 и 087 ядра)
- Было: сервер XTLS/REALITY на Xray 26.9.8 и новее принимает только приветствие,
которое несёт гибридный ключ обменаX25519MLKEM768перед X25519. В библиотеке
отпечатков его несли лишь профили Chrome —firefoxтам означал Firefox 120.
Узел, который подписка раздаёт сfp=firefox, молча уходил на камуфляжный
сайт: ни ошибки, ни трафика, хотя тот же узел работал в клиентах на Xray.
Приложение могло только предупредить и посоветоватьchrome. - Стало: ядро несёт форк библиотеки отпечатков с профилями Firefox 148 и
Safari 26.3. Оба отпечатка отправляют гибридный ключ и проходят и на новых, и
на старых серверах; предупреждение для них снято. - Не меняется: отпечаток из подписки по-прежнему уходит в конфиг как есть —
приложение не переписывает выбор источника. У отпечатковedge,ios,
android,360иqqпрофиля с гибридным ключом нет нигде, поэтому новые
Xray их отвергают, и предупреждение для них остаётся. - Набор привязан к версии ядра: на ядре старше
v1.14.1-lx.3Firefox и Safari
отвергаются как прежде.
🔗 Ссылки awg:// с целым файлом конфигурации внутри (docs/spec/tasks/450)
- Было: панели раздают AmneziaWG 3.1 ссылкой, в теле которой лежит закодированный
файлwg-quick, а неключ@хост:порт. Разбор искал в этом тексте хост, не
находил приватный ключ и выбрасывал узел без единого слова — подписка из одной
такой ссылки давала пустой источник. - Стало: форма распознаётся и читается тем же конвертером, что вставленный файл
конфигурации, с полями AmneziaWG 2 и 3, ограничением MTU и проверкой ключей.
Имя узла берётся из части после#, а без неё — из адреса сервера. Одна
ссылка — один узел.
🛰 Ядро v1.14.1-lx.3 (docs/KERNEL.md)
- База переходит на sing-box
v1.14.1, и появляется четвёртый сабмодуль форка —
библиотека отпечатков с профилями Firefox 148 и Safari 26.3. - Рукопожатие VLESS с шифрованием больше не виснет бесконечно на узле, который
принимает соединение и молчит. - Конфигурация, формат на проводе и Java-поверхность не меняются.
🐛 Исправления по итогам проверки 2.24.0 на устройстве (docs/spec/tasks/447)
- Workspaces: загрузка слота пересобирает конфиг. Было: после переключения
слота VPN стартовал с конфигом прежнего слота — признак «конфиг устарел»
держался только на времени изменения файлов и гас при первой же записи
настроек (так было и в 2.23.2). Стало: загрузка слота помечает конфиг
устаревшим явно, главный экран пересобирает его из настроек нового слота до
старта VPN. - Редактор правила: Save в верхней панели проверяет JSON. Было: кнопка Save
в верхней панели и Save из диалога несохранённых правок сохраняли массив
(правило делилось на «Rule 2» и «Rule 2 #2») и невалидный JSON (правило без
тела, набранный текст терялся). Стало: обе кнопки заблокированы той же
проверкой, что кнопка формы, текст остаётся в поле; сообщение об ошибке
переносится на строки, а не обрезается. - Routing: у JSON-правила в списке нет выпадающего списка outbound. Было:
тайл показывалdirectдаже для тела сaction: reject, выбор ничего не
менял. Стало: действие видно в подписи с телом правила, как в редакторе. - Восстановление бэкапа с заменой не возвращает стартовые вопросы. Было:
после Replace и перезапуска заново всплывали «Add tile» и «Check for
updates?». Стало: отметки «уже спрашивали» остаются на устройстве.
🪢 Tailscale
- Каталог состояния держится за узлом (docs/spec/tasks/445).
Было: каталог назывался по финальному тегу узла, поэтому переименование узла
или смена префикса папки приводили к входу в tailnet новым устройством — а
одноразовый ключ уже потрачен; удалённый узел оставлял ключи на диске; слоты
Workspaces делили один набор каталогов. Стало: имя выдаётся узлу один раз и
переживает переименование и перенос; удаление узла, папки или подписки удаляет
каталог при остановленном ядре; у каждого слота свой набор. - Имя устройства в tailnet по умолчанию (docs/spec/tasks/449).
Было: поле Hostname открывалось пустым, и имя выбирал сам Tailscale — брал имя
хоста системы, отчего устройство появлялось в админке какnode, а при
нескольких узлах какnode-1,node-2. Стало: поле заполнено значением
LxBox-<модель устройства>; его можно править или стереть, и пустое поле
по-прежнему отдаёт выбор имени Tailscale.
🧪 Тесты
- 4782 теста,
flutter analyzeчист, все пять проверок pre-flight проходят. - Корпус контракта синхронизирован с десктопным лаунчером: кейсы новой формы
ссылки проходят без локальных отступлений, кейсы отпечатков REALITY — по новой
норме.
Install / Установка
adb install -r LxBox-v2.24.1-arm64-v8a.apkБез uninstall! Поверх существующей установки. Настройки и подписки сохранятся.
No uninstall needed — install over the existing one. Settings and subscriptions
are preserved.
Previous release / Предыдущий релиз: v2.24.0.